MySQL - 全連線



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

MySQL 全連線

在 MySQL 中,沒有執行全連線操作的規定。但是,我們可以模擬此操作以產生相同的結果。

從執行全連接獲得的結果集是左連線和右連接獲得的結果集的並集。因此,我們可以首先從左連線和右連線操作中檢索結果集,然後使用 UNION 關鍵字將它們組合起來。

但是,此方法僅適用於不存在重複記錄的情況。如果我們想要包含重複行,則最好使用 UNION ALL 關鍵字來組合結果集。

語法

以下是模擬全連線的基本語法:

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field

[UNION | UNION ALL]

SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

示例

在這個例子中,我們使用 UNION 或 UNION ALL 關鍵字模擬全連線操作。首先,讓我們使用以下查詢建立一個名為 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 語句向該表插入值,如下所示:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
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 日期 (DATE) 客戶ID (CUSTOMER_ID) 金額 (AMOUNT)
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

全連線查詢:

執行以下查詢後,我們將生成 CUSTOMERS 和 ORDERS 兩張表的並集。

SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION
SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
RIGHT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

輸出

生成的表如下所示:

ID 姓名 (NAME) 金額 (AMOUNT) 日期 (DATE)
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

帶 WHERE 子句的全連線

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

語法

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

SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name = table_name2.column_name
WHERE condition

示例

考慮之前的 CUSTOMERS 和 ORDERS 兩張表,並透過使用 WHERE 子句應用某些約束條件來使用以下全連線查詢將它們連線起來。

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

UNION 

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

輸出

在將 where 子句與全連線一起使用後,生成的表包含金額值大於 2000.00 的行。

ID 姓名 (NAME) 日期 (DATE) 金額 (AMOUNT)
3 Kaushik 2009-10-08 00:00:00 3000.00
4 Chaitali 2008-05-20 00:00:00 2060.00
廣告