SQL中join连接查询时条件放在on后与where后的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

  1. 在使用left jion时,onwhere条件的区别如下:
  2. 1 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
  3. 2where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

表1:

表2:

sql语句1:

  1. SELECT
  2. t1.ip,
  3. t1.addr,
  4. t2.`port`,
  5. t2.first_time,
  6. t2.last_time
  7. FROM
  8. dws_apl_dau t1
  9. LEFT JOIN dws_apl_hsu t2
  10. on t1.ip=t2.ip

返回结果为表1能所有数据以及表2关联上的数据:

  1. SELECT
  2. t1.ip,
  3. t1.addr,
  4. t2.`port`,
  5. t2.first_time,
  6. t2.last_time
  7. FROM
  8. dws_apl_dau t1
  9. LEFT JOIN dws_apl_hsu t2
  10. on t1.ip=t2.port

  1. 结论:当使用left join时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null

sql语句2: 当在on条件后加上and关键词时:

  1. SELECT
  2. t1.ip,
  3. t1.addr,
  4. t2.`port`,
  5. t2.first_time,
  6. t2.last_time
  7. FROM
  8. dws_apl_dau t1
  9. LEFT JOIN dws_apl_hsu t2
  10. on t1.ip=t2.ip
  11. AND t2.`port` = '1233'

  1. 解释:on后加了and就是关联满足条件的表2的数据,但是结果数据不做过滤,显示全部表1数据,下面例2一样的效果

例2:

  1. SELECT
  2. t1.ip,
  3. t1.addr,
  4. t2.`port`,
  5. t2.first_time,
  6. t2.last_time
  7. FROM
  8. dws_apl_dau t1
  9. LEFT JOIN dws_apl_hsu t2
  10. on t1.ip=t2.ip
  11. AND t1.`addr` = 'bj'

  1. SELECT
  2. t1.ip,
  3. t1.addr,
  4. t2.`port`,
  5. t2.first_time,
  6. t2.last_time
  7. FROM
  8. dws_apl_dau t1
  9. LEFT JOIN dws_apl_hsu t2
  10. on t1.ip=t2.ip
  11. AND t1.`addr` = 'bj' AND t2.`port` = 1111

当没有满足and条件,则返回空数据

  1. 结论:left join on 在接 and 指定关联后表满足and条件的数据,有几条满足就返回表2几条数据,都不满足就返回表1全部数据和空的关联字段,不做过滤!!

sql语句3:

  1. SELECT
  2. t1.ip,
  3. t1.addr,
  4. t2.`port`,
  5. t2.first_time,
  6. t2.last_time
  7. FROM
  8. dws_apl_dau t1
  9. LEFT JOIN dws_apl_hsu t2
  10. on t1.ip=t2.ip
  11. where t1.`addr` = 'bj'

  1. SELECT
  2. t1.ip,
  3. t1.addr,
  4. t2.`port`,
  5. t2.first_time,
  6. t2.last_time
  7. FROM
  8. dws_apl_dau t1
  9. LEFT JOIN dws_apl_hsu t2
  10. on t1.ip=t2.ip
  11. where t1.`addr` = 'bj'
  12. and t2.`port`=1233

  1. on是在生成连接表的起作用的,where是生成连接表之后对连接表再进行过滤,相当于where之前做了子查询,返回满足where条件的数据。

以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

