MySQL 筛选条件放 ON 后 vs 放 WHERE 后
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。 ON 决定如何 "连接" 表,WHERE 决定连接后 "显示" 哪些行。 这个根本区别导致了在 LEFT JOIN / RIGHT JOIN 外连接中,条件放置位置会产生巨大影响;而在 INNER JOIN 中,效果通常 等价。 ON 条件匹配 被驱动表 的行,生成 "临时关联结果集"。LEFT JOIN 会保留 驱动表 所有行,匹配不上的 被驱动表 字段填充为 NULL。 WHERE 会对 "临时关联结果集" 进行条件过滤,删除不满足的行。 接下来我们搞两张测试表,一目了然。 场景一:使用 INNER JOIN,查询 年龄 > 20 的用户及其订单。 写法1:条件放 ON 后
写法2:条件放 WHERE 后
两种写法的 结果一致。写法1 更高效,因少关联了 年龄 ≤ 20 的用户。 场景二:使用 LEFT JOIN,保留所有用户,同时显示 年龄 > 20 的用户及其订单(≤ 20 的用户订单显示为 NULL)。 写法1:条件放 ON 后(符合要求)
写法2:条件放 WHERE 后(跟要求不符)
写法2 将 张三 过滤了,并没有 保留所有用户。 场景三:使用 LEFT JOIN,保留所有用户,同时显示 订单金额 > 200 的订单(无符合条件订单的用户填充为 NULL)。 写法1:条件放 ON 后(符合要求)
写法2:条件放 WHERE 后(跟要求不符)
写法2 过滤了 无符合条件订单的用户。 场景二 和 场景三 其实相差不大,只是条件作用的表不一样。 ON 后面优先放 "表之间的关联键"(如 u.id = o.user_id),非关联的筛选条件(如 u.age > 20)是否放 ON 后,取决于是否要保留驱动表的行。 总结:ON 管关联,WHERE 管过滤;LEFT JOIN 用 ON 保行,INNER JOIN 用 ON 提效。 转自https://www.cnblogs.com/yanshajiuzhou/p/19328559 该文章在 2025/12/10 8:32:46 编辑过 |
关键字查询
相关文章
正在查询... |