用两张表来解释 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条件是在临时表生成好后,再对临时表进行过滤的条件。