前面
在實際應用中,大多的查詢都是需要多表連接查詢的,但很多初學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的文章, 本文也有所參考,感興趣的小伙伴可以去看一下。
https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
OK! 就醬紫,拋磚引玉一下,更多JOIN的用法可以參看一下上面的鏈接。
-------------------------- END --------------------------