Access 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同樣可以將“A.aname = B.bname”改成“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表的所有記錄關聯一次,三種關聯方式實際上就是對“笛卡爾積”的處理方式不同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM