关于 “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. JS调试加断点

    js在回调函数执行时直接就跳过了,想看下回调函数也看不了,调试的debug代码一时半会儿想不起来,找了几分钟找到了,还是记一下好. 1 debugger;

  2. Tomcat简易安装指南

    由于要学习activiti的使用,而activiti依赖于tomcat,所以下载了一个tomcat 7 的binary包,然后按照running.TXT中的描述来手动安装,下文主要是记录了在阅读run ...

  3. Linux第14周学习笔记

    虚拟存储器 虚拟存储器是硬件异常.硬件地址翻译.主存.磁盘文件和内核软件的完美交互. 虚拟存储器的特点: 中心的 强大的 危险的 物理和虚拟寻址 计算机系统的主存被组织成一个由M个连续的字节大小的单元 ...

  4. 信息安全系统设计基础exp_1

    详见搭档20135322郑伟博客链接:http://www.cnblogs.com/zhengwei0712/

  5. 讽刺的是,我在linux下使用最多的命令,竟然是windows的

    $ history | awk '{print $2}' | sort | uniq -c | sort -nr | head dir vi echo cd vim jobs gcc ls less ...

  6. 20145233《Java程序设计》课程总结

    20145233 <Java程序设计>学习总结 每周学习博客汇总 20145233韩昊辰 第一周总结 20145233韩昊辰 第二周总结 20145233韩昊辰 第三周总结 2014523 ...

  7. unity3d NGUI制作角色展示框

    最近在搞赛车漂移,所以一直没有更新博客 现在已经实现圈数检测.复位点检测.反向检测等功能 本来准备写成三篇文章的,太忙了,等过段时间不忙了在写吧 今天有朋友问我3D角色怎么给他固定在一个框里面 这个功 ...

  8. WDCP安装并配置php5.4和mongodb

    记录一下,免得忘了.全部都是自己测试用过的安装过程没有问题. linux常用命令 mv 移动文件 mkdir 创建文件夹 rm 删除 cp 复制 netstat 网络状态 tar 解压 wget 下载 ...

  9. 小白学习mysql之优化基础(EXPLAIN的连接类型)

    ## 导语很多情况下,有很多人用各种select语句查询到了他们想要的数据后,往往便以为工作圆满结束了.这些事情往往发生在一些学生亦或刚入职场但之前又没有很好数据库基础的小白身上,但所谓闻道有先后,只 ...

  10. SpringMVC实现Restful风格的WebService

    1.环境 JDK7 MyEclipse2014 tomcat8 maven 3.3.3 spring4.1.4 2.创建maven工程 使用MyEclipse创建maven工程的方式可以参考这篇博文( ...