JOIN 关联表中 ON、WHERE 后面跟条件的区别
SQL中join连接查询时条件放在on后与where后的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
表1:

表2:

sql语句1:
SELECT
t1.ip,
t1.addr,
t2.`port`,
t2.first_time,
t2.last_time
FROM
dws_apl_dau t1
LEFT JOIN dws_apl_hsu t2
on t1.ip=t2.ip
返回结果为表1能所有数据以及表2关联上的数据:

SELECT
t1.ip,
t1.addr,
t2.`port`,
t2.first_time,
t2.last_time
FROM
dws_apl_dau t1
LEFT JOIN dws_apl_hsu t2
on t1.ip=t2.port

结论:当使用left join时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null
sql语句2: 当在on条件后加上and关键词时:
SELECT
t1.ip,
t1.addr,
t2.`port`,
t2.first_time,
t2.last_time
FROM
dws_apl_dau t1
LEFT JOIN dws_apl_hsu t2
on t1.ip=t2.ip
AND t2.`port` = '1233'

解释:on后加了and就是关联满足条件的表2的数据,但是结果数据不做过滤,显示全部表1数据,下面例2一样的效果
例2:
SELECT
t1.ip,
t1.addr,
t2.`port`,
t2.first_time,
t2.last_time
FROM
dws_apl_dau t1
LEFT JOIN dws_apl_hsu t2
on t1.ip=t2.ip
AND t1.`addr` = 'bj'

SELECT
t1.ip,
t1.addr,
t2.`port`,
t2.first_time,
t2.last_time
FROM
dws_apl_dau t1
LEFT JOIN dws_apl_hsu t2
on t1.ip=t2.ip
AND t1.`addr` = 'bj' AND t2.`port` = 1111

当没有满足and条件,则返回空数据
结论:left join 接 on 在接 and 指定关联后表满足and条件的数据,有几条满足就返回表2几条数据,都不满足就返回表1全部数据和空的关联字段,不做过滤!!
sql语句3:
SELECT
t1.ip,
t1.addr,
t2.`port`,
t2.first_time,
t2.last_time
FROM
dws_apl_dau t1
LEFT JOIN dws_apl_hsu t2
on t1.ip=t2.ip
where t1.`addr` = 'bj'

SELECT
t1.ip,
t1.addr,
t2.`port`,
t2.first_time,
t2.last_time
FROM
dws_apl_dau t1
LEFT JOIN dws_apl_hsu t2
on t1.ip=t2.ip
where t1.`addr` = 'bj'
and t2.`port`=1233

