SQL - 全連線



SQL 全連線

SQL 全連線 透過整體連線兩個表來建立一個新表。連線後的表包含兩個表中的所有記錄,併為任一側缺少的匹配項填充 NULL 值。簡而言之,全連線是一種外部連線,它組合了左連線和右連線的結果集。

MySQL 不支援全外部連線。您可以透過對從左連線和右連接獲得的結果集執行聯合運算來模擬其工作方式。

讓我們藉助下面的維恩圖詳細瞭解這個概念。假設我們有兩個表作為兩個集合(用圓圈表示)。使用全連接獲得的結果集(或新連線的表)只不過是這兩個集合的並集。

Full Join
您還可以透過對左連線和右連線的結果集執行 UNION 操作來獲得 FULL JOIN 的等效結果集。

語法

以下是 SQL 中全連線的基本語法:

SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;

示例

假設我們建立了一個名為 CUSTOMERS 的表,其中包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和薪水等。使用以下查詢:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

現在使用 INSERT 語句將值插入此表,如下所示:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

建立的表將如下所示:

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

讓我們建立另一個名為 ORDERS 的表,其中包含所下訂單的詳細資訊以及下單日期。

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2)
);

使用 INSERT 語句,將值插入此表,如下所示:

INSERT INTO ORDERS VALUES 
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

該表顯示如下:

OID 日期 CUSTOMER_ID 金額
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

以下查詢在 SQL Server 中連線兩個表 CUSTOMERS 和 ORDERS:

SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

輸出

生成的表如下所示:

ID 姓名 金額 日期
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 Kaushik 3000 2009-10-08 00:00:00
3 Kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

使用全連線連線多個表

全連線查詢還可以用於連線多個表。為此,我們一次順序組合兩個表,直到所有表都連線在一起。

請注意,在 MySQL 資料庫中,沒有直接使用 FULL JOIN 關鍵字對多個表執行連線操作的規定。相反,一次計算兩個表的左連線和右連線的 UNION,直到所有表都連線。

語法

使用全連線連線多個表的語法如下所示:

SELECT column1, column2, column3... 
FROM table1
FULL JOIN table2
ON condition_1
FULL JOIN table3
ON condition_2
....
....
FULL JOIN tableN
ON condition_N;

示例

為了演示全連線,讓我們考慮我們之前建立的示例表 CUSTOMERS 和 ORDERS,並使用以下查詢建立另一個名為 EMPLOYEE 的表:

CREATE TABLE EMPLOYEE (
   EID INT NOT NULL,
   EMPLOYEE_NAME VARCHAR (30) NOT NULL,
   SALES_MADE DECIMAL (20)
);

現在,我們可以使用 INSERT 語句將值插入這些空表中,如下所示:

INSERT INTO EMPLOYEE VALUES
(102, 'SARIKA', 4500),
(100, 'ALEKHYA', 3623),
(101, 'REVATHI', 1291),
(103, 'VIVEK', 3426);

建立的 EMPLOYEE 表將如下所示:

EID 員工姓名 銷售額
102 SARIKA 4500
100 ALEKHYA 3623
101 REVATHI 1291
103 VIVEK 3426

讓我們使用以下給出的全連線查詢連線這三個表:

SELECT CUSTOMERS.ID, CUSTOMERS.NAME, ORDERS.DATE, EMPLOYEE.EMPLOYEE_NAME 
FROM CUSTOMERS 
FULL JOIN ORDERS 
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID 
FULL JOIN EMPLOYEE 
ON ORDERS.OID = EMPLOYEE.EID; 

透過此查詢,我們將顯示客戶的 ID、名稱以及訂單的日期以及銷售該商品的員工的姓名。

輸出

獲得的結果表如下所示:

ID 姓名 日期 員工姓名
1 Ramesh NULL NULL
2 Khilan 2009-11-20 00:00:00 REVATHI
3 Kaushik 2009-10-08 00:00:00 ALEKHYA
3 Kaushik 2009-10-08 00:00:00 SARIKA
4 Chaitali 2008-05-20 00:00:00 VIVEK
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

帶有 WHERE 子句的全連線

連線使用 ON 子句預設過濾記錄。假設還需要根據特定條件/約束過濾這些記錄,我們也可以將 WHERE 子句與連線一起使用。

語法

與 WHERE 子句一起使用全連線的語法如下所示:

SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;

示例

考慮之前的兩個表 CUSTOMERS 和 ORDERS,並使用以下全連線查詢連線它們,方法是使用 WHERE 子句應用一些約束。

SELECT ID, NAME, DATE, AMOUNT FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
WHERE ORDERS.AMOUNT > 2000.00;

輸出

在對全連線應用 WHERE 子句後,結果表包含金額值大於 2000.00 的行:

ID 姓名 日期 金額
3 Kaushik 2009-10-08 00:00:00 3000.00
4 Chaitali 2008-05-20 00:00:00 2060.00
廣告
© . All rights reserved.