约束
-
概述
-
约束演示
-
外键约束
概念:约束是作用在表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确,有效性和完整性
-
not null 非空约束
-
unique 唯一约束
-
primary key 主键约束
- 主键是一行数据的唯一标识,要求非空且唯一
-
default 默认约束
- 默认约束,保存数据时,如果为指定该字段的值,则采用默认值
-
check 检查约束(8.0.16之后)
- 保证字段值满足某一个条件
-
foreing key 外键约束
- 用来让两张表的数据之间建立联系,保证数据的一致性和完整性
注意:约束是作用在表中字段上的,可以在创建表/修改表的时候添加约束
注:图形化界面可以直接手动添加表
外键约束
概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
语法:
# 第一种在创建表的时候,添加外键
create table 表名(
字段名 数据类型,
....
constraint 外键名 foreign key 外键字段名 references 主表(主表列名)
)
# 第二种
alter table 表名 add constraint 外键名 foreign key (外键字段名) references 主表(主表列名);
注:黄色钥匙代表主键,蓝色小钥匙代表外键
语法
# 删除外键
alter table 表名 drop foreign 外键名;
外键删除更新行为
-
no action
- 有外键,不允许删除
-
restrict
- 有外键,不允许删除
-
cascade
- 有外键,则也删除/更新 外键在子表中的记录
-
set null
- 有外键,则将子表中的外键值改为null
-
set default
-
父表更变时,子表设置为一个默认的值(Innodb不支持)
语法
alter table 表名 add constraint 外键名 foreign (外键字段) references 主表名(主表字段名) on update (上面的参数) on delete (上面的参数)
-
多表查询
-
多表关系
-
多表查询概述
-
内连接
-
外连接
-
自连接
-
子查询
-
多表查询案例
多表关系
概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系。
-
一对多,多对一
-
多对多
- 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
-
一对一
-
多用于单表的拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
-
实现:在任意一方加入外键,关联另外一方的主键,并且外键为唯一的unique
-
多表查询概述
概述:指从多张表中查询数据
笛卡尔积:两个集合,集合A和集合B 的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)
select * from emp,dept where emp.dept_id = dept.id;
多表查询分类
-
连接查询
-
内连接:交集部分的数据
-
外连接
-
左外连接:左表的所有数据,以及两种表交集部分数据
-
右外连接:右表的所有数据,以及两种表交集部分数据
-
-
自连接:当前表与自身的连接查询,自连接必须使用表别名
-
-
子查询
内连接
-
隐式内连接
-
显示内连接
语法
1. 隐式内连接
select 字段列表 from 表1,表2 where 条件...;
2.显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
外连接
-
左外连接:表1的所有数据,表1和表2交集部分的数据
左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
注:右外连接和上述语法格式一样,左外会用的更多一些
个人理解:是将左表全部打印的基础上,将左表的扩展信息也打出来(这里可能部分左表没有)
自连接
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;
个人理解:表中某一个栏目存储了与自身相关的信息,需要这个信息来查询进一步的信息
注:自连接可以用左连接来实现
联合查询 -union ,union all
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集
select 字段列表 from 表A... union [all] select 字段列表 from 表B....;
注:all删除后,会对合并后的结果进行去重
注:多张表的列数必须保持一致,字段类型也需要保持一致
子查询
概念:SQL语句中嵌套select语句,称为嵌套查询,又称子查询
分类:
-
标量子查询(子查询结果为单个值)
-
列子查询(子查询结果为一列)
-
行子查询(子查询结果为一行)
-
表子查询(子查询结果为多行多列)
根据子查询位置,分为: Where之后,from 之后,select 之后
标量子查询
子查询返回的结果是单个值(数字,字符串,日期等),最简单的形式。
常见的操作符:= > < >= <=
注:内层的查询需要带小括号
列子查询
常用操作符:in,not in, any , some ,all
-
in :在指定的集合范围之内,多选一
-
not in:不再指定的集合范围之内
-
any :子查询返回列表中,有任意一个满足即可
-
some:与any等同,使用some的地方都可以使用any
-
all:子查询返回列表的所有值都必须满足
行子查询
常用的操作符:=,<,>,in,not in