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

      在使用left jion时,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 * formtab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、select * formtab1 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中,返回的结果集是相同的。

mysql>  select * from aaa a left join bbb b on a.id = b.id and b.name = '111111111';
+------+-----------+------+-----------+
| id   | name      | id   | name      |
+------+-----------+------+-----------+
|    1 | 陈亮亮    |    1 | 111111111 |
|    1 | 福特      |    1 | 111111111 |
|    1 | bentian   |    1 | 111111111 |
|    2 | 张云霞    | NULL | NULL      |
|    3 | 陈小平    | NULL | NULL      |
|    4 | 陈小肥    | NULL | NULL      |
|    2 | 宝马      | NULL | NULL      |
|    3 | 奔驰      | NULL | NULL      |
|    4 | 奥迪      | NULL | NULL      |
|    2 | dazong    | NULL | NULL      |
|    5 | ben       | NULL | NULL      |
|    6 | da        | NULL | NULL      |
+------+-----------+------+-----------+
12 rows in set (0.01 sec)

mysql>  select * from aaa a left join bbb b on a.id = b.id where b.name = '111111111';
+------+-----------+------+-----------+
| id   | name      | id   | name      |
+------+-----------+------+-----------+
|    1 | 陈亮亮    |    1 | 111111111 |
|    1 | 福特      |    1 | 111111111 |
|    1 | bentian   |    1 | 111111111 |
+------+-----------+------+-----------+
3 rows in set (0.00 sec)

mysql>  select * from aaa a left join bbb b on a.id = b.id where a.name = 'bentian';
+------+---------+------+-----------+
| id   | name    | id   | name      |
+------+---------+------+-----------+
|    1 | bentian |    1 | 111111111 |
+------+---------+------+-----------+
1 row in set (0.00 sec)

mysql> select * from aaa;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 陈亮亮    |
|    2 | 张云霞    |
|    3 | 陈小平    |
|    4 | 陈小肥    |
|    1 | 福特      |
|    2 | 宝马      |
|    3 | 奔驰      |
|    4 | 奥迪      |
|    1 | bentian   |
|    2 | dazong    |
|    5 | ben       |
|    6 | da        |
+------+-----------+
12 rows in set (0.02 sec)

mysql> select * from bbb;
+------+------------+
| id   | name       |
+------+------------+
|    1 | 111111111  |
|    2 | 2222222222 |
|    3 | 3333333333 |
+------+------------+

left join on and 与 left join on where的区别的更多相关文章

  1. 数据库中的左连接(left join)和右连接(right join)区别

    Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...

  2. MySQL的JOIN(四):JOIN优化实践之快速匹配

    这篇博文讲述如何优化扫描速度.我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接.这个过程的实质就是查询操作 ...

  3. MySQL的JOIN(五):JOIN优化实践之排序

    这篇博文讲述如何优化JOIN查询带有排序的情况.大致分为对连接属性排序和对非连接属性排序两种情况.插入测试数据. CREATE TABLE t1 ( id INT PRIMARY KEY AUTO_I ...

  4. Python3 join函数和os.path.join用法

    Python3  join函数和os.path.join用法 os.path.join()连接两个文件名地址的时候,就比os.path.join("D:\","test. ...

  5. Python join() 方法与os.path.join()的区别

    Python join() 方法与os.path.join()的区别 pythonJoinos.path.join 今天工作中用到python的join方法,有点分不太清楚join() 方法与os.p ...

  6. “,”、“natural join”、“natural left outer join”、“natural right outer join”的用法总结

    “,”:代表笛卡尔积: “natural join”:代表自然连接,即同名列等值连接: “natural left outer join”:表示左外连接: “natural right outer j ...

  7. hive 包含操作(left semi join)(left outer join = in)迪卡尔积

    目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现. 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注 ...

  8. 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题

    原文:[Transact-SQL]SQL Server自动把left join自动转化为inner join.以及关联时的数据重复问题 1.SQL Server自动把left join自动转化为inn ...

  9. left join on and和left join on where条件的困惑[转]

    外连接:left join(左联接) left outer join 返回包括左表中的所有记录和右表中联结字段相等的记录right join(右联接) right outer join返回包括右表中的 ...

  10. 转!!left join on and 与 left join on where的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户.       在使用left jion时,on和where条件的区别如下: 1. on条件是在生成临时 ...

随机推荐

  1. ☆ [ZJOI2006] 书架 「平衡树维护数列」

    题目类型:平衡树 传送门:>Here< 题意:要求维护一个数列,支持:将某个元素置顶或置底,交换某元素与其前驱或后继的位置,查询编号为\(S\)的元素的排名,查询排名第\(k\)的元素编号 ...

  2. [WC2018]通道

    题目描述 http://uoj.ac/problem/347 题解 解法1 求三棵树的直径,看起来非常不可做,但是所有边权都是正的,可以让我们想到爬山. 所以我们可以按照BFS求树的直径的方法,随机一 ...

  3. U66785 行列式求值

    二更:把更多的行列式有关内容加了进来(%%%%%Jelly Goat奆佬) 题目描述 给你一个N(n≤10n\leq 10n≤10)阶行列式,请计算出它的值 输入输出格式 输入格式: 第一行有一个整数 ...

  4. 使用Webstorm建立vue.js工程并添加vuetify组件

    .. .. .. ..等待安装完 ..生成的目录结构 ..打开Webstorm的终端 ..最后出现 ..回到工程目录,右键 ..显示npm面板,点击serve运行 .. ..打开[貌似跟以前不一样了. ...

  5. eMMC真能优化成UFS?谈谈手机闪存的文件系统

    和UFS闪存相比,eMMC的性能更弱,同一型号的手机混用这两种规格的闪存,让一些消费者感到了不满.对此,厂商称通过优化,eMMC的产品也可以获得优秀的体验.这个优化到底是怎么回事?根据以往的一些宣传, ...

  6. dubbo和dubboX与微服务架构(dubbo一)

    一.传统三层架构模式的缺陷 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)web.业务逻辑层(Bu ...

  7. React 记录(3)

    React文档:https://www.reactjscn.com/docs/hello-world.html 慢慢学习:对照教程文档,逐句猜解,截图 React官网:https://reactjs. ...

  8. JavaScript数据类型 String字符串类型

    前言 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持 ...

  9. [物理学与PDEs]第5章习题4 广义 Hookean 定律的张量的对称性

    设材料是超弹性的, 并设参考构形为自然状态, 证明由线性化得到的张量 ${\bf A}=(a_{ijkl})=\sex{2\cfrac{\p \bar p_{ij}}{c_{kl}}}$ 具有以下的对 ...

  10. 邮箱学堂:SPF详解

    [中国邮箱网 电子邮件频道]   1月18日,什么是SPF?关于SPF的一些基础知识有哪些?SPF有哪些需求?什么是SPF的TXT记录?本文的微软Exchange专家围绕SPF做了非常详细的介绍与分析 ...