mysql left join用法分析
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> CREATE TABLE `product` (
- `id` int(10) unsigned NOT NULL auto_increment,
- `amount` int(10) unsigned default NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
- mysql> CREATE TABLE `product_details` (
- `id` int(10) unsigned NOT NULL,
- `weight` int(10) unsigned default NULL,
- `exist` int(10) unsigned default NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1
- mysql> INSERT INTO product (id,amount)
- VALUES (1,100),(2,200),(3,300),(4,400);
- Query OK, 4 rows affected (0.00 sec)
- Records: 4 Duplicates: 0 Warnings: 0
- mysql> INSERT INTO product_details (id,weight,exist)
- VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);
- Query OK, 4 rows affected (0.00 sec)
- Records: 4 Duplicates: 0 Warnings: 0
- 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)
- --phpfensi.com
- 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的数据中过滤掉不符合条件的数据行.