在本教學中,將瞭解各種SQL Server聯接,它們用於組合來自兩個表的數據。
在關係資料庫中,數據分佈在多個邏輯表中。 要獲得完整有意義的數據集,需要使用連接來查詢這些表中的數據。 SQL Server支持多種連接,包括內連接,左連接,右連接,全外連接和交叉連接。 每種連接類型指定SQL Server如何使用一個表中的數據來選擇另一個表中的行。
為了方便演示,下麵將創建一些示例表。
A. 創建示例表
首先,創建一個名為hr
的新模式:
CREATE SCHEMA hr;
GO
其次,在hr
模式中創建兩個名為candidate
和employees
的新表:
CREATE TABLE hr.candidates(
id INT PRIMARY KEY IDENTITY,
fullname VARCHAR(100) NOT NULL
);
CREATE TABLE hr.employees(
id INT PRIMARY KEY IDENTITY,
fullname VARCHAR(100) NOT NULL
);
第三,在candidate
和employees
表中插入一些行:
INSERT INTO
hr.candidates(fullname)
VALUES
('John Doe'),
('Lily Bush'),
('Peter Drucker'),
('Jane Doe');
INSERT INTO
hr.employees(fullname)
VALUES
('John Doe'),
('Jane Doe'),
('Michael Scott'),
('Jack Sparrow');
下麵將candidate
表用作左表,將employees
表用作右表。
B. SQL Server內聯接
內聯接生成一個數據集,其中包含左表中的行,這些行具有右表中的匹配行。
以下示例使用inner join
子句從employees
表中獲取在candidates
表的fullname
列中具有相同的值的行記錄:
SELECT
c.id candidate_id,
c.fullname candidate_name,
e.id employee_id,
e.fullname employee_name
FROM
hr.candidates c
INNER JOIN hr.employees e
ON e.fullname = c.fullname;
執行上面查詢語句,得到以下結果:
下圖說明瞭兩個結果集的內聯接的結果:
C. SQL Server左連接
左連接選擇從左表開始的數據和右表中的匹配行。 左連接返回左表中的所有行和右表中的匹配行。 如果左表中的行在右表中沒有匹配的行,則右表的列將具有空值。
左連接也稱為左外連接。 outer
關鍵字是可選的。
以下語句使用left join
將employees
表與employees
表連接起來:
SELECT
c.id candidate_id,
c.fullname candidate_name,
e.id employee_id,
e.fullname employee_name
FROM
hr.candidates c
LEFT JOIN hr.employees e
ON e.fullname = c.fullname;
執行上面查詢語句,得到以下結果:
以下圖說明瞭兩個結果集的左連接結果:
要獲取僅在左表中可用但不在右表中可用的行,可以在上面的查詢中添加WHERE
子句:
SELECT
c.id candidate_id,
c.fullname candidate_name,
e.id employee_id,
e.fullname employee_name
FROM
hr.candidates c
LEFT JOIN hr.employees e
ON e.fullname = c.fullname
WHERE
e.id IS NULL;
執行上面查詢語句,得到以下結果:
以下圖說明左連接的結果,它選擇僅在左表中可用的行:
D. SQL Server右連接
右連接或右外連接從右表開始選擇數據。 它是左連接的反轉版本。
右連接返回一個結果集,該結果集包含右表中的所有行和左表中的匹配行。 如果右表中的一行在左表中沒有匹配的行,則左表中的所有列都將包含NULL
值。
以下示例使用右連接查詢candidates
和 employees
表中的行:
SELECT
c.id candidate_id,
c.fullname candidate_name,
e.id employee_id,
e.fullname employee_name
FROM
hr.candidates c
RIGHT JOIN hr.employees e
ON e.fullname = c.fullname;
執行上面查詢語句,得到以下結果:
請注意,右表(employees
)中的所有行都包含在結果集中。
下圖表說明了兩個結果集的右連接:
類似地,可以通過向上面的查詢添加WHERE
子句來獲取僅在右表中可用的行,如下所示:
SELECT
c.id candidate_id,
c.fullname candidate_name,
e.id employee_id,
e.fullname employee_name
FROM
hr.candidates c
RIGHT JOIN hr.employees e
ON e.fullname = c.fullname
WHERE
c.id IS NULL;
執行上面查詢語句,得到以下結果:
下圖說明瞭查詢操作的結果:
E. SQL Server全連接
完整外連接或完全連接返回一個結果集,該結果集包含左右表中的所有行,兩側的匹配行可用。 如果沒有匹配,則缺少的一方將具有NULL
值。
以下示例顯示如何在candidates
和 employees
表之間執行完全聯接:
SELECT
c.id candidate_id,
c.fullname candidate_name,
e.id employee_id,
e.fullname employee_name
FROM
hr.candidates c
FULL JOIN hr.employees e
ON e.fullname = c.fullname;
執行上面查詢語句,得到以下結果:
下圖說明瞭全連接:
要選擇存在左表或右表的行,可以通過添加WHERE
子句來排除兩個表共有的行,如以下查詢中所示:
SELECT
c.id candidate_id,
c.fullname candidate_name,
e.id employee_id,
e.fullname employee_name
FROM
hr.candidates c
FULL JOIN hr.employees e
ON e.fullname = c.fullname
WHERE
c.id IS NULL OR
e.id IS NULL;
執行上面查詢語句,得到以下結果:
下圖說明瞭上述操作的結果:
在本教學中,學習了各種SQL Server連接,這些連接組合了兩個表中的數據。