數據庫聯接:初學者的友好指南

你好,未來的數據庫大師!今天,我們將踏上一段令人興奮的旅程,進入數據庫聯接的世界。別擔心如果你之前從未寫過一行代碼——我將成為你的友好導師,我們將一步一步地攻克這個主題。在本教程結束時,你將能夠像專業人士一樣進行表聯接!

DBMS - Database Joins

什麼是數據庫聯接?

在我們深入了解不同類型的聯接之前,讓我們先理解一下聯接到底是什麼。想像你有兩個分開的列表:一個包含學生姓名和他們喜歡的顏色,另一個包含學生姓名和他們的成績。聯接就像神奇的膠水,它基於一個共通元素(在這個例子中是學生姓名)將這些列表組合起來,給你一個更全面的數據視圖。

現在,讓我們探索各種不同的聯接!

Θ(theta)聯接

Theta聯接就像所有聯接中的睿智老祖宗。它非常靈活,允許我們基於我們指定的任何條件來組合表。其名稱中的θ(theta)代表這個條件。

讓我們看一個例子:

SELECT *
FROM Students S, Grades G
WHERE S.StudentID = G.StudentID AND S.Age > 18

在這個例子中,我們正在基於兩個條件將學生表(Students)與成績表(Grades)進行聯接:

  1. 兩個表中的StudentID應該匹配
  2. 學生的年齡應該大於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