“写 SQL 查询时,你是否也曾纠结过,条件到底该放在 JOIN 上还是 WHERE 上?每次写到这里,脑海中都会浮现出这两个选项的优劣对比,就像是在选择两个看似相似却又略有不同的武器,打击目标的效率可能会因此大相径庭。那么,这两者到底有何不同?今天,我们就来一探究竟。”
甩出问题 使用连接 select bm.*,ahv.TEXT_ FROM budget_management bm LEFT JOIN act_hi_procinst ahp ON ahp.BUSINESS_KEY_= bm.id LEFT JOIN act_hi_varinst_copy1 ahv on ahv.PROC_INST_ID_ = ahp.PROC_INST_ID_ and ahv.NAME_ = 'approvalResult' and ahv.TASK_ID_ is NULL

1、明明先执行的on,为什么反而效率那么低呢
2、他们的区别在哪里
解疑之on与where的区别ON 和 WHERE 条件在 SQL 查询中有着不同的作用和行为,尤其是在涉及多表连接时。理解它们的区别对优化查询性能和获取正确的结果非常重要。
基本概念
ON 条件:
ON 条件用于连接(JOIN)操作,是在连接多个表时定义记录如何匹配的条件。它决定了哪些记录应该组合在一起,从而形成一个新的中间结果集。
ON 条件通常在 INNER JOIN、LEFT JOIN、RIGHT JOIN 等连接操作中使用。
WHERE 条件:
WHERE 条件用于对查询的结果集进行过滤,是在整个连接操作之后应用的条件。
WHERE 条件对所有已连接的表的数据进行筛选,只有满足 WHERE 条件的记录才会出现在最终结果集中。
行为区别
应用时机:
ON 条件在表连接时立即应用,它决定了哪些记录会被连接在一起,并进入下一步的处理。
WHERE 条件在连接操作之后应用,对连接后的结果集进行过滤。
影响连接方式:
在 INNER JOIN 中,ON 和 WHERE 条件的效果可能看起来类似,因为它们都会过滤出匹配的记录。但在 LEFT JOIN、RIGHT JOIN 等外连接中,ON 和 WHERE 条件的行为会明显不同。
ON 条件只影响连接匹配,但不会排除未匹配的左表(或右表)记录;而 WHERE 条件会过滤掉这些未匹配的记录。
结果集差异:
在 INNER JOIN 中:
ON 条件和 WHERE 条件可以互换,但 WHERE 条件通常是在连接之后应用,因此可能会有更直观的优化效果。
在 LEFT JOIN 中:
ON 条件用于定义连接逻辑,未匹配的左表记录仍会保留在结果集中,即使右表记录不匹配,这些记录的右表字段为 NULL。
WHERE 条件则会过滤掉不满足条件的记录,这包括那些因为 LEFT JOIN 产生的 NULL 值。如果 WHERE 条件中包含了对右表字段的条件(比如 WHERE right_table.column IS NULL),则会影响左表记录是否保留。
示例说明假设有两个表:
students(学生表):包含 student_id 和 name。
enrollments(选课表):包含 student_id 和 course_id。
1. 使用 ON 条件的 LEFT JOIN: SELECT students.name, enrollments.course_id FROM students LEFT JOIN enrollments ON students.student_id = enrollments.student_id AND enrollments.course_id = 'Math'结果:查询将返回所有学生。如果学生选修了 Math 课程,则显示 course_id 为 'Math';否则,course_id 为 NULL。未选修 Math 的学生仍会出现在结果集中。
2. 使用 WHERE 条件的 LEFT JOIN: SELECT students.name, enrollments.course_id FROM students LEFT JOIN enrollments ON students.student_id = enrollments.student_id WHERE enrollments.course_id = 'Math'结果:查询只返回那些选修了 Math 课程的学生,未选修 Math 的学生不会出现在结果集中。这是因为 WHERE 条件排除了那些 course_id 不为 'Math' 的记录,包括那些因 LEFT JOIN 产生的 NULL 记录。
关键点总结ON 条件 是定义连接逻辑的一部分,影响记录如何匹配和组合。
WHERE 条件 是对整个结果集进行的过滤,它可以过滤掉不满足条件的记录。
在外连接(如 LEFT JOIN)中,ON 和 WHERE 条件的区别尤为显著:ON 条件不会排除未匹配的左表记录,而 WHERE 条件可能会将这些记录排除在结果集之外。
理解 ON 和 WHERE 的区别,能够更好地控制 SQL 查询的行为,尤其在处理复杂连接时,选择合适的条件位置可以显著影响查询结果和性能。
重点说明is null其实是解局的关键
1、首先左连接的时候我使用了is null这样如果我表中数据is null的很多,那么这个sql的执行过程其实是很复杂的,因为is null的模糊性
2、在左连接和where中我使用了右表某一个字段为is null不管如何是影响不了左表的,因为不管右表是否存在我要的都是is null。