关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒

ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行,即使on中包含有A表中的列的限制条件,也不会过滤A的任何数据(A的数据只会通过where过滤)。

如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据

在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。

让我们看一个 LFET JOIN 示例:

01 mysql> CREATE TABLE `product` (
02   `id` int(10) unsigned NOT NULL auto_increment,
03   `amount` int(10) unsigned default NULL,
04   PRIMARY KEY  (`id`)
05 ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
06   
07 mysql> CREATE TABLE `product_details` (
08   `id` int(10) unsigned NOT NULL,
09   `weight` int(10) unsigned default NULL,
10   `exist` int(10) unsigned default NULL,
11   PRIMARY KEY  (`id`)
12 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
13   
14 mysql> INSERT INTO product (id,amount)
15        VALUES (1,100),(2,200),(3,300),(4,400);
16 Query OK, 4 rows affected (0.00 sec)
17 Records: 4  Duplicates: 0  Warnings: 0
18   
19 mysql> INSERT INTO product_details (id,weight,exist)
20        VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);
21 Query OK, 4 rows affected (0.00 sec)
22 Records: 4  Duplicates: 0  Warnings: 0
23   
24 mysql> SELECT FROM product;
25 +----+--------+
26 | id | amount |
27 +----+--------+
28 |  1 |    100 |
29 |  2 |    200 |
30 |  3 |    300 |
31 |  4 |    400 |
32 +----+--------+
33 rows in set (0.00 sec)
34   
35 mysql> SELECT FROM product_details;
36 +----+--------+-------+
37 | id | weight | exist |
38 +----+--------+-------+
39 |  2 |     22 |     0 |
40 |  4 |     44 |     1 |
41 |  5 |     55 |     0 |
42 |  6 |     66 |     1 |
43 +----+--------+-------+
44 rows in set (0.00 sec)
45   
46 mysql> SELECT FROM product LEFT JOIN product_details
47        ON (product.id = product_details.id);
48 +----+--------+------+--------+-------+
49 | id | amount | id   | weight | exist |
50 +----+--------+------+--------+-------+
51 |  1 |    100 | NULL |   NULL |  NULL |
52 |  2 |    200 |    2 |     22 |     0 |
53 |  3 |    300 | NULL |   NULL |  NULL |
54 |  4 |    400 |    4 |     44 |     1 |
55 +----+--------+------+--------+-------+
56 rows in set (0.00 sec)

ON 子句和 WHERE 子句有什么不同?

一个问题:下面两个查询的结果集有什么不同么?

1 1. SELECT FROM product LEFT JOIN product_details
2          ON (product.id = product_details.id)
3          AND   product_details.id=2;
4 2. SELECT FROM product LEFT JOIN product_details
5          ON (product.id = product_details.id)
6          WHERE product_details.id=2;

用例子来理解最好不过了:

01 mysql> SELECT FROM product LEFT JOIN product_details
02        ON (product.id = product_details.id)
03        AND product_details.id=2;
04 +----+--------+------+--------+-------+
05 | id | amount | id   | weight | exist |
06 +----+--------+------+--------+-------+
07 |  1 |    100 | NULL |   NULL |  NULL |
08 |  2 |    200 |    2 |     22 |     0 |
09 |  3 |    300 | NULL |   NULL |  NULL |
10 |  4 |    400 | NULL |   NULL |  NULL |
11 +----+--------+------+--------+-------+
12 rows in set (0.00 sec)
13   
14 mysql> SELECT FROM product LEFT JOIN product_details
15        ON (product.id = product_details.id)
16        WHERE product_details.id=2;
17 +----+--------+----+--------+-------+
18 | id | amount | id | weight | exist |
19 +----+--------+----+--------+-------+
20 |  2 |    200 |  2 |     22 |     0 |
21 +----+--------+----+--------+-------+
22 1 row in set (0.01 sec)

第一条查询使用 ON 条件决定了从 LEFT JOIN的 product_details表中检索符合的所有数据行。

第二条查询做了简单的LEFT JOIN,然后使用 WHERE 子句从 LEFT JOIN的数据中过滤掉不符合条件的数据行。

再来看一些示例:

01 mysql>
02 mysql> SELECT FROM product LEFT JOIN product_details
03        ON product.id = product_details.id
04        AND product.amount=100;
05 +----+--------+------+--------+-------+
06 | id | amount | id   | weight | exist |
07 +----+--------+------+--------+-------+
08 |  1 |    100 | NULL |   NULL |  NULL |
09 |  2 |    200 | NULL |   NULL |  NULL |
10 |  3 |    300 | NULL |   NULL |  NULL |
11 |  4 |    400 | NULL |   NULL |  NULL |
12 +----+--------+------+--------+-------+
13 rows in set (0.00 sec)

所有来自product表的数据行都被检索到了,但没有在product_details表中匹配到记录(product.id = product_details.id AND product.amount=100 条件并没有匹配到任何数据)

01 mysql> SELECT FROM product LEFT JOIN product_details
02        ON (product.id = product_details.id)
03        AND product.amount=200;
04 +----+--------+------+--------+-------+
05 | id | amount | id   | weight | exist |
06 +----+--------+------+--------+-------+
07 |  1 |    100 | NULL |   NULL |  NULL |
08 |  2 |    200 |    2 |     22 |     0 |
09 |  3 |    300 | NULL |   NULL |  NULL |
10 |  4 |    400 | NULL |   NULL |  NULL |
11 +----+--------+------+--------+-------+
12 rows in set (0.01 sec)

同样,所有来自product表的数据行都被检索到了,有一条数据匹配到了。

原文地址:http://blog.csdn.net/longyulu/article/details/7924833

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

  1. MySQL之LEFT JOIN中使用ON和WHRERE对表数据

    背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论.商城里一个货物有多少评论.一条评论有多少个赞等等.但是由于对join.on.where等关键字的不 ...

  2. left join中where与on的区别

    举例进行说明,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两个表来对MySQL关联left join 条件on与where 条件的不同之处进 ...

  3. SQL JOIN 中 on 与 where 的区别

    left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join : 内连 ...

  4. 关联查询left join中on 和where 的区别

    关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行. 如果 B 表中没有任何一 ...

  5. 深入Oracle的left join中on和where的区别详解

    -- from http://blog.itpub.net/30175262/viewspace-1472060/ 今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 日期 ...

  6. mysql中left join中的on条件 和 where条件区别

    需要知道sql中关键字的执行顺序. FROM-> ON->JOIN-> WHERE->GROUP BY-> HAVING->SELECT-> DISTINCT ...

  7. mysql left join中where和on条件的区别

    left join中关于where和on条件的几个知识点: 1.多表left join是会生成一张临时表,并返回给用户 2.where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件 ...

  8. mysql left join中on后加条件判断和where中加条件的区别

    left join中关于where和on条件的几个知识点: .多表left join是会生成一张临时表,并返回给用户 .where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件的记 ...

  9. 转: 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

随机推荐

  1. vbs实现的支持拖动的txt文本切割器

    vbs实现的支持拖动的txt文本切割器 作者: 字体:[增加 减小] 类型:转载 时间:2008-06-20我要评论 用vbs实现的txt文本文件切割器,默认为8000个字符切为一个文件.支持拖动. ...

  2. matlab绘制二维图形

    常用的二维图形命令: plot:绘制二维图形 loglog:用全对数坐标绘图 semilogx:用半对数坐标(X)绘图 semilogy:用半对数坐标(Y)绘图 fill:绘制二维多边填充图形 pol ...

  3. LeetCode 笔记28 Maximum Gap

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  4. 浪潮之巅——IT那点事之二—蓝色巨人IBM

    蓝色巨人IBM的全称是国际商用机器公司(International Business Machines Corporation),纵观IBM的发展历史,可以看出IBM与机器结缘,以商用为主的发展策略. ...

  5. SVN中trunk、branches、tags用法详解

    Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/. 那么标准的svn布局是:svn://proj/|+-trunk+-branches+-t ...

  6. 20145316GDB调试汇编堆栈

    GDB调试例子的汇编堆栈 代码 直接-m32编译出现问题 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386 编 ...

  7. JqueryEasyUI教程入门篇

    什么是jQueryEasyUI? JqueryUI是一组基于jQuery的UI插件集合 学习jQueryEasyUI的条件? 必须掌握Jquery的基本语法知识 jQueryEasyUI的特点? 1. ...

  8. 13.C#分部类型和静态类(七章7.1-7.2)

    再大的东西不去找,也就没了,再小的知识不去记,也就忘了.今天来写一写C#中的分部类型和静态工具类,这些两个概念可能在我们的日常使用过程中都使用过,可能大家对这些内容觉得这些不是应该有的东西嘛,那就来复 ...

  9. [C#]exchange发送,收件箱操作类

    最近项目中需要用到exchange的操作,就参照msdn弄了一个简单的操作类.目前先实现了,发送邮件和拉取收件箱的功能,其他的以后在慢慢的添加. using Microsoft.Exchange.We ...

  10. 每天一个linux命令(50):telnet命令

    telnet 命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是 Internet远程登陆服务的标准协议和主要方式.它为 ...