left join on 后and 和 where 的区别
俩者放置相同条件,但是结果集不同,就是由于优先级不同,on的优先级高于where的。
首先得明确俩个概念
- 使用 left join 会返回左表中所有的数据,及时右表中没有匹配的行。
- 俩个表关联查询时,首先生成一张临时表,然后再将这张临时表返回。
俩者的区别
- and 是在生成临时表时候起作用的,不管条件是否成立,都会返回左表中的全部数据。
- where 是在生成临时表之后起作用的,那么就会对临时表中的数据过滤。
案例
创建表1 teacher 和表2 student 如下图
SELECT * from teacher t LEFT JOIN student s ON t.id = s.teacher_id and s.`name` = '韩信';
SELECT * from teacher t LEFT JOIN student s ON t.id = s.teacher_id WHERE s.`name` = '韩信';
第一条语句结果集:
第二条语句结果集:
第一条语句执行的时候 (t.id = s.teacher_id and s.name
= '韩信' )是一个整体 ,找到 student 表中符合的行于teacher 表中匹配 , 及时teacher 中有不符合的数据也会生成临时表返回。
第二条语句执行的时候 先执行了 (t.id = s.teacher_id) 生成临时表返回,然后where 条件过滤,所以存在丢失teacher 中的数据。
结论
- 如果左标中的数据全部返回 left join 后要用 and。
- where 会对左表中的数据过滤会丢失。
- t.id = s.teacher_id and s.
name
= '韩信' )是一个整体,这样就很好理解俩者的区别。