首页 > 数据库 >sql左连接查询时,右表的条件应该写在WHERE后面还是ON后面

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

时间:2024-06-10 17:11:28浏览次数:16  
标签:table2 过滤 后面 sql 子句 右表 条件 WHERE 连接

在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

标签:table2,过滤,后面,sql,子句,右表,条件,WHERE,连接
From: https://www.cnblogs.com/isme-zjh/p/18240820

相关文章

  • 如何提高MySQL DELETE 速度
    提高MySQL中DELETE操作的速度通常涉及多个方面,包括优化查询、索引、表结构、硬件和配置等。以下是一些建议,以及一些示例代码,用于帮助我们提高DELETE操作的速度。1.提高MySQLDELETE速度的方法1.1优化查询只删除必要的行:确保我们的WHERE子句是高效的,并且只选择需要删除的行。......
  • 如何提高MySQL DELETE 速度
    提高MySQL中DELETE操作的速度通常涉及多个方面,包括优化查询、索引、表结构、硬件和配置等。以下是一些建议,以及一些示例代码,用于帮助我们提高DELETE操作的速度。1.提高MySQLDELETE速度的方法1.1优化查询只删除必要的行:确保我们的WHERE子句是高效的,并且只选择需要删除的......
  • MySQL分页查询offset过大,Sql优化经验
    低性能版SELECT*FROMtablewherecondition1=0andcondition2=0andcondition3=-1andcondition4=-1orderbyidascLIMIT2000OFFSET50000当offset特别大时,这条语句的执行效率会明显减低,而且效率是随着offset的增大而降低的。原因为:MySQL并不是跳过offset......
  • C语言 & 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】
      博客主页:花果山~程序猿-CSDN博客文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长!目录一.配置开发环境 二,接口介绍1.mysql_init2.mysql_real_connect3.mysql_query4.对select结果分析......
  • MySQL 存储函数及调用
    1.mysql存储函数及调用在MySQL中,存储函数(StoredFunction)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单和高效。下面是一个具体的MySQL存储函数的示例,该函数接受一个整数......
  • MySQL逻辑备份
    目录一.mysqldump基本命令:常用选项:示例备份整个数据库 备份多个数据库 备份所有数据库 仅备份数据库结构仅备份特定表添加选项以有效处理锁表问题恢复数据库从逻辑备份文件恢复注意事项二. mysqlpumpmysqlpump 特点基本命令:常用选项:示例备份单个数据库......
  • 1900springboot VUE 生态菜园管理系统开发mysql数据库web结构java编程计算机网页源码m
    一、源码特点 springbootVUE生态菜园管理系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSPjava编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。前段主要技术vue 后端主......
  • Python程序操作MySQL数据库教程
    1.Python程序操作MySQL数据库:使用pymysql安装包使用:1.导入pysql包importpymysql2.创建连接对象调用pymysql模块中的connect()函数来创建连接对象,代码如下:连接对象说明:关闭连接conn.close()提交数据conn.commit()撤销数据conn.rollback()3.获取游标对象获取......
  • Android studio 连接sqlist数据库,账号密码错误仍能登录的原因
    昨天在写Androidstudio的大作业,写到连接sqlist数据库实现登录的时候明明账号密码都不正确,但是用户却可以登录,我原先以为是我sql语句写错了,将sql语句从Cursorcursor=db.rawQuery("select*fromuserwherenamelike?andpasswordlike?",newString[]{name,password});改......
  • [转帖]企业如何做好SQL质量的管理?
    点击标题下「蓝色微信名」可快速关注SQL操作数据库对应软件研发人员是一类基础且常见的工作内容,无论是日常的数据库应用开发,还是配合数据库产品迁移的应用改造,数据库设计和SQL的质量都是值得关注的问题。目前业界有很多提供SQL质量管理的产品,甲方也会有很多自研实现相关功......