- SQL 教程
- SQL - 首頁
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 資料庫
- SQL - 語法
- SQL - 資料型別
- SQL - 運算子
- SQL - 表示式
- SQL 資料庫
- SQL - 建立資料庫
- SQL - 刪除資料庫
- SQL - 選擇資料庫
- SQL - 重新命名資料庫
- SQL - 顯示資料庫
- SQL - 備份資料庫
- SQL 表
- SQL - 建立表
- SQL - 顯示錶
- SQL - 重命名錶
- SQL - 清空表
- SQL - 克隆表
- SQL - 臨時表
- SQL - 修改表
- SQL - 刪除表
- SQL - 刪除表
- SQL - 約束
- SQL 查詢
- SQL - 插入查詢
- SQL - 選擇查詢
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - 更新查詢
- SQL - 刪除查詢
- SQL - 排序結果
- SQL 檢視
- SQL - 建立檢視
- SQL - 更新檢視
- SQL - 刪除檢視
- SQL - 重新命名檢視
- SQL 運算子和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布林 (BIT) 運算子
- SQL - LIKE 運算子
- SQL - IN 運算子
- SQL - ANY, ALL 運算子
- SQL - EXISTS 運算子
- SQL - CASE
- SQL - NOT 運算子
- SQL - 不等於
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 運算子
- SQL - UNION 運算子
- SQL - UNION vs UNION ALL
- SQL - INTERSECT 運算子
- SQL - EXCEPT 運算子
- SQL - 別名
- SQL 連線
- SQL - 使用連線
- SQL - 內連線
- SQL - 左連線
- SQL - 右連線
- SQL - 交叉連線
- SQL - 全連線
- SQL - 自連線
- SQL - 刪除連線
- SQL - 更新連線
- SQL - 左連線 vs 右連線
- SQL - UNION vs JOIN
- SQL 金鑰
- SQL - 唯一鍵
- SQL - 主鍵
- SQL - 外部索引鍵
- SQL - 組合鍵
- SQL - 備選鍵
- SQL 索引
- SQL - 索引
- SQL - 建立索引
- SQL - 刪除索引
- SQL - 顯示索引
- SQL - 唯一索引
- SQL - 聚集索引
- SQL - 非聚集索引
- 高階 SQL
- SQL - 萬用字元
- SQL - 註釋
- SQL - 注入
- SQL - 託管
- SQL - MIN & MAX
- SQL - NULL 函式
- SQL - CHECK 約束
- SQL - DEFAULT 約束
- SQL - 儲存過程
- SQL - NULL 值
- SQL - 事務
- SQL - 子查詢
- SQL - 處理重複項
- SQL - 使用序列
- SQL - 自動遞增
- SQL - 日期和時間
- SQL - 遊標
- SQL - 公共表表達式
- SQL - GROUP BY vs ORDER BY
- SQL - IN vs EXISTS
- SQL - 資料庫調優
- SQL 函式參考
- SQL - 日期函式
- SQL - 字串函式
- SQL - 聚合函式
- SQL - 數值函式
- SQL - 文字和影像函式
- SQL - 統計函式
- SQL - 邏輯函式
- SQL - 遊標函式
- SQL - JSON 函式
- SQL - 轉換函式
- SQL - 資料型別函式
- SQL 有用資源
- SQL - 問答
- SQL - 快速指南
- SQL - 有用函式
- SQL - 有用資源
- SQL - 討論
SQL - 全連線
SQL 全連線
SQL 全連線 透過整體連線兩個表來建立一個新表。連線後的表包含兩個表中的所有記錄,併為任一側缺少的匹配項填充 NULL 值。簡而言之,全連線是一種外部連線,它組合了左連線和右連線的結果集。
MySQL 不支援全外部連線。您可以透過對從左連線和右連接獲得的結果集執行聯合運算來模擬其工作方式。
讓我們藉助下面的維恩圖詳細瞭解這個概念。假設我們有兩個表作為兩個集合(用圓圈表示)。使用全連接獲得的結果集(或新連線的表)只不過是這兩個集合的並集。
您還可以透過對左連線和右連線的結果集執行 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 |