關(guān)于 “A LEFT JOIN B ON 條件表達(dá)式” 的一點(diǎn)提醒
創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元東安做網(wǎng)站,已為上家服務(wù),為東安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
ON 條件(“A LEFT JOIN B ON 條件表達(dá)式”中的ON)用來決定如何從 B 表中檢索數(shù)據(jù)行,即使on中包含有A表中的列的限制條件,也不會(huì)過濾A的任何數(shù)據(jù)(A的數(shù)據(jù)只會(huì)通過where過濾)。
如果 B 表中沒有任何一行數(shù)據(jù)匹配 ON 的條件,將會(huì)額外生成一行所有列為 NULL 的數(shù)據(jù)
在匹配階段 WHERE 子句的條件都不會(huì)被使用。僅在匹配階段完成以后,WHERE 子句條件才會(huì)被使用。它將從匹配階段產(chǎn)生的數(shù)據(jù)中檢索過濾。
讓我們看一個(gè) LFET JOIN 示例:
01
mysql CREATE TABLE `product`
(
02
`id` int(10)
unsigned NOT NULL auto_increment,
03
`amount` int(10)
unsigned default NULL,
04
PRIMARY KEY (`id`)
05
)
ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
06
07
mysql CREATE TABLE `product_details`
(
08
`id` int(10)
unsigned NOT NULL,
09
`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
4 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
4 rows in set (0.00
sec)
45
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
4 rows in set (0.00
sec)
ON 子句和 WHERE 子句有什么不同?
一個(gè)問題:下面兩個(gè)查詢的結(jié)果集有什么不同么?
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;
用例子來理解最好不過了:
01
mysql SELECT * FROM product LEFT JOIN product_details
02
ON (product.id
= product_details.id)
03
AND product_details.id=2;
04
+----+--------+------+--------+-------+
05
|
id | amount | id | weight | exist |
06
+----+--------+------+--------+-------+
07
|
1 | 100 | NULL | NULL | NULL |
08
|
2 | 200 | 2 | 22 | 0 |
09
|
3 | 300 | NULL | NULL | NULL |
10
|
4 | 400 | NULL | NULL | NULL |
11
+----+--------+------+--------+-------+
12
4 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表中檢索符合的所有數(shù)據(jù)行。
第二條查詢做了簡單的LEFT JOIN,然后使用 WHERE 子句從 LEFT JOIN的數(shù)據(jù)中過濾掉不符合條件的數(shù)據(jù)行。
再來看一些示例:
01
mysql
02
mysql SELECT * FROM product LEFT JOIN product_details
03
ON product.id
= product_details.id
04
AND product.amount=100;
05
+----+--------+------+--------+-------+
06
|
id | amount | id | weight | exist |
07
+----+--------+------+--------+-------+
08
|
1 | 100 | NULL | NULL | NULL |
09
|
2 | 200 | NULL | NULL | NULL |
10
|
3 | 300 | NULL | NULL | NULL |
11
|
4 | 400 | NULL | NULL | NULL |
12
+----+--------+------+--------+-------+
13
4 rows in set (0.00
sec)
所有來自product表的數(shù)據(jù)行都被檢索到了,但沒有在product_details表中匹配到記錄(product.id = product_details.id AND product.amount=100 條件并沒有匹配到任何數(shù)據(jù))
01
mysql SELECT * FROM product LEFT JOIN product_details
02
ON (product.id
= product_details.id)
03
AND product.amount=200;
04
+----+--------+------+--------+-------+
05
|
id | amount | id | weight | exist |
06
+----+--------+------+--------+-------+
07
|
1 | 100 | NULL | NULL | NULL |
08
|
2 | 200 | 2 | 22 | 0 |
09
|
3 | 300 | NULL | NULL | NULL |
10
|
4 | 400 | NULL | NULL | NULL |
11
+----+--------+------+--------+-------+
12
4 rows in set (0.01
sec)
同樣,所有來自product表的數(shù)據(jù)行都被檢索到了,有一條數(shù)據(jù)匹配到了。
join 經(jīng)常用來做關(guān)聯(lián)查詢,可以把兩張或者多張表用通過關(guān)聯(lián)條件關(guān)聯(lián)起來做數(shù)據(jù)查詢
在使用join查詢的時(shí)候要區(qū)分主表和附表,jion ...on .....and
on: 表之間的關(guān)聯(lián)條件
and:對(duì)附表做篩選
內(nèi)連接,兩個(gè)關(guān)聯(lián)的表都為主表,所以他們的做條件篩選的順序是:先連接,后篩選。此時(shí) join ...on ... and =join...on... where ....
左連接,這時(shí)候左邊的表就是主表,所以,主表的數(shù)據(jù)會(huì)全部展示出來,右邊的表為附表,此時(shí)on連接后在通過and進(jìn)行篩選的條件對(duì)主表不起作用,只對(duì)附表起作用。先篩選再連接
右連接,右邊的表為主表,左邊表變成附表,如果on后面又and 做篩選條件的話,和left join一樣 也是先篩選后連接。
Where查詢條件,on內(nèi)外連接時(shí)候用,as作為別名,in查詢某值是否在某條件里
當(dāng)前文章:mysql里面on怎么用 mysql中on的用法
本文地址:http://jinyejixie.com/article14/hpcide.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、企業(yè)建站、域名注冊(cè)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)