圖解SQL聯結:右聯結
- 2019 年 11 月 29 日
- 筆記
今天我們用下面的表來學習右聯結。其中,
學生表(student):用來記錄學生的基本資訊
成績表(score):用來記錄學生選修課程的成績

1.什麼是右聯結?
右聯結,會將右側表中的數據全部取出來。下面圖片中用文氏圖畫出了右聯結,是紅圈中的部分。

2.右聯結是如何運行的?
下圖是右聯結的運行過程:

第1步,取出符合條件的行
兩個表通過學號進行右聯結,會將右側的表作為主表,主表中的數據全部取出來,也就是將成績表裡的數據全部取出來。
左邊的表只選出和右邊表相同學號的行,也就是學號0001所在的1行數據
第2步,將兩個表裡取出的數據合併,如何合併呢?
這裡就是進行交叉聯結了。因為學號0005在左邊的表裡沒有對應的行,所以這一行對應列的值是空值。
3.右聯結sql語句怎麼寫?
在圖片里我加上了右聯結對應的sql語句:

我們來看這個sql語句的3個關鍵地方:
1)第1個關鍵地方是在from子句
之前的from子句中只有1張表,而現在我們在from子句中同時使用了2張表。
由於表名太長,會影響sql的可讀性,所以這裡使用as對每個表起了別名,方便使用。在sql語句中我們給學生表起了別名叫做a,給成績表起了別名叫做b。
在使用到列名的時候,為了方便區分這個列是哪個表的,所以會在列名前面加上表名.,所以你會看到在selec子句里的列名前面都加了表名。
因為這裡select子句只查找出學號,姓名,課程號,所以最終查詢結果是虛框裡面的列。
2)第2個關鍵地方是from子句中用right join將兩個表聯結起來。
這裡的right join就表示聯結方式是右聯結,選取出同時存在於兩張表中的數據。
3)第3個關鍵地方是from子句中的關鍵字on後面的表示兩個表通過哪個列匹配產生關係的,這裡寫的on a.學號=b.學號,表示兩個表通過學號關聯起來。
4.右聯結變種
在右聯結的基礎上,我們再看一個問題,圖片中紅色部分的地方如何用sql表示呢?

這是在右聯結的基礎上去掉了,兩個表中共同的地方,也就是去掉了兩個圓圈的公共部分。
我們在剛才右聯結的sql語句中,加入一個where子句 裡面的條件是左邊表的學號為空值,這樣就選出了右邊表,但是不屬於兩個表公共部分的數據,也就是圖片中紅色的地方:

你開將前面學過的聯結在草稿紙上畫出來,親自理解下整個過程
