2020-8-3 postpresql的高级语法
最近几天忙着入职培训,估计这次笔记会断断续续。screw it, Just fuck!!!
PostpreSQL 约束
主要用于创建表格时(也可创建表之后修改),对表中的数据规则进行约束。如果在插入数据时违反了创建时设置的约束条件,那么此次行为将会强行终止。约束保证了数据库中数据的准确性和可靠性。
以下是postpresql中常用的约束:
- not null:不能存储为null值;
- unique:确保某列的值都是唯一的;
- primary key:主键,是not null 和unique 的结合,毕竟主键就是这么定义的;
- foreign key:外键,可使得一个表匹配到另一个表;
- check:保证列中的值符合一定的条件,比如大于0,check(salary > 0);
- exclusion:排他约束,暂时不太懂。。。
接下来创建一个表格,用到以上约束:
create table company (
id int primary key not null,
name text not null,
age int not null unique;
address varchar(40),
salary real check(salary > 0) default 2000.0,
deptno int references dept(deptno) – foreign key
);
删除约束
删除约束必须要知道约束的名称,如果不知道可用**\d + 表名**来查看约束。
PostpreSQL 连接(join)
用于将两个表或者多个表连接起来。有如下几种情况:
- cross join:交叉连接,将多个表做广义笛卡尔积,慎用,因为连接的数据有可能很多都没有实际意义;
- inner join:内连接,常用,相当于自然连接,按表之间的共同字段连接;
- left outer join:左外连接,首先进行内连接,将左表不符合条件的数据加入内连接;
- right outer join:右外连接,同理左外连接;
-
full outer join:全外连接,首先进行内连接,将左表和右表都不符合的数据加入内连接。
以下为各个连接的实例: - select * from company cross join dept;
- select * from company, dept; – 交叉连接
- select * from company c inner join dept d on c.id = d.deptno;
- select * from company c left outer join dept d on c.id = d.deptno;
- select * from company c right outer join dept d on c.id = d.deptno;
- select * from company c full outer join dept d on c.id = d.deptno;
PostpreSQL union操作符
union操作符用于合并两个或多个select语句的结果。但是用于合并的结果集必须满足:具有相同数量的列;对应列必须有相似的数据类型;列的顺序相同。
select emp_id, name, dept from company c inner join dept d on c.id = d.deptno
union
select emp_id, name, dept from company left outer join dept d on c.id = d.deptno;
union 默认将重复的行去掉,如果使得连接后的结果允许有重复行,那么将union 换成union all即可。
PostpreSQL null值
null值代表着遗漏的,未知的数据,默认某列是可以存放null值的,但是我们在创建表时可以使用not null来强制字段始终包含值,当不向该行插入数据时,系统会强制停止本次操作。注意null值和0值不是等价的,任何数值和null值进行运算、比较得出的结果还是null。
PostpreSQL 别名
总得来说和Oracle命名别名的方法一样,同样可省略as。
PostpreSQL 触发器trigger
触发器是一个与表相关联的、存储SQL语句的程序,每当一个特定的数据操作语句(insert, update, delete)在指定的表上发出时,数据库便会自动执行触发器中定义的语句。
触发器可在下面几种情况触发:
- 在执行操作之前
- 在执行操作之后
- 更新操作
触发器的类型:
- 语句级触发器:在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行;
- 行级触发器(for each row):触发语句作用的每一条记录都被触发,在行级触发器中使用old和new伪记录变量,识别值的状态。
语法:
create [or replace] trigger +触发器名
{before | after}
{delete | insert | update [of +列名]}
on 表名
[for each row [when(条件)]]
begin
语句模块
end +触发器名; --[]表示可选,{}表示必选一
create or replace trigger insertptri
after insert on person
begin
dbms_output.put_lines(‘一条记录被插入’)
end insertptri; – 创建一个触发器insertptri,当向peron表插入数据时会print(’一条记录被插入‘)
create or replace trigger valid_add_sal
before update of sal on myemp
for each row
begin
if :new.sal <= :old.sal then
raise_application_error(-20002, ‘涨后的工资不能比涨前低’);
end if;
end valid_add_sal; – 创建一个valid_add_sal触发器,当改变表myemp中sal的据时,若改后的数据不大于改前的数据,那么会报错误为’-20002’,并弹出 ‘涨后的工资不能比涨前低’。此语法参考了Oracel。