2023-10-7:首次编辑
五、多表查询
1.多表关系
一对多(多对一)
- 实现 : 在多的一方建立外键,指向一的一方的主键
多对多
- 实现 : 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
一对一
- 实现 : 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
2.概述
多表查询就是指从多张表中查询数据
注意事项 :
- 加上条件语句,可消除无效的笛卡尔积,仅保留两表关联部分数据
3.分类
内连接
- 查询两表交集部分数据
外连接
- 左外连接 : 查询左表所有数据,以及两表交集部分数据
- 右外连接 : 查询右表所有数据,以及两表交集部分数据
自连接
- 当前表与自身的连接查询
子查询
4.内连接
#隐式内连接
select 字段列表 from 表1,表2 where 条件...;
#显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
------------------------------------------------------
#扩展:表的别名
1) table as 别名1,table as 别名2;
2) table 别名1,table 别名2;
注意事项 :
- 一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段
5.外连接
#左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
#右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件...;
注意事项 :
- 左外连接和右外连接烤鱼相互替换,仅需调整在连接查询时SQL中表结构的先后顺序
- 日常开发使用时,更偏向于左外连接
6.自连接
select 字段列表 from 表名A 别名A join 表A 别名B on 条件...;
注意事项 :
- 自连接查询,可以是内连接查询,也可以是外连接查询
- 在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底是哪一张表的字段
☯ 扩展 : 联合查询
select 字段列表 from 表A...
union [all]
select 字段列表 from 表B...;
注意事项 :
- union all会将全部的数据直接合并在一起
- union会对合并之后的数据去重
- 多条查询语句查询出来的结果中,字段数量需一致,否则会报错
7.子查询
概念 :
- SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询
insert/update/delete/select * from t1 where column1 = (select column2 from t2);
根据子查询结果不同,分为:
- 标量子查询
- 列子查询
- 行子查询
- 表子查询
根据子查询位置,分为:
- where之后
- from之后
- select之后
① 标量子查询
- 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式
- 常用的操作符:= <> > >= < <=
② 列子查询
- 子查询返回的结果是一列(可以是多行)
- 常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL
③ 行子查询
- 子查询返回的结果是一行(可以是多列)
- 常用的操作符:= 、<> 、IN 、NOT IN
④ 表子查询
- 子查询返回的结果是多行多列
- 常用的操作符:IN