sql中的幾種連接類型


一、連接類型簡介

在sql中單表查詢的幾率相對來說比較少,隨着數據庫的日益復雜,多表關聯的情況越來越多,在多表關聯的情況下存在多種關聯的類型,

1、自關聯(join或inner join)

2、左外關聯(left join或left outer join)

3、右外關聯(right join或right outer join)

4、全關聯(full join)

二、各種關聯的使用

為了更形象的說明這幾種連接類型的使用場景及用法,下面以學生表(student)和學生選課表(course)表來演示,其表結構及數據如下圖,

上面是兩張表的結構及數據。

1、自關聯

有時需要得到完整的數據,我們需要關聯兩個或兩個以上的表,這時候便用到了自關聯,其中自關聯可以有下面兩種寫法,其一,

select s.s_id,s_name,c.c_name from student s,course c where s.s_id=c.s_id

運行上面的語句得到的結果如下,

其二的sql語句寫法如下,

select s.s_id,s_name,c.c_name from student s join course c on s.s_id=c.s_id;

運行上面的語句得到的結果如下,

從上面的結果,可以看到兩種寫法的結果是一樣的,同時也可以得出這樣一個結論:自關聯過濾出的數據必須滿足在左表和右表都符合條件,這里的條件只的s.s_id=c.s_id,也就是說s_id必須同時存在於兩個表中才會出現在結果中。

那么針對上面的兩種寫法哪種更好,這里認為哪種最好,適合的就是最好的。

對於自關聯來說,有個重要的問題需要注意那就是笛卡爾積,自關聯如果忘記寫關聯條件就會出現笛卡爾積的情況 ,關於笛卡爾積的情況,可以自查資料,這里以第二種sql寫法演示笛卡兒積的出現,

select s.s_id,s_name,c.c_name from student s   join course c ;

結果如下,

寫法即未加過濾條件(未加on或where條件),這樣出來的結果為兩個表中的數據行數的乘積,即4X5=20行,這就是笛卡兒積。

 

2、左外關聯/右外關聯

左外關聯和右外關聯其實可以看作同一種寫法,在使用上可以相互轉化。左外關聯即以左表為基本表,會展示所有的左表中的數據,如果在右表中沒有匹配的數據便為null,右外關聯剛好相反,

左外關聯,

select s.s_id,s_name,c.c_name from student s left  join course c 
on s.s_id=c.s_id;

運行結果如下,

可以看到結果數據集只有4行即為左表中的數據,但可以看到c_name列為null,這是因為在右表中沒有匹配的s_id為1004的記錄,所以此列為null。

右關聯

select s.s_id,s_name,c.c_name,c.s_id as c_s_id from student s right  join course c 
on s.s_id=c.s_id;

運行的結果如下,

可以看出結果集為5行數據,即為右表中的數據,以右表為基本表。結果中的為null的數據列是因為在左表中沒有匹配的記錄,所以為null。

3、全關聯

全關聯是只要其中某個表存在匹配的記錄,便會返回行。

這里是mysql的環境,暫無法給出實例。

 

有不當之處請指正,感謝!

由於這里的環境是mysql,mysql不支持full join的方式,這里暫不給出實例。


免責聲明!

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



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