学无止境学无止境
今天在写左连接sql时将过滤条件放在on后,发现并没有得到我想要的结果,于是百度了解了,现记录:
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用 left join 时,onwhere 条件的区别如下:

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的区别相关推荐

  1. sql中条件放在on后面和where后面的区别

    2019独角兽企业重金招聘Python工程师标准>>> 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时 ...

  2. SQL 中的=,in,like之间的区别

    SQL中的=,in,like之间的区别: 三者都可以用来进行数据匹配 .但三者并不相同. 等号是用来查找与单个值匹配的所有数据: IN 是 用来查找与多个值匹配的所有数据: 而 LIKE用来查找与一个 ...

  3. SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASEsexWHEN'1'THEN'男' WHEN'2'THEN'女' ELSE'其他'END --Case搜索函数 ...

  4. SQL 中条件、循环语句的应用整理

    引言: 作为程序员一族,无论是任何语言,最基本的语句都离不开顺序.条件(选择).循环这三大逻辑结构,有些知识不经常使用的话就会模糊,所以即使是很简单的知识点也想做个总结. 1.条件分支(SQL中的条件 ...

  5. mysql where is_MySQL中条件放在where后面与放在on后面的区别

    假设有两种表:test_on_position表和address表,address表存放地址,test_on_position存放会员及其常用的地址,数据如下: address表: test_on_p ...

  6. 述 SQL 中的 distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

  7. 详述 SQL 中的 distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

  8. SQL中IS NOT NULL与!=NULL的区别

    平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...

  9. SQL中on、where、having的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户.on.where.having就是在这个过程中对数据进行过滤. on是在生成中临时表之前就去作用的,它 ...

最新文章

  1. IROS2021 | F-LOAM : Fast LiDAR Odometry and Mapping 解析
  2. PHP从数据库获取的下拉树
  3. 如何制作一颗CPU? 从石子到管脚绑定
  4. C/C++程序基础 (八)数据结构
  5. linux用echo重定向到文件,Linux – Bash将String重定向到文件
  6. 北京林业大学c语言题库,2016年北京林业大学信息学院数据结构考研复试题库
  7. 一般图带权多重匹配(欧拉图+最小费用流)
  8. LeetCode--palindrome-number回文数
  9. 本地计算机用plsql访问虚拟机中的oracle数据库
  10. 保存网站快捷方式到桌面的php代码,转的一个朋友的了,加了点判断
  11. Linux pip 安装模块时,一直黄字错误:Could not find a version that satisfies the requirement...
  12. 势差、高度、结构、做工、逆熵
  13. 2.14.PHP7.1 狐教程-【PHP 静态类、静态方法、静态属性】
  14. 反射(一)动态加载类
  15. python tushare
  16. 国外AI知名论坛资源网站
  17. Java多态实例主人和狗狗企鹅玩游戏
  18. 麻省理工大学公开课学习笔记【1、算法分析】
  19. Windows画图Android版,妙笔画世界-三星手机画图应用
  20. 已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,并把该字符串中的小写字母变成大写字母,其它字符保持不变。要求分别在屏幕上输出原字符串以及修改后的字符串。

热门文章

  1. PyTorch中文文档阅读笔记-day1
  2. 软考报名已全部截止,疫情之下,这些要求不满足不得进入考场
  3. 机器学习/人工智能开源项目整理<一>
  4. 新电脑+旧系统:教你在不同机器间转移Linux
  5. Linux分区原理及根目录的介绍
  6. python将字典转换为excel
  7. 科达正式发布晶艳二代小间距LED屏及显控平台新品
  8. 软考真的没用了吗?到底要不要考?
  9. 常用 FFmpeg 命令
  10. Thinkphp上传图片及形成缩略图