on是在生成连接表的起作用的,where是生成连接表之后对连接表再进行过滤,相当于where之前做了子查询,返回满足where条件的数据。
以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
JOIN 关联表中 ON、WHERE 后面跟条件的区别的更多相关文章
- JOIN关联表中ON,WHERE后面跟条件的区别
select * from td left join (select case_id as sup_case_id , count(*) supervise_number from td_kcdc ...
- left join 连表时,on后多条件无效问题
http://www.cnblogs.com/guixiaoming/p/6516261.html left join 连表时,on后多条件无效问题 最近开发素材库项目,各种关系复杂的表,一度6张表的 ...
- mysql进阶(五)数据表中带OR的多条件查询
MySQL数据表中带OR的多条件查询 OR关键字可以联合多个条件进行查询.使用OR关键字时: 条件 1) 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 2) 如果不符合这些查询条件 ...
- Oracle中的自连接(self join)-当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自连接。
http://blog.163.com/wkyuyang_001/blog/static/10802122820091751049479/ 当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自 ...
- .net EF Join 关联表分页查询
Join中第二个参数和第三个参数即为两张表关联对应的字段 第四个参数new 后面如果不写Model名,系统会自动生成带字段的list类型 IQueryable<Operator> oper ...
- MySQL 中 on与where筛选条件的区别
在两张表连接的时候才会有on的筛选条件,那么on和where的区别是什么呢? 在inner join中是没有区别的,但是在左连接和右连接中,区别就体现出来了,下面以左连接为例: 1.用on的时候,只对 ...
- SQL SERVER将指定表中的指定字段按照(,)逗号分隔
不开心呀,早知道不跳了,一跳跳坑里来了. 使用方式: DECLARE @ConsigneeAddressId INT; SET @ConsigneeAddressId = 1; SELECT * F ...
- MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)
一.所有数据都存放于一张表中的弊端:1.表的组织结构复杂不清晰2.浪费空间3.扩展性极差 解决方案:分表a.分表 + foreign key: 有硬性限制(关联表中的关联字段内容必须来自于被关联表), ...
- mybatis学习(五)----实现关联表查询
一.一对一的表查询 查询班级表中班级号为1的对应的记录(包括教师的具体信息) 1.首先建立数据表 数据表class和techear,class表中只有一个外键techear_id,sql脚本如下: C ...
- Yii CGridView 关联表搜索排序实例
在这篇文章中,我准备讲解如何在CGridView中搜索或者排序关联表中的某一行,通过给Yii Blog demo添加一个list页面. 首先,检查你的blog demo里的protected\mode ...
随机推荐
- 【GiraKoo】Android Studio调试时,提示port无法打开
Android Studio调试时,提示port无法打开 现象描述 在Android Studio在进行调试时,无法正常运行.App闪退. IDE提示: Error running 'app': Un ...
- STM32为何在诸多的单片机中脱颖而出?
1.前言 在STM32之前,都是老大头51,带着它的"小弟们" MSP430.AVR.PIC在单片机界呼风唤雨.那个时候,市场上遍布8位机,大学教材用51入门,个人.企业学单片机 ...
- macbook苹果m1芯片训练机器学习、深度学习模型,resnet101在mnist手写数字识别上做加速,torch.device("mps")
apple的m1芯片比以往cpu芯片在机器学习加速上听说有15倍的提升,也就是可以使用apple mac训练深度学习pytorch模型!!!惊呆了 安装apple m1芯片版本的pytorch 然后使 ...
- web自动化10-窗口截图、验证码处理
窗口截图 1.是什么 说明:把当前操作的页面,截图保存到指定位置 2.代码中怎么使用? 说明:在Selenium中,提供了截图方法,我们只需要调用即可 方法: driver.get_screensho ...
- Odoo-----计算字段、depnds,onchange 机制、模型约束
1 计算字段和默认值问题 字段通过调用模型的方法的实时计算获得,一般都是 compute 属性为主的方法,这个计算方法通过计算self每条记录设置的的值,self 是一个有记录的有序集合,支持py ...
- iOS中容易用错的常用知识点
坐标系转换 ios中的坐标系有三种 视图坐标系:原点(0,0)视图的左上角 窗口坐标系:原点(0,0)窗口的左上角 世界坐标系:原点(0,0)游戏中世界的原点 平时开发中经常会遇到转UIWindow坐 ...
- 【python基础】复杂数据类型-列表类型(列表切片)
1.列表切片 前面学习的是如何处理列表的所有数据元素.python还可以处理列表的部分元素,python称之为切片. 1.1创建切片 创建切片,可指定要使用的第一个数据元素的索引和最后一个数据元素的索 ...
- shell编程-提取IP地址
1.使用cut文本处理工具提取 [root@hadoop129 scripts]# ifconfig ens33 | grep netmask | cut -d " " -f 10 ...
- 11. Mybatis的逆向工程
正向工程:先创建 Java 实体类,由框架负责根据实体类生成数据库表. Hibernate 是支持正向工 程的. 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源: Java 实体类 ...
- 使用 Transformers 为多语种语音识别任务微调 Whisper 模型
本文提供了一个使用 Hugging Face Transformers 在任意多语种语音识别 (ASR) 数据集上微调 Whisper 的分步指南.同时,我们还深入解释了 Whisper 模型.Com ...