wxs2008

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

LEFT JOIN 关键字语法

 代码如下 复制代码 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name  

给个通俗的解释吧. 例表a aid adate 1 a1 2 a2 3 a3 表b bid bdate 1 b1 2 b2 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 示例:

 mysql> SELECT * FROM product;

+----+--------+ |

id | amount |

+----+--------+

|  1 |    100 |

|  2 |    200 |

|  3 |    300 |

|  4 |    400 |

+----+--------+

4 rows in set (0.00 sec)  

mysql> SELECT * FROM product_details;

+----+--------+-------+

| id | weight | exist |

+----+--------+-------+

|  2 |     22 |     0 |

|  4 |     44 |     1 |

|  5 |     55 |     0 |

|  6 |     66 |     1 |

+----+--------+-------+

4 rows in set (0.00 sec)  

mysql> SELECT * FROM product LEFT JOIN product_details        ON (product.id = product_details.id);

+----+--------+------+--------+-------+

| id | amount | id   | weight | exist |

+----+--------+------+--------+-------+

|  1 |    100 | NULL |   NULL |  NULL |

|  2 |    200 |    2 |     22 |     0 |

|  3 |    300 | NULL |   NULL |  NULL |

|  4 |    400 |    4 |     44 |     1 |

+----+--------+------+--------+-------+

4 rows in set (0.00 sec)  

ON 子句和 WHERE 子句有什么不同?

一个问题:下面两个查询的结果集有什么不同么?

 代码如下 复制代码 1. SELECT * FROM product LEFT JOIN product_details          ON (product.id = product_details.id)          AND   product_details.id=2; 2. SELECT * FROM product LEFT JOIN product_details          ON (product.id = product_details.id)          WHERE product_details.id=2;  

用例子来理解最好不过了:

 代码如下 复制代码

mysql> SELECT * FROM product LEFT JOIN product_details        ON (product.id = product_details.id)        AND product_details.id=2;

+----+--------+------+--------+-------+

| id | amount | id   | weight | exist |

+----+--------+------+--------+-------+

|  1 |    100 | NULL |   NULL |  NULL |

|  2 |    200 |    2 |     22 |     0 |

|  3 |    300 | NULL |   NULL |  NULL |

|  4 |    400 | NULL |   NULL |  NULL |

+----+--------+------+--------+-------+

4 rows in set (0.00 sec)  

mysql> SELECT * FROM product LEFT JOIN product_details        ON (product.id = product_details.id)        WHERE product_details.id=2;

+----+--------+----+--------+-------+

| id | amount | id | weight | exist |

+----+--------+----+--------+-------+

|  2 |    200 |  2 |     22 |     0 |

+----+--------+----+--------+-------+ 1 row in set (0.01 sec)  

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

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

 

posted on 2013-10-17 16:15  wxs2008  阅读(288)  评论(0编辑  收藏  举报