目录
- 表关联执行顺序 及 原理
- 第一步、做笛卡尔积
- 第二步:根据ON后的连接条件筛选笛卡尔积的结果
- 第三步:补充左表(LEFT JOIN)或右表(RIGHT JOIN)不满足连接条件的数据(INNER JOIN内关联时无此步骤)
- 第四步:根据WHERE后的过滤条件筛选第三步的结果
- 什么是笛卡尔积
- 交叉连接`CROSS JOIN`
- 内连接`INNER JOIN`
- 全外连接`FULL OUTER JOIN`
- 左外连接`LEFT OUTER JOIN`
- 右外连接`RIGHT OUTER JOIN`
- LEFT JOIN与INNER JOIN 对比下
- WHERE与ON 在 表关联中使用后的区别
- 多表连接
- 总结
本文会先讲解 表关联如何执行的,然后在后边会详细讲解 一些词汇的含义以及各种类型的表关联
表关联执行顺序 及 原理
如下代码:
SELECT * FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id # 连接条件(关联条件)
WHERE a.score > 90; # 过滤条件
第一步:参与连接的两个表做笛卡尔积;
第二步:根据ON后的连接条件筛选笛卡尔积的结果;
第三步:补充左表(LEFT JOIN)或右表(RIGHT JOIN)不满足连接条件的数据(INNER JOIN内关联时无此步骤) ;
第四步:根据WHERE后的过滤条件筛选第三步的结果;
表关联的时候,严格按照上方的 执行步骤即可。 第二步和第三步一定不能搞混
第一步、做笛卡尔积
第二步:根据ON后的连接条件筛选笛卡尔积的结果
红色⭐️代表的是筛选出来的数据
第三步:补充左表(LEFT JOIN)或右表(RIGHT JOIN)不满足连接条件的数据(INNER JOIN内关联时无此步骤)
第四步:根据WHERE后的过滤条件筛选第三步的结果
什么是笛卡尔积
交叉连接CROSS JOIN
使用CROSS JOIN实现两个集合的笛卡尔积。
内连接INNER JOIN
student表
teacher表
如何同时查询出学生编号、学生姓名、老师编号、老师姓名?
select * from student a INNER JOIN teacher b
ON a.teacher_id = b.teacher_id;
实现流程如下:
先笛卡尔集、然后根据连接条件 筛选
(红⭐️代表筛选后的数据)
筛选后数据如下:
如何返回这两张表里,老师编号不相同的记录?
select * from student a INNER JOIN teacher b
ON a.teacher_id <> b.teacher_id;
全外连接FULL OUTER JOIN
如何同时查询出学生编号、学生姓名、老师编号、老师姓名?
左外连接LEFT OUTER JOIN
OUTER
关键字可以省略
如何同时查询出学生编号、学生姓名、老师编号、老师姓名?
select * from student a LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id;
右外连接RIGHT OUTER JOIN
OUTER
关键字可以省略
如何同时查询出学生编号、学生姓名、老师编号、老师姓名?
select * from student a RIGHT JOIN teacher b
ON a.teacher_id = b.teacher_id;
LEFT JOIN与INNER JOIN 对比下
对比下 left 和 inner 查询出的数据区别
SELECT * FROM student a
INNER JOIN teacher b
ON a.teacher_id = b.teacher_id;
SELECT * FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id;
红色 ⭐️ 代表 inner查询出的数据
黄色 ⭐️ 代表 left查询出的数据
WHERE与ON 在 表关联中使用后的区别
这里需要严格按照 表关联的执行顺序走代码,那么就不会出错
对比下方 SQL跑出的数据是否一致 INNER JOIN
SELECT * FROM student a
INNER JOIN teacher b
ON a.teacher_id = b.teacher_id
AND a.score>90;
SELECT * FROM student a
INNER JOIN teacher b
ON a.teacher_id = b.teacher_id
WHERE a.score>90;
结果如下:
红色 ⭐️ 代表使用 and 查询出的数据
黄色 ⭐️ 代表 使用 where 查询出的数据
对比下方 SQL跑出的数据是否一致 LEFT JOIN
SELECT * FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id
AND a.score>90;
SELECT * FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id
WHERE a.score>90;
结果如下:
红色 ⭐️ 代表使用 and 查询出的数据
黄色 ⭐️ 代表 使用 where 查询出的数据
多表连接
SELECT a.student_id,a.student_name,
a.teacher_id,b.teacher_name,
a.class_id,c.class_name
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id
LEFT JOIN class c
ON a.class_id = c.class_id;
第一步:a表与b表做LEFT JOIN;
第二步:a表与b表LEFT JOIN的结果,再与c表做LEFT JOIN;
多表连接,就是第一张表与后面的表依次连接,重复执行表连接的步骤而已!
表关联时,首先需要确认的一点,就是关联条件字段在关联表中是不是唯一。
在绝大多数的情况下,关联条件字段都是关联表中的主键或能唯一确定一条
记录的字段。如果不是,很可能是SQL的关联条件有问题,需要仔细确认是
否与需求相符。