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

目录
  • 摘要:
  • 综述
  • 过滤条件放在on和where中的区别
  • 小结
    • Reference

摘要:

介绍在多表关联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

  • https://www.jb51.net/article/262956.htm
(0)

相关推荐

  • SQL中过滤条件放on和where中的区别详解

    前言 今天接到蚂蚁金服的电面,问了sql中过滤条件放在on和where中的区别,当时满脑子是inner join,觉得没区别啊.后来才想起来,连接查询除了inner join还有right join,left join.汗呐,当时还是太紧张了.这里做一下记录吧. join过程可以这样理解:首先两个表做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤.下面看实验: 先准备两张表: 先执行inner

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

    目录 摘要: 综述 过滤条件放在on和where中的区别 小结 Reference 摘要: 介绍在多表关联SQL语句中,过滤条件放在on和where子句中的区别——inner join中没区别,外连接就不一样. 综述 蚂蚁金服的一道SQL面试题如下:SQL语句中,过滤条件放在on和where子句中的区别.当时满脑子是left join和inner join等,觉得没区别啊!细思极恐,故梳理一下. 过滤条件放在on和where中的区别 数据库在通过连接两张或多张表来查询记录时,都会先通过join

  • SQL语句练习实例之四 找出促销活动中销售额最高的职员

    复制代码 代码如下: ---找出促销活动中销售额最高的职员 ---你刚在一家服装销售公司中找到了一份工作,此时经理要求你根据数据库中的两张表得到促销活动销售额最高的销售员 ---1.一张是促销活动表 ---2.一张是销售客列表 create table Promotions ( activity nvarchar(30), sdate datetime, edate datetime ) insert Promotions select '五一促销活动','2011-5-1','2011-5-7

  • 使用SQL语句统计数据时sum和count函数中使用if判断条件的讲解

    首先举个栗子(不想看的话直接下面看总结): order_type:订单类型 open_id:用户唯一标识 SELECT date(create_time) AS '当天日期', sum(real_price) AS '当天总收入', sum函数中使用if判断条件:{ sum( IF (order_type = 0, real_price, 0) ) AS '当天支付收入', sum( IF (order_type = 1, real_price, 0) ) AS '当天打赏收入', } coun

  • Python使用sql语句对mysql数据库多条件模糊查询的思路详解

    def find_worldByName(c_name,continent): print(c_name) print(continent) sql = " SELECT * FROM world WHERE 1=1 " if(c_name!=None): sql=sql+"AND ( c_name LIKE '%"+c_name+"%' )" if(continent!=None): sql=sql+" AND ( continent

  • SQL语句学习

    (高手就不要笑话了^_^). 好了,其他的不说现在就开始: select 子句主要决定了从表中取出的列名,列数以及列的显示顺序等信息,"*"表示查询所有的列,有关select的用法应该结合其它子句的用法. 1.from 子句: ①from子句用于指定被查询的表,试图或快照. ②如果指定多个实体,用逗号讲它们分割.为了查询方便,特别是进行自连接查询时,可以给表起别名.(这里我要说很多刚开始使用sql的朋友开始的时候总觉得这个很简单,没有什么可学的,可是到后来在做一些复杂的sql的时候总是

  • SQL语句详细说明[部分]

    SQL 语句教程 (11) Group By 我们现在回到函数上.记得我们用SUM这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (store_name) 的营业额 (sales),那怎么办呢?在这个情况下,我们要做到两件事:第一,我们对于 store_name 及 Sales 这两个栏位都要选出.第二,我们需要确认所有的 sales 都要依照各个 store_name 来分开算.这个语法为:SELECT "栏位1", SUM("栏位2&q

  • springboot如何初始化执行sql语句

    springboot初始化执行sql语句 开发的时候需要增加一些函数和表,同时因为一些基础数据例如字典表也需要插入一些数据,当然我可以跟组员说一声然后把sql语句给他们在本地执行,但是这样太low,不够自动化. 于是就开始研究如何在springboot启动时执行sql语句 最后查到资料 spring.datasource.schema=classpath:schema.sql 这个配置项决定建库文件的位置,注意classpath,之前我在网上查找资料都没有这个classpath,结果我的sche

  • sql语句优化的一般步骤详解

    前言 本文主要给大家分享了关于sql语句优化的一般步骤,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.通过 show status 命令了解各种 sql 的执行频率 mysql 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息,也可以在操作系统上使用 mysqladmin extend-status 命令获取这些消息. show status 命令中间可以加入选项 session(默认) 或 global: se

  • 执行一条sql语句update多条记录实现思路

    通常情况下,我们会使用以下SQL语句来更新字段值: 复制代码 代码如下: UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源.教程指南.橱窗展示),这些分类目录的信息存储在数据库表categories中,并且设置了显示顺序字段 display_order,每个分类占一行记录.如果我想重新编排这

随机推荐