🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
《C语言》 | 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 | 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 | 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 | 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 | 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 | 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
🔧 关键差异详解
📌 举例说明
💡 使用建议
在 MySQL 中,JOIN ... ON子句中的多个条件和WHERE子句中的条件,虽然都用于筛选数据,但它们的执行时机和影响范围不同,这会直接导致查询结果的差异。理解这些区别对编写正确、高效的 SQL 查询至关重要。
特性 |
|
|
|---|---|---|
执行时机 | 在连接过程中执行 | 在连接完成后执行 |
主要作用 | 定义表之间的连接规则 | 对连接后产生的最终结果集进行过滤 |
对左外连接(LEFT JOIN)的影响 | 条件不满足时,仍返回左表所有记录,右表字段以 | 条件不满足时,整行记录都会被过滤掉,可能使LEFT JOIN“失效” |
对内连接(INNER JOIN)的影响 | 效果与在 | 效果与在 |
🔧 关键差异详解
核心区别在于ON条件是用来生成结果集的,而WHERE条件是用来从已生成的结果集中进行筛选的。
ON条件的作用:它决定了数据库在连接两张表时,如何从左表匹配右表的记录。特别是在LEFT JOIN中,无论ON后面的条件是否完全满足,数据库都会返回左表的所有记录。如果右表没有匹配的记录,相应字段会显示为NULL。WHERE条件的作用:它是在两张表连接完成、生成了一张临时表之后,才对这张临时表进行过滤。如果WHERE条件不满足,整行记录都会被排除在最终结果之外。
📌 举例说明
通过一个具体的例子可以更直观地理解。假设有两个表:
product(产品表)id
amount
1
100
2
200
3
300
4
400
product_details(产品详情表)id
weight
exist
2
22
0
4
44
1
5
55
0
场景一:条件放在ON子句中
SELECT * FROM product LEFT JOIN product_details ON (product.id = product_details.id AND product_details.exist = 1);查询结果:会返回product表的所有 4 条记录。对于id为 4 的产品,能匹配到exist=1的详情,所以详情字段有值。对于id为 2 的产品,虽然能匹配到详情,但exist不为 1,所以详情字段为NULL。id为 1 和 3 的产品无匹配详情,详情字段也为NULL。
product.id | amount | product_details.id | weight | exist |
|---|---|---|---|---|
1 | 100 | NULL | NULL | NULL |
2 | 200 | NULL | NULL | NULL |
3 | 300 | NULL | NULL | NULL |
4 | 400 | 4 | 44 | 1 |
场景二:条件放在WHERE子句中
SELECT * FROM product LEFT JOIN product_details ON (product.id = product_details.id) WHERE product_details.exist = 1;查询结果:只会返回 1 条记录,即同时满足id匹配和exist=1的记录。因为WHERE子句在连接后过滤掉了所有不满足product_details.exist = 1的行,包括那些右表为NULL的行。
product.id | amount | product_details.id | weight | exist |
|---|---|---|---|---|
4 | 400 | 4 | 44 | 1 |
💡 使用建议
明确你的意图
如果你想确保左表的每一条记录都出现,同时只希望在特定条件下才显示右表的字段,应将针对右表的附加条件放在
ON子句中。如果你想过滤最终的连接结果,只保留满足特定条件的行,则应使用
WHERE子句。
关于 INNER JOIN
对于
INNER JOIN,由于它只返回两个表都能匹配上的记录,因此将条件放在ON子句还是WHERE子句,最终的结果集是相同的。但从逻辑清晰性和可读性角度,通常将纯粹的连接条件(如表关联字段相等)放在ON子句,将通用的业务过滤条件放在WHERE子句。性能考量
在大多数情况下,现代的数据库查询优化器能够对
INNER JOIN的ON和WHERE条件进行相同的处理。但对于外连接(LEFT/RIGHT JOIN),由于语义不同,执行计划可能会有所不同。遵循正确的语义通常也能让优化器更好地工作。
合理地使用ON和WHERE,可以帮助你精准地控制查询结果。希望这些解释和示例对你有帮助!如果你有具体的查询场景感到困惑,欢迎提供出来,我们可以一起分析。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