sql左连接查询时,右表的条件应该写在WHERE后面还是ON后面

news/2024/10/7 6:46:57

在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/42849.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

使用 .NET 集成 MinIO 实现高效对象存储

引言https://min.io/在现代软件开发中,存储和管理大量的非结构化数据(如图片、视频和文档)变得越来越重要。对象存储解决方案如 Amazon S3 已成为主流,但其高昂的成本和对公有云的依赖使得很多开发者寻求开源和自托管的替代方案。MinIO 作为一款高性能的开源对象存储系统,…

R3CTF -Cry(部分)

上线看了一下题,就做了三个,还是太菜了(T~T) r0system 题目出的很抽象,就是代码长,没有啥别的考点,先创建一个账号,登录进入后修改Alice账号密码,再使用Alice登录拿到私钥就好了。 from hashlib import md5 from Crypto.Cipher import AES from Crypto.Util.number im…

后端接口性能优化分析

原文链接:https://blog.csdn.net/qq_40851232/article/details/134401234定位问题 1.慢查询日志 通常情况下,为了定位sql的性能瓶颈,我们需要开启mysql的慢查询日志。把超过指定时间的sql语句,单独记录下来,方面以后分析和定位问题。 开启慢查询日志需要重点关注三个参数:…

「笔记」递归算法复杂度分析

可恶的算法分析与设计!!!目录写在前面递归算法形式递归树大力求和主定理 Master Theorem典题1234写在最后 写在前面 可恶的算法分析与设计!!! 递归算法形式 对于一个输入规模为 \(n\) 的递归算法,每次均为将整个问题划分为 \(a\) 个规模为 \(\frac{n}{b}\) 的子问题,回…

NOIP2024模拟12:孤帆远影

这两次模拟赛都不是很专注!T1两次都G掉了!迅速调整状态,专注于自己的思考,打好草稿!NOIP2024模拟12:孤帆远影听了机房同学的讨论,于是T1死磕冒泡和逆序对做法。最后只得了40pts。 思想对了,但不是自己的做法。 还是要坚持自己想,坚持自己可以想出来,不要被任何人带偏。T1一…

mORMot and Open Source friends SynProject Tutorial (SynProject教程)

mORMot and Open Source friends SynProject Tutorial--(SynProject 教程) 第一步 本页介绍SynProject的一些典型用法。 我们将为mORMot框架本身创建一个源代码存储库和相关的文档。 您要求文档,我们将通过SynProject自动生成它! 我们需要什么 因此,我们在硬盘上的D:\Dev\Li…

计算机简史第四章 电子时代之图灵机

讲讲图灵对计算机的贡献讲讲图灵对计算机的贡献 ‍ 图灵机发明的背景 阿兰马蒂森图灵 (Alan Mathison Turing)于 1921 年出生在伦敦, 从小就表现出惊人数学和科学能力。 ​​ 艾伦麦席森图灵(Alan Mathison Turing),1912-1954,英国数学家、计算机学家、逻辑学家、密码学…

Django5的环境安装

Django是基于Python的Web框架,依赖Python环境,所以需要提前安装好Python解释器。 关于Python的安装,请参考https://www.liujiangblog.com中Python教程的相关部分,这里不再赘述。 截至2024年初,Django的最新版本为5.0,发布于2023年12月,预计2025年结束支持。 Django5.0支…