1. 程式人生 > >SQL中Left Join、Right Join和Inner Join的使用

SQL中Left Join、Right Join和Inner Join的使用

1、表結構

表A                                     表B

2、Left Join

示例:2.1

Select * From A left join B on A.aid = B.bid;

left join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的。 換句話說,左表A的記錄將會全部表示出來,而右表B只會顯示符合搜尋條件的記錄(例子中為: A.aid = B.bid),B表記錄不足的地方均為NULL.

  • A表所有記錄都會顯示,A表中沒有被匹配的行(如aid=5、6的行)相應內容則為NULL。
  • 返回的記錄數一定大於A表的記錄數,如A表中aid=7行被B表匹配了3次(因為B表有三行bid=7)。

注意:在Access中A.aid、B.bid不能縮寫成aid、bid,否則會提示“不支援連結表示式”,這一點不同於Where查詢。

3、Right Join

示例:3.1

Select * From A right join B on A.aid = B.bid;

仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充。

4、Inner Join

示例:4.1

Select * From A inner join B on A.aid = B.bid;

這裡只顯示出了 A.aid = B.bid的記錄.這說明inner join並不以誰為基礎,它只顯示符合條件的記錄。

inner join 等同於Where查詢如:

Select * From A, B Where A.aid = B.bid

5、表的關聯修改和刪除

5.1修改

示例:5.1.1

update A left join B on A.aid = B.bid
set A.aname = B.bname

上述SQL實際操作的表為"Select * From A left join B on A.aid = B.bid",因此Access會提示更新13條記錄(Select查詢出的記錄就是13條)。對比“示例:2.1”返回的結果,分析update後的A表:

  • aid=5、6的記錄,被更新為NULL
  • aid=7的記錄,被更新了3次,依次是“b1997-1”、“b1997-2”、“b1997-3”,因此其結果為最後一次更新“b1997-3”

對於上述SQL同樣可以e = B.bna將“A.anamme”改成“B.bname = A.aname”,執行後B表將會被修改,但是執行後B表會增加三行“0, a2005-1;0, a2005-2;0, a2006”,這也不難理解,因為Left Join執行後,B表會出現三行空值。

示例:5.1.2

Where條件查詢在上面的SQL中同樣可以使用,其作用的表也是Select查詢出的關聯表。如下SQL

update A left join B on A.aid = B.bid
set A.aname = B.bname
where A.aid <> 5

執行後A表的結果:

對比第一次update可以發現,aid=5的並沒有被更新。

這裡只講述left join,因為right join 和 inner join的處理過程等同於left join。另外Access中update語句中不能含有From關鍵字,這一點不同於其他資料庫。

5.2刪除

在Access中是不可以通過Left Join、Right Join、Inner Join來刪除某張表的記錄

示例:5.2.2

Delete From A inner join B on A.aid = B.bid
where B.bname = "b1991"

上述SQL的本意是刪除A表中aid=1的記錄,但執行後表A和表B均未發生任何變化。若想實現此目的,下述SQL可以實現

Delete From A
Where A.aid In (Select bid From B Where B.bname="b1991")

6、笛卡爾積

如果A表有20條記錄,B表有30條記錄,則二者關聯後的笛卡爾積工20*30=600條記實錄。也就是說A表中的每條記錄都會於B表的所有記錄關聯一次,三種關聯方式實際上就是對“笛卡爾積”的處理方式不同。