PostgreSQL基础知识--SQL 语言和高级特性

1. 创建表

create table weather (

    city varchar(80),

    temp_lo int, -- 最低温度

    temp_hi int, -- 最高温度

    prcp real, -- 湿度

    date date

);

create table cities (

    city varchar(80),

    location point

);

2. 插入数据

insert into weather values('San Francisco',46,50,0.25,'2021-04-12');

insert into cities values('San Francisco','(-194.0,53.0)');

3.表连接

3.1 内连接

select * from weather,cities where city=name;

select * from weather inner join cities on (weather.city=cities.name);

3.2 左外连接

select * from weather left outer join cities on (weather.city=cities.name);

3.3 右外连接

select * from weather right outer join cities on (weather.city=cities.name);

4. 更新数据

update weather set temp_hi = temp_hi-2, temp_lo = temp_lo-2 where date = '2021-04-12';

5. 删除数据

delete from weather where city='Hayward';

6. 创建视图

create view mytestview as select city temp_lo,temp_hi,prcp,date,location from weather,cities where city = name;

select * from mytestview;

7. 聚集函数

一个聚集函数从多个输入行中计算出一个结果,比如,count, sum, avg, max, min的函数。聚集函数可以用group by进行分组后查询。每个聚集结果都是在匹配分组条件的表行上进行计算的。可以用HAVING过滤这些被分组的行。

select city, max(temp_lo) from weather where city like 'S%' group by city;

my test

select city, max(temp_lo) from weather where city like 'S%' group by city having max(temp_lo) < 80;

my test

注意:

WHERE和HAVING的基本区别:WHERE在分组和聚集计算之前选取输入行,即,它控制哪些行进入聚集计算。而HAVING在分组和聚集之后选取分组行。因此,where子句不能包含聚集函数,HAVING子句总是包含聚集函数。

8. 外键

外键的作用是维持数据的引用完整性。关键字:references

create table working.cities (

    city varchar(80) primary key,

    location point

);

create table working.weather (

    city varchar(80) references working.cities(city),

    temp_lo int, -- 最低温度

    temp_hi int, -- 最高温度

    prcp real,-- 湿度

    date date

);

9. 事务

事务是所有数据库系统的基础概念。事务最重要的一点是它将多个步骤捆绑成了一个单一的、要么全完成要么全不完成的操作。步骤之间的中间状态对于其他并发事务是不可见的,并且如果有某些错误发生导致事务不能完成,则其中任何一个步骤都不会对数据库造成影响。

BEGIN;

    UPDATE accounts SET balance = balance - 100.00

    WHERE name = 'Alice';

-- etc etc

COMMIT;

也可以利用保存点来以更细的粒度来控制一个事务中的语句。保存点允许我们有选择性地放弃事务的一部分而提交剩下的部分。在使用SAVEPOINT定义一个保存点后,我们可以在必要时利用ROLLBACK TO回滚到该保存点。该事务中位于保存点和回滚点之间的数据库修改都会被放弃,但是早于该保存点的修改则会被保存。

BEGIN;

    UPDATE accounts SET balance = balance - 100.00

    WHERE name = 'Alice';

SAVEPOINT my_savepoint;

    UPDATE accounts SET balance = balance + 100.00

    WHERE name = 'Bob';

-- oops ... forget that and use Wally's account

ROLLBACK TO my_savepoint;

    UPDATE accounts SET balance = balance + 100.00

    WHERE name = 'Wally';

COMMIT;

--------------------------------!!!关于事务的测试未成功!!!----------------------------------------------------------

10.窗口函数

窗口函数的调用,总是包含一个窗口函数名(及其参数),后跟着一个OVER子句。这使得它从句法上和一个普通函数或非窗口函数区分开来。

原表数据:

my test

用窗口函数统计各部门的平均工资

my test

也可以通过OVER上的ORDER BY控制窗口函数处理行的顺序

my test

行的顺序不重要时ORDER BY可以忽略。PARTITION BY同样也可以被忽略,在这种情况下会产生一个包含所有行的分区。

my test

这里有一个与窗口函数相关的重要概念:对于每一行,在它的分区中的行集被称为它的窗口帧。 一些窗口函数只作用在窗口帧中的行上,而不是整个分区。默认情况下,如果使用ORDER BY,则帧包括从分区开始到当前行的所有行,以及后续任何与当前行在ORDER BY子句上相等的行。如果ORDER BY被忽略,则默认帧包含整个分区中所有的行。

my test

窗口函数只允许出现在查询的SELECT列表和ORDER BY子句中。它们不允许出现在其他地方,例如GROUP BY、HAVING和WHERE子句中。这是因为窗口函数的执行逻辑是在处理完这些子句之后。另外,窗口函数在非窗口聚集函数之后执行。这意味着可以在窗口函数的参数中包括一个聚集函数,但反过来不行

在窗口计算执行后进行过滤或者分组,可以使用子查询

my test

当一个查询涉及到多个窗口函数时,可以将每一个分别写在一个独立的OVER子句中。但如果多个函数要求同一个窗口行为时,这种做法是冗余的而且容易出错的。替代方案是,每一个窗口行为可以被放在一个命名的WINDOW子句中,然后在OVER中引用它。

my test

11. 表添加列

my test

12. 继承

继承是面向对象数据库中的概念。关键字:INHERITS

父表

my test

创建子表

my test


my test

查询父表时,会将子表中的数据也显示出来;查询子表时,不会显示父表中的数据。

查询子表

my test

查询父表

my test

也可以单独查询父表的数据-----ONLY。SELECT、UPDATE 和DELETE都支持这个ONLY记号。

my test

删除父表数据时,不加only,会把子表中符合条件的数据也删除

my test

父表

my test

子表

my test

删除时,加only,只删除主表数据

my test

父表

my test

子表

my test

 注:1.父表的检查约束和非空约束会被子表继承。其他约束(如唯一约束,主键,外键)则不会被继承。

        2.一个子表可以从多个父表继承,当同名字段出现在多个父表中(或者父表和子表中),这些字段会被融合(此时字段类型必须相同,否则会抛出一个错误)。

增加继承:

一个已经被创建的表可以增加继承关系,但是新的子表必须已经包括和父表相同名称和数据类型的列。子表还必须包括和父表相同的检查约束和检查表达式。

增加继承关系失败

my test

子表增加列后,继承关系修改成功

my test

子表

my test

新增父表

my test
my test

移除继承:

my test

父表

my test
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 简化管理&&防止数据丢失或损坏 视图 1.视图——始终如一的接口(封装表的结构细节,避免表结构随着应用的进化而改变...
    开始了是吗阅读 156评论 0 0
  • 公司决定使用PostgreSQL进行新项目的开发,所以到网上找资料学习学习。 基于两点选择: 一、它是开源的关系型...
    步入繁华阅读 298评论 0 1
  • 1、概述 目前属于Oracle,分成社区版和企业版,关系型数据库。 1.1 目录结构 bin:存储可执行文件 da...
    开发者如是说阅读 513评论 0 2
  • 3.1 介绍 我们现在将讨论一些SQL更高级的特性, 这些特性可以简化管理和避免数据的丢失或损坏。最后,我们将看看...
    马小跳_阅读 278评论 0 0
  • 事务 在PostgreSQL中,开启一个事务需要将SQL命令用BEGIN和COMMIT命令包围起来。因此我们的银行...
    huxiaofeng阅读 545评论 0 0