多表关联时过滤条件放在On和Where后面的区别

演示数据库:Mysql

创建表

内连接

  1. 放在On后面
SELECT * FROM tb_singer t1 INNER JOIN tb_song t2 ON t1.id=t2.singer_id and t2.`name`='夜曲' WHERE t1.`name`='周杰伦';

  1. 放在Where后面
SELECT * FROM tb_singer t1 INNER JOIN tb_song t2 ON t1.id=t2.singer_id WHERE t1.`name`='周杰伦' and t2.`name`='夜曲'

左连接

  1. 放在On后面
SELECT * FROM tb_singer t1 LEFT JOIN tb_song t2 ON t1.id=t2.singer_id and t2.`name`='夜曲' WHERE t1.`name`='周杰伦';

  1. 放在Where后面
SELECT * FROM tb_singer t1 LEFT JOIN tb_song t2 ON t1.id=t2.singer_id WHERE t1.`name`='周杰伦' and t2.`name`='夜曲'

右连接

  1. 放在On后面
SELECT * FROM tb_song t1 RIGHT JOIN tb_singer t2 ON t1.singer_id=t2.id and t1.`name`='夜曲' WHERE t2.`name`='周杰伦';

  1. 放在Where后面
SELECT * FROM tb_song t1 RIGHT JOIN tb_singer t2 ON t1.singer_id=t2.id WHERE t2.`name`='周杰伦' and t1.`name`='夜曲';

总结

  1. 对于内连接查询,过滤条件放在On或者Where后面得到的结果是一样的。

  2. 对于左连接查询,过滤条件放在On后面,不会对左表的数据进行过滤,依然显示左表全部数据,右表不匹配则对应列显示为NULL。
    过滤条件放在Where后面,会对左表数据进行过滤。即理解为过滤条件放在On后面是先过滤后关联,过滤条件放在Where后面是先关联后过滤。

  3. 对于右连接查询,过滤条件放在On后面,不会对右表的数据进行过滤,依然显示右表全部数据,左表不匹配则对应列显示为NULL。
    过滤条件放在Where后面,会对右表数据进行过滤。即理解为过滤条件放在On后面是先过滤后关联,过滤条件放在Where后面是先关联后过滤。

posted @ 2024-11-19 11:00  相遇就是有缘  阅读(79)  评论(0)    收藏  举报