JOIN 关联表中 ON、WHERE 后面跟条件的区别的更多相关文章

  1. JOIN关联表中ON,WHERE后面跟条件的区别

    select * from td  left join (select case_id as sup_case_id , count(*) supervise_number from  td_kcdc ...

  2. left join 连表时,on后多条件无效问题

    http://www.cnblogs.com/guixiaoming/p/6516261.html left join 连表时,on后多条件无效问题 最近开发素材库项目,各种关系复杂的表,一度6张表的 ...

  3. mysql进阶(五)数据表中带OR的多条件查询

    MySQL数据表中带OR的多条件查询 OR关键字可以联合多个条件进行查询.使用OR关键字时: 条件 1) 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 2) 如果不符合这些查询条件 ...

  4. Oracle中的自连接(self join)-当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自连接。

    http://blog.163.com/wkyuyang_001/blog/static/10802122820091751049479/ 当表中的某一个字段与这个表中另外字段的相关时,我们可能用到自 ...

  5. .net EF Join 关联表分页查询

    Join中第二个参数和第三个参数即为两张表关联对应的字段 第四个参数new 后面如果不写Model名,系统会自动生成带字段的list类型 IQueryable<Operator> oper ...

  6. MySQL 中 on与where筛选条件的区别

    在两张表连接的时候才会有on的筛选条件,那么on和where的区别是什么呢? 在inner join中是没有区别的,但是在左连接和右连接中,区别就体现出来了,下面以左连接为例: 1.用on的时候,只对 ...

  7. SQL SERVER将指定表中的指定字段按照(,)逗号分隔

    不开心呀,早知道不跳了,一跳跳坑里来了. 使用方式: DECLARE @ConsigneeAddressId INT; SET @ConsigneeAddressId = 1; SELECT  * F ...

  8. MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)

    一.所有数据都存放于一张表中的弊端:1.表的组织结构复杂不清晰2.浪费空间3.扩展性极差 解决方案:分表a.分表 + foreign key: 有硬性限制(关联表中的关联字段内容必须来自于被关联表), ...

  9. mybatis学习(五)----实现关联表查询

    一.一对一的表查询 查询班级表中班级号为1的对应的记录(包括教师的具体信息) 1.首先建立数据表 数据表class和techear,class表中只有一个外键techear_id,sql脚本如下: C ...

  10. Yii CGridView 关联表搜索排序实例

    在这篇文章中,我准备讲解如何在CGridView中搜索或者排序关联表中的某一行,通过给Yii Blog demo添加一个list页面. 首先,检查你的blog demo里的protected\mode ...

随机推荐

  1. 浅谈如何使用 github.com/yuin/gopher-lua

    最近熟悉 go 项目时,发现项目中有用到 github.com/yuin/gopher-lua这个包,之前并没有接触过,特意去看了官方文档和找了些网上的资料,特此记录下. 本次介绍计划分为两篇文章,这 ...

  2. Selenium - 快速上手之启动浏览器

    Selenium - 浏览器启动/关闭 使用webdriver前,需要先导入包 from selenium import webdriver,每次打开浏览器时; 执行完毕要记得关闭浏览器,使用 dri ...

  3. 「P3」试下1个半月能不能水出个毕设

    前言 虽然说标题上写的时间是1个半月,但是实际上,真正开始行动的时间应该1个月都没有.之前都是在公司上班没活的时候干的.现在请了个长假,专门来做毕业设计:预计5月前能做完整个毕业设计,然后劳动节放假期 ...

  4. 痞子衡嵌入式:MCUBootUtility v5.0发布,初步支持i.MXRT1180

    -- 痞子衡维护的NXP-MCUBootUtility工具距离上一个大版本(v4.0.0)发布过去4个多月了,期间痞子衡也做过两个小版本更新,但不足以单独介绍.这一次痞子衡为大家带来了全新大版本v5. ...

  5. MySQL中字符串查询效率大比拼

    背景 最近有个同事对字符串加索引,加完后,发现多了个奇奇怪怪的数字执行的SQL如下: alter table string_index_test add index `idx_name` (`name ...

  6. 全面的ASP.NET Core Blazor简介和快速入门

    前言 因为咱们的MongoDB入门到实战教程Web端准备使用Blazor来作为前端展示UI,本篇文章主要是介绍Blazor是一个怎样的Web UI框架,其优势和特点在哪?并带你快速入门上手ASP.NE ...

  7. .NET Core(C#)使用Titanium.Web.Proxy实现Http(s)代理服务器监控HTTP请求

    关于Titanium.Web.Proxy详细信息可以去这里仔细看看,这里只记录简单用法 安装引用Titanium.Web.Proxy NuGet直接获取Titanium.Web.Proxy 使用 配置 ...

  8. 【论文阅读】Learning Deep Features for Discriminative Localization

    这个是周博磊16年的文章.文章通过实验证明,即使没有位置标注,CNN仍是可以得到一些位置信息,(文章中的显著性图) CNN提取的feature含有位置信息,尽管我们在训练的时候并没有标记位置信息: 这 ...

  9. ArcPy批量对大量遥感影像相减做差

      本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件批量进行相减做差的方法.   首先,我们来明确一下本文的具体需求.现有一个存储有多张.tif格式遥感影像的文件夹,其中每一个遥感影像 ...

  10. 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题

    前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] c ...