第6章 关联查询
6.1 什么是关联查询
关联查询是指两个或更多个表一起查询,又称为联合查询,多表查询。
6.2 关联查询结果分为几种情况

去

1、A∩B

2、A

3、A-A∩B
.b37137b51c.png)
4、B

5、B-A∩B
.34737b426b.png)
6、A∪B

7、A∪B - A∩B
-(A∩B).595e31be7a.png)
6.3 关联查询的SQL有几种情况
6.3.1 内连接(inner join)
结果:A表 ∩ B表
6.3.2 左连接(left outer join)
查询结果:
-
A表全部
-
A表- A∩B
6.3.3 右连接(right outer join)
查询结果:
-
B表全部
-
B表-A∩B
6.3.4 union(合并结果)
想要实现A∪B,以及A∪B - A∩B结果,本来应该使用full outer join(全外连接),但是mysql不支持全外连接。mysql使用union(合并)结果的方式代替全外连接。
6.4 自连接
6.5 更多表查询
6.6 关联条件与笛卡尔积
6.6.1 关联条件
通常一起查询的表之间是有关联字段,比如:员工表和部门表,这两个表依靠“部门编号”进行关联。通过关联字段,两个表的关系可以分为一对一关系、一对多关系和多对多关系。
1.一对一
该关系中第一个表中的一个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。
例如,“学生信息表”和“饭卡信息表”。“学生信息表”中的一条记录在“饭卡信息表”中只能找到唯一的一条对应记录,反过来也一样,即它们是一一对应关系。这两个表存在相同意义的“学号”字段,使它们建立了一对一关系。

2.一对多
第一个表中的一个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。
例如,“部门表”和“员工基本信息表”。“部门表”中的一条记录,在“员工基本信息表”中可以找到一条或多条记录对应,但反过来“员工基本信息表”中的一条记录在“部门表”中只能找到一条记录对应,即一个部门可以有多个员工,但是一个员工只能属于一个部门。这两个表存在相同意义的“部门编号”字段,使它们建立了一对多关系。

3.多对多
该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。通常两个表的多对多关系会借助第三张表,转换为两个一对多的关系。
例如,选课系统的“学生信息表”和“课程信息表”是多对多关系。一个学生可以选择多门课,一门课程可以被多个学生选择,即“学生信息表”中一条记录可以与“课程信息表”多条记录对应,反过来“课程信息表”的一条记录也可以与“学生信息表”中多条记录对应。它们之间借助第三张“选课信息表”实现关联关系,而“学生信息表”与“选课信息表”是一对多关系,“课程信息表”与“选课信息表”也是一对多关系。“选课信息表”中“学号”字段与“学生信息表”中“学号”字段意义相同。“课程信息表”中“课程编号”字段与“课程信息表”中“课程编号”字段意义相同。

6.6.2 笛卡尔积
注意:
- 两个表left join或right join不紧跟on关联条件直接报错。
- 都是inner join的话,关联条件可以写到on中,也可以写到where中,但是建议用on,可读性更好,where用于编写其他筛选条件。
- n表关联查询一定要有n-1个关联条件
- 两个表inner join不紧跟关联条件,或者关联条件数量不对,会产生笛卡尔积。
1、没有正确处理笛卡尔积
(1)没写关联条件

(2)少写关联条件

2、完全去除笛卡尔积

3、利用笛卡尔积
