多表关联时过滤条件放在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 @   相遇就是有缘  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
  1. 1 我记得 赵雷
  2. 2 北京东路的日子 汪源
  3. 3 把回忆拼好给你 王贰浪
我记得 - 赵雷
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available

点击右上角即可分享
微信分享提示