mysql left join用法分析

left join这个命令我们会常用到了,LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行,下面我们来看看关于它的一些用法与其它命令配合使用的问题.

先看它的语法:

LEFT JOIN 关键字会从左表(table_name1)那里返回所有的行,即使在右表.

(table_name2) 中没有匹配的行.

LEFT JOIN 关键字语法,代码如下:

  1. SELECT column_name(s)
  2. FROM table_name1
  3. LEFT JOIN table_name2
  4. ON table_name1.column_name=table_name2.column_name

给个通俗的解释吧.

  1. 例表a
  2. aid adate
  3. 1 a1
  4. 2 a2
  5. 3 a3
  6. 表b
  7. bid bdate
  8. 1 b1
  9. 2 b2
  10. 4 b4

两个表a,b相连接,要取出id相同的字段,代码如下:

select * from a inner join b on a.aid = b.bid

这是仅取出匹配的数据,此时的取出的是"

1 a1 b1

2 a2 b2

那么left join 指:select * from a left join b on a.aid = b.bid

首先取出a表中所有数据,然后再加上与a,b匹配的的数据,此时的取出的是:

1 a1 b1

2 a2 b2

3 a3 空字符

同样的也有right join,指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据 ,此时的取出的是:

1 a1 b1

2 a2 b2

4 空字符 b4

在left join中on 与where的分析.

•ON 子句与 WHERE 子句的不同

•一种更好地理解带有 WHERE ... IS NULL 子句的复杂匹配条件的简单方法

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

如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据,在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤.

让我们看一个 LFET JOIN 示例,代码如下:

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

用例子来理解最好不过了,代码如下:

  1. mysql> SELECT * FROM product LEFT JOIN product_details
  2. ON (product.id = product_details.id)
  3. AND product_details.id=2;
  4. +----+--------+------+--------+-------+
  5. | id | amount | id | weight | exist |
  6. +----+--------+------+--------+-------+
  7. | 1 | 100 | NULL | NULL | NULL |
  8. | 2 | 200 | 2 | 22 | 0 |
  9. | 3 | 300 | NULL | NULL | NULL |
  10. | 4 | 400 | NULL | NULL | NULL |
  11. +----+--------+------+--------+-------+
  12. 4 rows in set (0.00 sec)
  13. mysql> SELECT * FROM product LEFT JOIN product_details
  14. ON (product.id = product_details.id)
  15. WHERE product_details.id=2;
  16. +----+--------+----+--------+-------+
  17. | id | amount | id | weight | exist |
  18. +----+--------+----+--------+-------+
  19. | 2 | 200 | 2 | 22 | 0 |
  20. +----+--------+----+--------+-------+
  21. 1 row in set (0.01 sec)

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

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