一、連接類型簡介
在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的方式,這里暫不給出實例。