用两张表来解释 left join on [条件] 和where后面加条件的区别

student_info 表数据

在这里插入图片描述

student_score表数据

在这里插入图片描述

这个一张学生表,一张学生成绩表:

我们现在测试left join

SELECT
	c.number AS Cnumber,
	s.* 
FROM
	student_info s
	LEFT JOIN student_score c ON s.number = c.number

查询结果:

在这里插入图片描述

上面可以看出 使用 left join 中,on 后面的条件 不管左表有没有匹配上,都是返回主表的列数据。只不过左表返回的数据为空

再来看,在上面的sql上增加一个条件 s.is_valid = 1

SELECT
	c.number AS Cnumber,
	s.* 
FROM
	student_info s
	LEFT JOIN student_score c ON s.number = c.number AND s.is_valid = 1

在这里插入图片描述

可以看出查询的结果: 有一个 范剑同学 is_valid = 0 此时也被查询出来了。

所以我们可以得到一个结论就是:

left join on 后面加条件 and 语句来进行过滤或者是查询,无论and 后面连接的条件是 OR 主表的行还是会全部返回的。

所以如果要 筛选出 is_valid = 1 的同学,就必须要在where里面进行筛选。

SELECT
	c.number AS Cnumber,
	s.* 
FROM
	student_info s
	LEFT JOIN student_score c ON s.number = c.number 
WHERE
	s.is_valid = 1

在这里插入图片描述

可以看出 此时 is_valid = 1的同学已被筛选出来。

总结:

在使用left jion时,on和where条件的区别如下:

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录,在右表返回数据行不匹配,右表数据行会显示为NULL

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。


版权声明:本文为leeue原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/leeue/article/details/102781227