用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > mysql教程

mysql left join用法分析

时间:2015-01-23  来源:西部数据  作者:西部数据

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.  
  7. mysql> CREATE TABLE `product_details` ( 
  8.   `id` int(10) unsigned NOT NULL
  9.   `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. --phpfensi.com 
  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; 

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

  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. 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的数据中过滤掉不符合条件的数据行.

来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
栏目更新
栏目热门