一、能够理解外键约束
作用: 一张主表的主键来约束一张从表的外键
- 主表: 约束别人
- 副表/从表: 使用别人的数据,被别人 约束
语法: constraint 外键名 foreign key(从表字段名) references 主表名(主表主键) 添加外键:
alter table 表名 add constraint 外键名 foreign key(从表字段名) references 主表名 (主表主键);
create table 表名(
字段名 字段类型 字段约束,
字段名 字段类型 字段约束,
...
constraint 外键名 foreign key(从表字段名) references 主表名(主表主键)
);
删除外键:
alter table 表名 drop foreign key 外键名;
外键级联操作:
on update cascade
on delete cascade
例子:
二、多表间关系
- 一对多: 在多的一方创建一个字段作为外键,指向一的一方的主键
- 多对多: 创建一张中间表,至少有2个字段都作为外键,分别指向各自一方的主键
- 一对一: 直接创建一张表
三、内连接查询【重点】
3.1 隐式内连接
select [字段,字段,字段][*] from 表1,表2 where 连接条件 --(外键的值等于主键的值)
select * from emp,dept where emp.dept_id = dept.id;
3.2 显示内连接
显示里面是有inner关键字的
select [字段,字段,字段][*] from a [inner] join b on 连接条件 [ where 其它条件]
select * from emp inner join dept on emp.dept_id = dept.id
select * from emp inner join dept on emp.dept_id = dept.id where emp.id = 2
select * from emp join dept on emp.dept_id = dept.id where emp.id = 2
3.3 小结
1. 内连接的特点(查的是什么东西) 内连接查询的是公共部分,满足连接条件(主外键关系)的部分
2. 使用内连接的关键点
- 使用主外键关系做为条件来去除无用信息. 抓住主外键的关系,用主外键作为连接条件 ==b表 里面的外键 = a表里面的主键==
- 显示内连接里面的,on只能用主外键关联作为条件,如果还有其它条件,后面加where
3. 语法
-- 隐式(不出现inner)
select * from a,b where a.主键=b.外键 and 其它条件
-- 显示(出现inner)
select * from a [inner] join b on a.主键=b.外键 where 其它条件
四、外连接【重点】
我们发现内连接查询出来的是公共部分. 如果要保证某张表的全部数据情况下进行连接查询. 那么就要使 用外连接查询了.
外连接分为:
- 左外连接
- 右外连接
4.1 左外连接
以join左边的表为主表,展示主表的所有数据,根据条件查询连接右边表的数据,若满足条件则展示,若不满足则以null显示.
可以理解为:在内连接的基础上保证左边表的数据全部显示
1. 语法
select [字段][*] from 左表 left join 右表 on 条件
4.2 右外连接
以join右边的表为主表,展示右边表的所有数据,根据条件查询join左边表的数据,若满足则展示,若不满足 则以null显示
可以理解为:在内连接的基础上保证右边表的数据全部显示
select 字段 from 左表 right join 右表 on 条件
4.3 内连接和外连接的区别 ?
- 内连接: 查询的是公共部分,满足连接条件的部分
- 左外连接: 以左边表为主表, 查询出左边表的所有的数据. 再通过连接条件匹配出右边表的数 据, 如果满足连接条件, 展示右边表的数据; 如果不满足, 右边的数据通过null代替
- 右外连接: 以右边表为主表, 查询出右边表的所有的数据. 再通过连接条件匹配出左边表的数 据, 如果满足连接条件, 展示左边表的数据; 如果不满足, 左边的数据通过null代替
4.4 应用
1. 用户1和订单m
查询所有的用户的订单信息 外连接
查询下单的用户的信息 内连接
2. 用户1和账户m
查询所有的用户的账户信息 外连接
查询所有用户的开户信息 内连接
五、子查询【重点】
我们刚刚讲解了内连接和外连接查询, 但是如果遇到很复杂的场景, 内连接和外连接查询可能查询不出来. 我们就可以使用子查询。
5.1 什么是子查询
直观一点: 一个查询语句里面至少包含2个select
- 一个查询语句的结果作为另一个查询语句的条件
- 有查询的嵌套,内部的查询称为子查询
- 子查询要使用括号
- 子查询结果的三种情况:
- 子查询的结果是一个值的时候
- 子查询结果是单列多行的时候
- 子查询的结果是多行多列
1.子查询的结果是一个值: 作为where条件
select ... from 表 where 字段 [><=<>...] (子查询);
2.子查询的结果是单列多行:作为where条件
select ... from 表 where 字段 in (子查询);
3.子查询的结果是多列多行:作为一张虚拟表(注意要给子查询的结果(虚拟表)取别名)
select ... from (子查询) 别名 where 条件;
select ... from 表 别名,(子查询) 别名 where 条件;
select ... from 表 别名 left join (子查询) 别名 on 条件;
select ... from 表 别名 right join (子查询) 别名 on 条件;