概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
分类:
非空约束:not null
限制该字段的数据不能为null
唯一约束:unique
保证该字段的所有数据都是唯一、不重复的
主键约束:primary key(自增:auto_increment)--mysql里面
主键是一行数据的唯一标识,要求非空且唯一
默认约束:default
保存数据时,如果未指定该字段的值,则采用默认值
检查约束(8.0.16版本之后):check
保证字段值满足某一个条件
外键约束:foreign key
用来让两张表的数据之间建立连接,保证数据的一致性和完整
删除/更新行为
no action
当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与restrict一致)
restrict
当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与no action一致)
cascade
当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
set null
当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。
set default
父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)
alter table 表名 add constraint外键名称 foreign key(外键字段) references 主表名(主表字段名)on update cascade on delete cascade;
多表查询的概述:指从多张表中查询数据。
笛卡尔积:笛卡尔乘积是指在数学中,两个集合A集合和B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
连接查询-内查询
内连接查询语法:
1.隐式内连接:
select 字段列表 from 表1 ,表2 where 条件 ...;
2.显示内查询:
select 字段列表 from 表1 join 表2 on 连接条件...;
内连接查询的是两张表交集的部分
连接查询-外连接
外连接查询语法:
1.左外连接:
select 字段列表 from 表1 left join 表2 on 条件...;
相当于查询表1(左表)的所有数据包含表1和表2交集部分的数据
2.右外连接:
select 字段列表 from 表1 right join 表2 on 条件...;
相当于查询表2(右表)的所有数据包含表1和表2交集部分的数据
联合查询-union , union all
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
select 字段列表 from 表A...
union [all]
select 字段列表 from 表B...;
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union all会将全部的数据直接合并在一起,union会对合并之后的数据去重。
子查询
概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
select * from t1 where column1 = (select column1 from t2);
子查询外部的语句可以是insert / update / delete /select的任何一个。
根据子查询结果不同,分为:
标量子查询(子查询结果为单个值)
列子查询(子查询结果为一列)
行子查询(子查询结果为一行)
表子查询(子查询结果为多行多列)
标量子查询:
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。
常用的操作符:=>>=<<=
列子查询:
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:in , not in ,any , some ,all
in
在指定的集合范围之内,多选一
not in
不在指定的集合范围之内
any
子查询返回列表中,有任意一个满足即可
some
与ANY等同,使用some的地方都可以使用any
all
子查询返回列表的所有值都必须满足
行子查询:
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= 、<>、in 、not in
表子查询:
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:in