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)
- --Vevb.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的數據中過濾掉不符合條件的數據行.
新聞熱點
疑難解答