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

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

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

在多表连接查询语法中,最令人迷惑的非on和where这两个筛选器的区别莫属了。在编写查询SQL脚本的时候,筛选条件无论是放在on子句还是where子句,查询到的结果集总是一模一样的,既然如此,为什么还要让sql查询支持两种筛选器呢?这不是多此一举吗?其实,这两种筛选器在 执行效率方面存在差异,只是如果不深度挖掘不容易发现罢了。

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

1、 on子句是在生成临时表时使用的。它不管on中的条件是否为真,都会返回驱动表中的记录;被驱动表成立就返回对应数据,不成立就赋值为null。
通俗地说 ,对于左外连接(left join)或者右外连接(right join)的驱动表来说,如果无法在被驱动表中找到匹配 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
INNER JOIN C ON B.ID = C.ID
WHERE B.State = 1

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

以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作具有一定的参考和学习价值;如果有疑问,大家可以在评论区留言交流,也希望大家多多点赞关注。谢谢大家对楼兰胡杨的支持!

Original: https://www.cnblogs.com/east7/p/16703734.html
Author: 楼兰胡杨
Title: SQL语句中过滤条件放在on和where子句中的区别和联系

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/802458/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python安装包下载及安装(超详细)

    安装python首先我们要先下载python的安装包,这里给了大家两个下载方式,第一种是官方下载 进入选择版本界面 CTRL+F搜索,搜索版本 然后返回浏览器,选择相应版本下载即可…

    Python 2023年8月1日
    067
  • 偷偷用 Python 写了个摸鱼监控进程

    Original: https://www.cnblogs.com/123456feng/p/16117344.htmlAuthor: 蚂蚁ailingTitle: 偷偷用 Pyt…

    Python 2023年11月9日
    046
  • 安装Paddle,PaddleX环境

    一、安装paddle 创建conda虚拟环境 conda create -n PaddleEnv python=3.7 activate PaddleEnv 安装paddle py…

    Python 2023年8月10日
    075
  • 引擎之旅 Chapter.4 日志系统

    关于近段时间为何没有更新的解释:Find a new job. 一般来说,一个优质的商业级别的游戏本质上就是一个复杂庞大的软件系统。在庞大系统的开发过程中难免会出现错误。为了排查错…

    Python 2023年10月20日
    026
  • python pip快速导入/导出环境

    一、应用场景 当我们挪用别人的项目、换一台设备重新部署项目时,需要把原本项目使用到的包记录下来并在新的环境中安装对应的包,并且包的版本要一致,避免版本冲突。这时我们可以使用pip的…

    Python 2023年8月3日
    058
  • 读书方法

    旧书不厌百回读,熟读深知子自知。 要研究透彻本专业的经典。 读书要学会终身下苦功夫,知十而非真知,不如知一之真知也,读书不能一知半解。 读书决定了一个人的见识和思想的深刻,这些都是…

    Python 2023年10月28日
    058
  • python及pygame雷霆战机游戏项目实战10 爆炸效果

    在这个系列中,将制作一个雷霆战机游戏。 ; 自动开火 首先,让对玩家射击方式做一点改动。只要空格键被按下,让自动发射子弹。 为此,将向Player添加两个新属性: self.sho…

    Python 2023年9月21日
    043
  • pymysql保存数组_pymysql返回数据的处理

    pymysql可以使用fetchall返回元组型数据,也可以直接使用pandas获取DataFrame格式数据。具体操作如下。 1、首先,定义连接和查询sql In [1]: im…

    Python 2023年8月22日
    070
  • Qt

    1、Qt简介 Qt是一个跨平台的应用程序C++开发类库,支持Windows、Linux、macOS等各种桌面平台,也支持iOS、Android等移动平台,还支持各种嵌入式系统,是应…

    Python 2023年6月11日
    068
  • windos系统下Scrapy下载失败,报错解决方法(三步解决)

    windos系统下Scrapy下载失败,报错解决方法(三步解决) 如果觉得本文章对你有用,请给我一个免费的点赞和收藏,谢谢!我也是偶尔才上来看看而已,你们点赞收藏对我来说是一种认可…

    Python 2023年10月2日
    043
  • 入门力扣自学笔记219 C++ (题目编号:2011)

    题目: 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言: ++X 和 X++ 使变量 X 的值 加 1–X 和 X– 使变量 X 的值 减 1最初…

    Python 2023年10月8日
    049
  • 2.1 飞机游戏

    本节将利用函数封装重构飞机游戏,并实现新式子弹、敌机移动和更好的清屏功能。 2.1.1 代码重构 没有函数,我们所有的代码都要写在主函数中,这样看着杂乱也不利于更行和添加功能。我们…

    Python 2023年9月24日
    077
  • 【CUDA安装详细教程】

    目录 前言 一、cuda的下载及安装 * 1.cuda版本 2.CUDA toolkit Download 3.cuda安装 二、cuDNN下载及安装 * 1.cuDNN下载 2….

    Python 2023年10月9日
    0176
  • python turtle绘制一只可爱的小海龟

    import turtle t = turtle # 给turtle取别名t.pensize(2) # 设置画笔粗细t.hideturtle() # 隐藏 turtlet.colo…

    Python 2023年9月19日
    038
  • scrapy 爬虫下载操作 数据保存 错误PIL解决 数据保存到JSON文件

    1.item 只有两种类型可以yield: item-数据保存会进入pipelines.py文件保存数据 item进入pipelines.py步骤: 1.设置robots协议(部分…

    Python 2023年10月5日
    051
  • windows下python3.5+安装scrapy与创建项目

    相信第一次安装scrapy框架都会遇到各种安装不上的问题!哈哈,别问我为啥知道!那我分享下我是如何安装scrapy框架的。 首先安装scrapy框架之前需要先安装几个依赖的库依照顺…

    Python 2023年10月4日
    040
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球