數據庫聯接:初學者的友好指南
你好,未來的數據庫大師!今天,我們將踏上一段令人興奮的旅程,進入數據庫聯接的世界。別擔心如果你之前從未寫過一行代碼——我將成為你的友好導師,我們將一步一步地攻克這個主題。在本教程結束時,你將能夠像專業人士一樣進行表聯接!
什麼是數據庫聯接?
在我們深入了解不同類型的聯接之前,讓我們先理解一下聯接到底是什麼。想像你有兩個分開的列表:一個包含學生姓名和他們喜歡的顏色,另一個包含學生姓名和他們的成績。聯接就像神奇的膠水,它基於一個共通元素(在這個例子中是學生姓名)將這些列表組合起來,給你一個更全面的數據視圖。
現在,讓我們探索各種不同的聯接!
Θ(theta)聯接
Theta聯接就像所有聯接中的睿智老祖宗。它非常靈活,允許我們基於我們指定的任何條件來組合表。其名稱中的θ(theta)代表這個條件。
讓我們看一個例子:
SELECT *
FROM Students S, Grades G
WHERE S.StudentID = G.StudentID AND S.Age > 18
在這個例子中,我們正在基於兩個條件將學生表(Students)與成績表(Grades)進行聯接:
- 兩個表中的StudentID應該匹配
- 學生的年齡應該大於18
這個聯接將給我們一個包含兩個表所有列的結果,但僅限於18歲以上的學生。
等值聯接(Equijoin)
等值聯接是Theta聯接的一個特例,其條件總是等值比較。這就像說,“只有當這個列完全匹配時才進行表的聯接。”
這裡有一個例子:
SELECT S.Name, G.Subject, G.Grade
FROM Students S, Grades G
WHERE S.StudentID = G.StudentID
這個查詢將給我們一個學生姓名、科目和成績的列表,但只有在兩個表的StudentID匹配時才會出現。
自然聯接(⋈)
自然聯接就像懶惰程序員的最好朋友。它會自動基於相同名字的列進行表的聯接。這很方便,但請注意——如果你對所有的列名不是很清楚,它有时會給出意外的結果!
這是它的樣子:
SELECT *
FROM Students NATURAL JOIN Grades
這將會基於學生表和成績表共有的所有列(假設在這個例子中是StudentID)進行聯接。
外部聯接
現在,讓我們來談談外部聯接。當你希望即使另一表中沒有匹配的記錄也保留一個表的所有記錄時,這些聯接特別有用。外部聯接有三種類型:
左外部聯接(R ⟕ S)
左外部聯接會保留左表(R)的所有記錄,即使右表(S)中沒有匹配的記錄。
例子:
SELECT S.Name, G.Subject, G.Grade
FROM Students S LEFT OUTER JOIN Grades G
ON S.StudentID = G.StudentID
這個查詢會列出所有學生,即使他們還沒有任何成績記錄。
右外部聯接(R ⟖ S)
右外部聯接與左外部聯接相反。它會保留右表(S)的所有記錄,即使左表(R)中沒有匹配的記錄。
例子:
SELECT S.Name, G.Subject, G.Grade
FROM Students S RIGHT OUTER JOIN Grades G
ON S.StudentID = G.StudentID
這個查詢會列出所有成績,即使有些學生可能已從學生表中刪除。
完全外部聯接(R ⟗ S)
完全外部聯接就像是說,“我想要所有東西!”它會保留兩個表中的所有記錄,無論是否有匹配。
例子:
SELECT S.Name, G.Subject, G.Grade
FROM Students S FULL OUTER JOIN Grades G
ON S.StudentID = G.StudentID
這個查詢會給我們所有學生和所有成績的列表,即使一個學生沒有成績或者一個成績沒有對應的學生。
聯接類型比較
為了幫助你記住所有這些聯接,讓我們把它們放在一個方便的表格中:
聯接類型 | 描述 | 保留未匹配行從 |
---|---|---|
Theta 聯接 | 基於任何條件的聯接 | 沒有表 |
等值聯接 | 基於等值的聯接 | 沒有表 |
自然聯接 | 自動基於共有列的聯接 | 沒有表 |
左外部聯接 | 保留左表的所 |
Credits: Image by storyset