MySQL的left join中on与where的区别

关于 “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的区别

时间: 2025-01-19 17:36:48

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

left join中where与on的区别

举例进行说明,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两个表来对MySQL关联left join 条件on与where 条件的不同之处进行讲述. 1.数据准备 创建products表并插入数据 drop table if exists products; CREATE TABLE `products` ( `pid` INT (3) NOT NULL auto_increment, `pname` VARCHAR (20) NOT

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

今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 日期                  交易次数   交易金额 2009-4-01           1              10 2009-4-02           2              20 2009-4-03           0              0 2009-4-04          5                50 一开始我用的左连接,用on做为两表关联条件,用wher

Oracle的left join中on和where的区别

在使用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.selec

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

关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行. 如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据 在匹配阶段 WHERE 子句的条件都不会被使用.仅在匹配阶段完成以后,WHERE 子句条件才会被使用.它将从匹配阶段产生的数据中检索过滤. ON 条件决定了从 LEFT JOIN的 product_details表中检索符合的所有

SQL JOIN 中 on 与 where 的区别

left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join : 内连接,又叫等值连接,只返回两个表中连接字段相等的行. full join : 外连接,返回两个表中的行:left join + right join. cross join : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数. 关键字 on 数据库在通过连接两张或多张表来返回记录时,都会生成一张

Hive Left Join 中 On 与 Where 的区别

条件写在on里,join的时候处理,满足条件的join,不满足条件的不join,但是都会显示 条件写在where里,join完了处理,满足条件的显示,不满足条件的不显示 参考文献: https://blog.csdn.net/qq_20641565/article/details/52950087 原文地址:https://www.cnblogs.com/jhc888007/p/11599533.html

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

需要知道sql中关键字的执行顺序. FROM-> ON->JOIN-> WHERE->GROUP BY-> HAVING->SELECT-> DISTINCT->ORDER BY->LIMIT on在join前边.join在where前边.知道这两点,那就好说了. 注意join中的on是对关联表起作用,不是对主表. 如果想过滤主表中的数据,要用where. 具体案例可以参照:http://xianglp.iteye.com/blog/868957

MySQL关联left join 条件on与where不同,很实用,但要慎用

在mysql查询中,有时候业务复杂了,不得不写多表查询:很多程序猿前期都喜欢写子查询,因为子查询简单易懂,不容易出问题,但子查询的效率毕竟不如关联查询:关联查询我觉得是把双刃剑,在不懂它的机制时,还是慎用,我碰到过以前的同事,因为关联查询没写好,把奖品(查询活动中奖信息)发错的,还好大奖不是汽车: 网上摘的例子,比较好理解 MySQL关联left join条件on和where条件的区别表的结构 `products` CREATE TABLE `products` ( `pid` int(3) N

mysql的left join使用on与where筛选的差异

举例进行说明,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两个表来对MySQL关联left join 条件on与where 条件的不同之处进行讲述. 1.数据准备 创建products表并插入数据 drop table if exists products; CREATE TABLE `products` ( `pid` INT (3) NOT NULL auto_increment, `pname` VARCHAR (20) NOT