SQL语句过滤条件放在on与where子句中的区别和联系浅析

 更新时间:2022年09月18日 08:02:33   作者:楼兰胡杨  
在写SQL语句的时候,我们经常会用到各种表连接,还有各种分组聚合函数,下面这篇文章主要给大家介绍了关于SQL语句过滤条件放在on与where子句中的区别和联系,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

摘要:

介绍在多表关联SQL语句中,过滤条件放在on和where子句中的区别——inner join中没区别,外连接就不一样。

综述

蚂蚁金服的一道SQL面试题如下:SQL语句中,过滤条件放在on和where子句中的区别。当时满脑子是left join和inner join等,觉得没区别啊!细思极恐,故梳理一下。

过滤条件放在on和where中的区别

数据库在通过连接两张或多张表来查询记录时,都会先通过join on子句生成一张中间的临时表,然后再在临时表中通过where子句过滤数据并将结果集返回给用户。在使用多表关联时,on和where子句的区别如下:

1、 on子句是在生成临时表时使用的,它不管on中的条件是否为真,都会返回驱动表中的记录。右表成立就返回对应数据,不成立就赋值为null。

通俗地说 ,对于左外连接或者右外连接的驱动表来说,如果无法在被驱动表中找到匹配ON子句中的过滤条件的记录,那么该记录仍然会被加入到结果集中,对应的被驱动表记录的各个字段使用NULL值填充。

2、where子句是对已经生成的临时表进行过滤的条件,这时过滤临时表中全部条件不为真的记录。

需要注意的是内连接中的WHERE子句和ON子句是等价的。ON子句是专门为外连接驱动表中的记录在被驱动表找不到匹配记录时应不应该把该记录加入结果集这个场景提出的,所以如果把ON子句放到内连接中,MySQL会把它和WHERE子句一样对待。

在使用 INNER JOIN 时会产生一个结果集,WHERE 条件在这个结果集中再根据条件进行过滤,如果把条件都放在 ON 中,在 INNER JOIN 的时候就进行过滤了,比如

SELECT A.* FROM A
INNER JOIN B ON B.ID = A.ID AND B.State = 1 -- on子句可以写多个条件
INNER JOIN C ON B.ID = C.ID

在联查 B 表时,就过滤掉状态不等于 1 的记录,从而使得状态不等于 1 的记录就不需要去联查 C 表了,而

SELECT A.* FROM A
INNER JOIN B ON B.ID = A.ID AND B.State = 1
INNER JOIN C ON B.ID = C.ID
WHERE B.State = 1

则不管 B 的状态是否满足,都去联查 C生成临时表,最后再通过where子句将满足B 状态State = 1的记录查出来。综上所述,得出的结论就是把 过滤条件放入inner join on 比直接 where 的查询效率要高

小结

到此这篇关于SQL语句过滤条件放在on与where子句中的区别和联系的文章就介绍到这了,更多相关SQL语句过滤条件在on与where子句内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

Reference

相关文章

  • SQL Server字符串切割函数

    SQL Server字符串切割函数

    创建用户定义函数,它是返回值的已保存的 Transact-SQL 例程。用户定义函数不能用于执行一组修改全局数据库状态的操作。与系统函数一样,用户定义函数可以从查询中唤醒调用。也可以像存储过程一样,通过 EXECUTE 语句执行
    2012-07-07
  • SQLSERVER语句的执行时间显示的统计结果是什么意思

    SQLSERVER语句的执行时间显示的统计结果是什么意思

    在SQL语句调优的时候,大部分都会查看语句执行时间,究竟SQLSERVER显示出来的统计结果是什么意思,接下来为您一一解释,感兴趣的朋友可以了解下
    2013-01-01
  • SQL点滴24 监测表的变化

    SQL点滴24 监测表的变化

    在网上看到一篇关于监测表中的插入,更新,删除的方法,使用触发器实现的,很有价值。
    2011-09-09
  • SQL Server 高性能写入的一些经验总结

    SQL Server 高性能写入的一些经验总结

    本篇博文将针对一些常用的数据库性能调休方法进行介绍,而且,为了编写高效的SQL代码,我们需要掌握一些基本代码优化的技巧,所以,我们将从一些基本优化技巧进行介绍
    2012-08-08
  • SQL Server比较常见数据类型详解

    SQL Server比较常见数据类型详解

    大家都知道在计算机中数据有两种特征,一种是类型另外一种是长度。顾名思义所谓数据类型就是以数据的表现方式和存储方式来划分的数据种类。
    2015-10-10
  • sql server的一个有趣的bit位运算分享

    sql server的一个有趣的bit位运算分享

    sql server中没有bool类型,而是用bit类型来表示bool值,估计是为了节省存储空间,下面为大家介绍下这个有趣的bit位运算,感兴趣的朋友可以参考下
    2013-09-09
  • sql脚本查询数据库表,数据,结构,约束等操作的方法

    sql脚本查询数据库表,数据,结构,约束等操作的方法

    本文介绍了“sql脚本查询数据库表,数据,结构,约束等操作的方法”,需要的朋友可以参考一下
    2013-03-03
  • SQL SERVER 的SQL语句优化方式小结

    SQL SERVER 的SQL语句优化方式小结

    千辛万苦,终于把数据库服务器的CPU从超过50%(开5个程序线程)乃至100%(开10个程序线程)降低到了5%。摸索到了一些门道,总结一下
    2009-08-08
  • SQL Server数据库中的表名称、字段比较

    SQL Server数据库中的表名称、字段比较

    这篇文章主要给大家介绍了关于SQl Server数据库中表名称、字段比较的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL Server具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • oracle 重置序列从指定数字开始的方法详解

    oracle 重置序列从指定数字开始的方法详解

    本文将详细介绍oracle 重置序列从指定数字开始的方法,有需求的朋友可以参考
    2012-11-11

最新评论

?


http://www.vxiaotou.com