前面

在實際應用中,大多的查詢都是需要多表連接查詢的,但很多初學SQL的小夥伴總對各種JOIN有些迷糊。回想一下,初期很長一段時間,我常用的似乎也就是等值連接 WHERE 後面加等號,對各種JOIN也是不求甚解,今天索性就來個JOIN的小總結。

首先,設定兩張表,作為下面例子的操作對象。

表1 學生信息表

表2 專業班級表

再來個SQL JOIN連接查詢各種用法的大合影,先預熱一下。

No.1 【INNER JOIN】內連接

這是最常用的,獲取兩個表中指定欄位滿足匹配關係的記錄。

內連接通常有兩種情況:

?? 等值連接:查找兩個表中連接欄位相等的記錄。

--查詢每個學生的學號、姓名、籍貫、年齡、專業、班級
--涉及到student和major兩張表,用共有欄位「學號」為連接欄位

--寫法1:使用INNER JOIN
SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A
INNER JOIN major B
ON A.學號=B.學號

--寫法2:--省去了INNER,直接寫JOIN,與INNER JOIN沒有區別
SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A
JOIN major B
ON A.學號=B.學號

--寫法3: --使用WHERE,已經逐漸被淘汰
SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A, major B
WHERE A.學號=B.學號

--上面三種寫法的結果都是一樣的,推薦使用寫法2

?? 自身連接:就是和自己進行連接查詢,給一張表取兩個不同的別名,然後附上連接條件。

--要在學生表裡查詢與 HH 同齡且籍貫也相同的學生信息

SELECT B.學號, B.姓名, B.性別, B.籍貫, B.年齡
FROM student A
JOIN student B
ON A.年齡=B.年齡 AND A.籍貫=B.籍貫 AND A.姓名=HH

No.2 【LEFT JOIN】左連接

獲取左表中的所有記錄,即使在右表沒有對應匹配的記錄。

--左連接:顯示左表student所有記錄,如右表中沒有與之
--匹配的項則以NULL值代替。

SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A LEFT JOIN major B
ON A.學號=B.學號

No.3 【RIGHT JOIN】右連接

用於獲取右表中的所有記錄,即使左表沒有對應匹配的記錄。

--右連接:顯示右表major所有記錄,如左表中沒有與之
--匹配的項則以NULL值代替。

SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A RIGHT JOIN major B
ON A.學號=B.學號

No.4 【FULL JOIN】 完全連接

返回兩個表中的所有行。

--完全連接:顯示兩張表的並集,如果其中一張表的記錄
--在另一張表中沒有匹配的行,則對應的數據項填充NULL

SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A FULL JOIN major B
ON A.學號=B.學號

No.5 【CROSS JOIN】交叉連接

結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。

--交叉連接:一張表中的數據依次取出分別與另一張表中的
--每條數據挨個組合,最後記錄數量為兩張表記錄數的乘積

SELECT * FROM student CROSS JOIN major

--本例student和major都為7條記錄,所以結果為7*7=49條記錄

No.6 延伸【Left Excluding JOIN】左表唯一

返回左表有但右表沒有關聯數據的記錄。

--左表唯一:將右表B以及兩張表交集的部分過濾掉,
--得到的記錄是左表中唯一存在的。

SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A LEFT JOIN major B
ON A.學號=B.學號
WHERE B.學號 IS NULL

No.7 延伸【Right Excluding JOIN】右表唯一

返回右表有但左表沒有關聯數據的記錄。

--右表唯一:將左表A以及兩張表交集的部分過濾掉,
--得到的記錄是右表中唯一存在的。

SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A RIGHT JOIN major B
ON A.學號=B.學號
WHERE A.學號 IS NULL

No.8 延伸【Outer Excluding JOIN】非交集連接

返回左表和右表裡沒有相互關聯的記錄。

--非交集連接:查找兩張表中沒有關聯的記錄項。

SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級
FROM student A FULL JOIN major B
ON A.學號=B.學號
WHERE A.學號 IS NULL OR B.學號 IS NULL

最後

談及 SQL 裏的各種 JOIN 之間的區別時,被廣為引用的是 CodeProject 上C.L. Moffatt的文章, 本文也有所參考,感興趣的小夥伴可以去看一下。

codeproject.com/Article

OK! 就醬紫,拋磚引玉一下,更多JOIN的用法可以參看一下上面的鏈接。

-------------------------- END --------------------------


推薦閱讀:
相關文章