SQL 中 条件放在on与where的区别
学无止境学无止境
今天在写左连接sql时将过滤条件放在on后,发现并没有得到我想要的结果,于是百度了解了,现记录:
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用 left join 时,on 和 where 条件的区别如下:
1、on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
表1:tab1
id size
1 10
2 20
3 30
表2:tab2
size name
10 AAA
20 BBB
20 CCC
两条SQL:
1、select * from tab1 left join tab2 on tab1.size = tab2.size where tab2.name='AAA'
2、select * from tab1 left join tab2 on tab1.size = tab2.size and tab2.name='AAA'
第一条SQL的过程:
1、中间表
on 条件:
tab1.size = tab2.size
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null) (null)
2、再对中间表过滤
where 条件:
tab2.name='AAA'
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
第二条SQL的过程:
1、中间表
on 条件:
tab1.size = tab2.size and tab2.name='AAA'
(条件不为真也会返回左表中的记录) tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 (null) (null)
3 30 (null) (null)
其实以上结果的关键原因就是 left join,right join,full join 的特殊性。
不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。
而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。
参考于:https://www.runoob.com/w3cnote/sql-different-on-and-where.html
SQL 中 条件放在on与where的区别相关推荐
- sql中条件放在on后面和where后面的区别
2019独角兽企业重金招聘Python工程师标准>>> 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时 ...
- SQL 中的=,in,like之间的区别
SQL中的=,in,like之间的区别: 三者都可以用来进行数据匹配 .但三者并不相同. 等号是用来查找与单个值匹配的所有数据: IN 是 用来查找与多个值匹配的所有数据: 而 LIKE用来查找与一个 ...
- SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASEsexWHEN'1'THEN'男' WHEN'2'THEN'女' ELSE'其他'END --Case搜索函数 ...
- SQL 中条件、循环语句的应用整理
引言: 作为程序员一族,无论是任何语言,最基本的语句都离不开顺序.条件(选择).循环这三大逻辑结构,有些知识不经常使用的话就会模糊,所以即使是很简单的知识点也想做个总结. 1.条件分支(SQL中的条件 ...
- mysql where is_MySQL中条件放在where后面与放在on后面的区别
假设有两种表:test_on_position表和address表,address表存放地址,test_on_position存放会员及其常用的地址,数据如下: address表: test_on_p ...
- 述 SQL 中的 distinct 和 row_number() over() 的区别及用法
1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...
- 详述 SQL 中的 distinct 和 row_number() over() 的区别及用法
1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...
- SQL中IS NOT NULL与!=NULL的区别
平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...
- SQL中on、where、having的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户.on.where.having就是在这个过程中对数据进行过滤. on是在生成中临时表之前就去作用的,它 ...
最新文章
- IROS2021 | F-LOAM : Fast LiDAR Odometry and Mapping 解析
- PHP从数据库获取的下拉树
- 如何制作一颗CPU? 从石子到管脚绑定
- C/C++程序基础 (八)数据结构
- linux用echo重定向到文件,Linux – Bash将String重定向到文件
- 北京林业大学c语言题库,2016年北京林业大学信息学院数据结构考研复试题库
- 一般图带权多重匹配(欧拉图+最小费用流)
- LeetCode--palindrome-number回文数
- 本地计算机用plsql访问虚拟机中的oracle数据库
- 保存网站快捷方式到桌面的php代码,转的一个朋友的了,加了点判断
- Linux pip 安装模块时,一直黄字错误:Could not find a version that satisfies the requirement...
- 势差、高度、结构、做工、逆熵
- 2.14.PHP7.1 狐教程-【PHP 静态类、静态方法、静态属性】
- 反射(一)动态加载类
- python tushare
- 国外AI知名论坛资源网站
- Java多态实例主人和狗狗企鹅玩游戏
- 麻省理工大学公开课学习笔记【1、算法分析】
- Windows画图Android版,妙笔画世界-三星手机画图应用
- 已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,并把该字符串中的小写字母变成大写字母,其它字符保持不变。要求分别在屏幕上输出原字符串以及修改后的字符串。