返回顶部

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

posted @ 2024-06-10 16:58  fen斗  阅读(41)  评论(0编辑  收藏  举报