msyqlleftjoinon后面多个条件(一)

2014-11-24 15:43:42 · 作者: · 浏览: 9

即使你认为自己已对 MySQL 的 LEFT JOIN 理解深刻,但我敢打赌,这篇文章肯定能让你学会点东西!

ON 子句与 WHERE 子句的不同一种更好地理解带有 WHERE ... IS NULL 子句的复杂匹配条件的简单方法
Matching-Conditions 与 Where-conditions 的不同

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

ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。

如果 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 4 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 4 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 4 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 4 rows in set (0.00 sec)
13
14 mysql> SELECT * FROM product LEFT JOIN product_details