即使你认为自己已对 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, |
| 05 |
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
| 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, |
| 12 |
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
| 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 |
| 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 |
| 24 |
mysql> SELECT * FROM product; |
| 33 |
4 rows in set (0.00 sec) |
| 35 |
mysql> SELECT * FROM product_details; |
| 37 |
| id | weight | exist | |
| 44 |
4 rows in set (0.00 sec) |
| 46 |
mysql> SELECT * FROM product LEFT JOIN product_details |
| 47 |
ON (product.id = product_details.id); |
| 49 |
| id | amount | id | weight | exist | |
| 51 |
| 1 | 100 | NULL | NULL | NULL | |
| 52 |
| 2 | 200 | 2 | 22 | 0 | |
| 53 |
| 3 | 300 | NULL | NULL | NULL | |
| 54 |
| 4 | 400 | 4 | 44 | 1 | |
| 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; |
| 05 |
| id | amount | id | weight | exist | |
| 07 |
| 1 | 100 | NULL | NULL | NULL | |
| 08 |
| 2 | 200 | 2 | 22 | 0 | |
| 09 |
| 3 | 300 | NULL | NULL | NULL | |
| 10 |
| 4 | 400 | NULL | NULL | NULL | |
| 12 |
4 rows in set (0.00 sec) |
| 14 |
mysql> SELECT * FROM product LEFT JOIN product_details
|