在實際應用中,大多的查詢都是須要多表鏈接查詢的,但不少初學SQL的小夥伴總對各類JOIN有些迷糊。回想一下,初期很長一段時間,我經常使用的彷佛也就是等值鏈接 WHERE 後面加等號,對各類JOIN也是不求甚解,今天索性就來個JOIN的小總結。spa
首先,設定兩張表,做爲下面例子的操做對象。3d
表1 學生信息表code
表2 專業班級表對象
再來個SQL JOIN鏈接查詢各類用法的大合影,先預熱一下。blog
這是最經常使用的,獲取兩個表中指定字段知足匹配關係的記錄。get
內鏈接一般有兩種狀況:io
🅰 等值鏈接:查找兩個表中鏈接字段相等的記錄。class
--查詢每一個學生的學號、姓名、籍貫、年齡、專業、班級 --涉及到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'
獲取左表中的全部記錄,即便在右表沒有對應匹配的記錄。im
--左鏈接:顯示左表student全部記錄,如右表中沒有與之 --匹配的項則以NULL值代替。 SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級 FROM student A LEFT JOIN major B ON A.學號=B.學號
用於獲取右表中的全部記錄,即便左表沒有對應匹配的記錄。
--右鏈接:顯示右表major全部記錄,如左表中沒有與之 --匹配的項則以NULL值代替。 SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級 FROM student A RIGHT JOIN major B ON A.學號=B.學號
返回兩個表中的全部行。
--徹底鏈接:顯示兩張表的並集,若是其中一張表的記錄 --在另外一張表中沒有匹配的行,則對應的數據項填充NULL SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級 FROM student A FULL JOIN major B ON A.學號=B.學號
結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。
--交叉鏈接:一張表中的數據依次取出分別與另外一張表中的 --每條數據挨個組合,最後記錄數量爲兩張表記錄數的乘積 SELECT * FROM student CROSS JOIN major --本例student和major都爲7條記錄,因此結果爲7*7=49條記錄
返回左表有但右表沒有關聯數據的記錄。
--左表惟一:將右表B以及兩張表交集的部分過濾掉, --獲得的記錄是左表中惟一存在的。 SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級 FROM student A LEFT JOIN major B ON A.學號=B.學號 WHERE B.學號 IS NULL
返回右表有但左表沒有關聯數據的記錄。
--右表惟一:將左表A以及兩張表交集的部分過濾掉, --獲得的記錄是右表中惟一存在的。 SELECT A.學號, A.姓名, A.籍貫, A.年齡, B.專業, B.班級 FROM student A RIGHT JOIN major B ON A.學號=B.學號 WHERE A.學號 IS NULL
返回左表和右表裏沒有相互關聯的記錄。
--非交集鏈接:查找兩張表中沒有關聯的記錄項。 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 --------------------------