十分鐘掌握SQL連接:inner、outer、left、right
簡(jiǎn)介
結(jié)構(gòu)化查詢語(yǔ)言(SQL)是一種強(qiáng)大的編程語(yǔ)言,用于管理和操作數(shù)據(jù)庫(kù)。用戶可以進(jìn)行檢索、存儲(chǔ)、編輯和分析存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)。使用SQL的關(guān)鍵操作之一是“連接”,SQL中的連接功能能夠基于相關(guān)的列將兩個(gè)或多個(gè)表的數(shù)據(jù)進(jìn)行合并。
本文將解釋SQL中使用的四種主要類型的連接:內(nèi)連接、外連接、左連接和右連接。
什么是SQL中的連接
在數(shù)據(jù)庫(kù)的上下文中,連接操作是根據(jù)兩個(gè)或多個(gè)表之間的相關(guān)列,將它們的行組合起來(lái)。我們可以將連接看作是一種將多個(gè)表中的數(shù)據(jù)整合起來(lái)的方法,創(chuàng)建一個(gè)可以像單個(gè)實(shí)體一樣查詢的視圖。
下面是使用到的兩個(gè)表的例子:
-- Table: Customers
CREATE TABLE Customers (
ID INT,
NAME VARCHAR(100)
);
INSERT INTO Customers (ID, NAME) VALUES
(1, 'Bob'),
(2, 'Alice'),
(3, 'Mary'),
(4, 'John');
-- Table: Orders
CREATE TABLE Orders (
ORDER_ID INT,
CUSTOMER_ID INT,
PRODUCT VARCHAR(100)
);
INSERT INTO Orders (ORDER_ID, CUSTOMER_ID, PRODUCT) VALUES
(1001, 1, 'Laptop'),
(1002, 2, 'Phone'),
(1003, 4, 'TV'),
(1004, 3, 'Keyboard');
內(nèi)連接
內(nèi)連接是SQL中最常用的連接類型。它返回兩個(gè)表中具有匹配值的記錄。如果某條記錄在任何一個(gè)表中沒(méi)有匹配項(xiàng),則不包含在結(jié)果中。
我們根據(jù)Customers.ID和Orders.CUSTOMER_ID來(lái)連接這兩個(gè)表:
SELECT Customers.NAME, Orders.PRODUCT
FROM Customers
INNER JOIN Orders
ON Customers.ID = Orders.CUSTOMER_ID;
左連接(左外連接)
左連接或左外連接,返回左表中的所有記錄,以及右表中的匹配記錄。如果沒(méi)有匹配項(xiàng),則右側(cè)的結(jié)果為NULL。
假設(shè)我們還有一個(gè)沒(méi)有下任何訂單的客戶:
-- Adding a new customer
INSERT INTO Customers (ID, NAME) VALUES
(5, 'Emma');
如果現(xiàn)在執(zhí)行一個(gè)左連接:
SELECT Customers.NAME, Orders.PRODUCT
FROM Customers
LEFT JOIN Orders
ON Customers.ID = Orders.CUSTOMER_ID;
右連接(右外連接)
右連接或右外連接,返回右表中的所有記錄,以及左表中的匹配記錄。如果沒(méi)有匹配項(xiàng),則左側(cè)的結(jié)果為NULL。
假設(shè)我們的數(shù)據(jù)庫(kù)中有一個(gè)來(lái)自不在Customers表中列出的客戶的訂單:
-- Adding a new order
INSERT INTO Orders (ORDER_ID, CUSTOMER_ID, PRODUCT) VALUES
(1005, 6, 'Mouse');
如果現(xiàn)在執(zhí)行一個(gè)右連接:
SELECT Customers.NAME, Orders.PRODUCT
FROM Customers
RIGHT JOIN Orders
ON Customers.ID = Orders.CUSTOMER_ID;
全外連接
全外連接在左表或右表記錄中有匹配項(xiàng)時(shí),返回所有記錄。它是左連接和右連接的組合。如果沒(méi)有匹配項(xiàng),則任何一側(cè)的結(jié)果都為NULL。
使用修改過(guò)的Customers和Orders表來(lái)執(zhí)行一個(gè)全外連接:
SELECT Customers.NAME, Orders.PRODUCT
FROM Customers
FULL OUTER JOIN Orders
ON Customers.ID = Orders.CUSTOMER_ID;
請(qǐng)注意,并非所有的數(shù)據(jù)庫(kù)系統(tǒng)都支持全外連接。如果你的數(shù)據(jù)庫(kù)系統(tǒng)不支持它,你可以通過(guò)組合左連接和右連接來(lái)實(shí)現(xiàn)相同的結(jié)果。
總結(jié)
SQL連接(Joins)是一個(gè)強(qiáng)大的功能,允許我們根據(jù)相關(guān)列從兩個(gè)或多個(gè)表中組合數(shù)據(jù),它們是SQL和數(shù)據(jù)庫(kù)管理的重要組成部分。
掌握如何使用每種連接類型:內(nèi)連接(Inner Join)、左連接(Left Join)、右連接(Right Join)和全外連接(Full Outer Join),對(duì)于優(yōu)化您的SQL查詢和從數(shù)據(jù)庫(kù)中檢索正確的數(shù)據(jù)非常有幫助。