sql左连接查询时,右表的条件应该写在WHERE后面还是ON后面
在SQL的左连接查询(LEFT JOIN)中,右表的条件应尽量写在ON子句后面。这是因为:
- ON子句:用于定义两个表之间的连接条件,决定了哪些行会从右表中选择出来与左表进行匹配。
- WHERE子句:用于过滤整个结果集,在连接操作完成之后应用。
如果将针对右表的过滤条件放在WHERE子句而不是ON子句中,可能出现以下问题:
转换为内连接效果:
当右表的过滤条件放在WHERE子句时,对于那些原本应该通过左连接保留的左表记录,即使它们在右表中没有匹配项,但若这些记录不满足右表的WHERE条件,也会被排除在结果集之外。这样,左连接的结果可能会变为类似内连接的效果,即只返回左右表同时满足条件的记录。
数据完整性问题:
左连接的目标是返回左表的所有记录,并且包含与右表匹配的数据(如果有)。当右表的条件放在 WHERE子句时,可能会影响到左表数据的完整性,导致部分左表数据因为关联不到满足条件的右表数据而丢失。
例如,假设有一个左连接查询:
SELECT * FROM table1 LEFT JOIN table2 ON table1.key = table2.key WHERE table2.condition = 'value';
在这种情况下,如果table1有某些记录其key在table2中不存在或者对应的table2记录不满足condition = 'value'
,那么这些table1的记录也将不会出现在结果集中,尽管使用的是左连接。
正确做法是把右表的条件移到ON
子句中:
SELECT * FROM table1 LEFT JOIN table2 ON table1.key = table2.key AND table2.condition = 'value';
这样,无论table2是否有满足条件的记录,table1的所有记录都会保留在结果集中,同时只有符合条件的table2记录才会与其关联。
mysql左连接and条件_SQL中左连接on and条件和where条件执行先后顺序
执行顺序:先执行on and条件,再执行where条件 具体是:首先根据on and条件过滤出满足条件的右侧表记录,然后根据关联字段,左侧表再与过滤出的右侧表记录进行连接, 满足关联字段相等,则返回左侧表和右侧表字段信息;若不满足,则返回左侧表字段信息,右侧表字段则显示NULL。 连接出的结果则存入临时表中。最后where条件是对临时表中的数据进行过滤。 左连接:Left join,以左侧表为主,不管on条件是否满足条件,左侧表的所有记录都会返回。 换句说:on and后面的条件对左侧表没有过滤作用,即使加上对左侧表的过滤,也不起作用。 on后面的条件对右侧表的过滤起作用。where条件则对左连接后的临时表数据进行筛选。 以例子说明: select * from A left join B on A.ID = B.ID and B.NAME = '连接' and A.NAME = ‘左连接’ where NAME = '左连接' on and后面的条件:B.NAME对B表有过滤作用,A.NAME对A表不起过滤作用 where后面的条件:则是对左连接出的临时表数据进行过滤 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/weixin_35261775/article/details/113301871
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:
https://blog.csdn.net/qq_59317626/article/details/135994973
执行顺序 https://blog.csdn.net/weixin_35261775/article/details/113301871
查询例子:https://blog.csdn.net/qq_41482600/article/details/130526121
您的资助是我最大的动力!
金额随意,欢迎来赏!