- 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 - BOOLEAN (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 - 空函式
- SQL - 檢查約束
- SQL - 預設約束
- 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 - 左連線
連線用於根據它們之間的邏輯關係從兩個或多個表中檢索記錄。此關係使用連線條件定義。正如我們在前面的章節中討論的那樣,連線有兩種型別:
- 內連線
- 外連線
左連線是一種外連線,它檢索第一個表中的所有記錄,並將它們與第二個表中的記錄匹配。首先,讓我們瞭解什麼是外連線。
什麼是外連線?
外連線用於將多個數據庫表連線到一個組合結果集中,其中包括所有記錄,即使它們不滿足連線條件。在未滿足連線條件的這些記錄中顯示 NULL 值。
這種情況僅在左表(或第一個表)的記錄數多於右表(或第二個表)或反之亦然時才會發生。
外連線有三種類型,即:
- 左(外)連線:檢索第一個表中的所有記錄,匹配第二個表中的記錄,並在不匹配的行中顯示 NULL 值。
- 右(外)連線:檢索第二個表中的所有記錄,匹配第一個表中的記錄,並在不匹配的行中顯示 NULL 值。
- 全(外)連線:檢索兩個表中的記錄,並用 NULL 填充不匹配的值。
下圖說明了兩個表(即 EmpDetails 和 MaritalStatus)之間的各種外連線。在此,連線操作假定基於連線謂詞EmpDetails.EmpID = MaritalStatus.EmpID。
SQL 左連線
SQL 中的左連線或左外連線組合兩個或多個表,其中第一個表完全返回;但是,僅從後續表中檢索匹配的記錄。如果在後續表中沒有找到匹配記錄,則連線仍將在結果中返回一行,但在右表中的每一列中顯示 NULL。
如果第一個表的行數小於第二個表的行數,則第二個表中在第一個表中沒有任何對應行的行將從結果中丟棄。
語法
以下是 SQL 中左連線的基本語法:
SELECT column_name(s) FROM table1 LEFT 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 | 拉梅什 | 32 | 艾哈邁達巴德 | 2000.00 |
| 2 | 希蘭 | 25 | 德里 | 1500.00 |
| 3 | 考希克 | 23 | 科塔 | 2000.00 |
| 4 | 查伊塔利 | 25 | 孟買 | 6500.00 |
| 5 | 哈迪克 | 27 | 博帕爾 | 8500.00 |
| 6 | 科馬爾 | 22 | 海德拉巴德 | 4500.00 |
| 7 | 穆菲 | 24 | 因多爾 | 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 | 日期 | 客戶 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 |
以下左連線查詢檢索在指定日期下訂單的客戶以及未下訂單的客戶的詳細資訊。如果未找到匹配項,則以下查詢將在該記錄中返回 NULL。
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
輸出
獲得的結果表如下:
| ID | 姓名 | 金額 | 日期 |
|---|---|---|---|
| 1 | 拉梅什 | NULL | NULL |
| 2 | 希蘭 | 1560.00 | 2009-11-20 00:00:00 |
| 3 | 考希克 | 1500.00 | 2009-10-08 00:00:00 |
| 3 | 考希克 | 3000.00 | 2009-10-08 00:00:00 |
| 4 | 查伊塔利 | 2060.00 | 2008-05-20 00:00:00 |
| 5 | 哈迪克 | NULL | NULL |
| 6 | 科馬爾 | NULL | NULL |
| 7 | 穆菲 | NULL | NULL |
如上表所示,只有希蘭、考希克和查伊塔利在 ORDERS 表中指定日期進行了購買;因此,記錄匹配。CUSTOMERS 表中的其他客戶在指定的日期未進行購買,因此記錄返回為 NULL。
使用左連線連線多個表
與內連線查詢類似,左連線也連線多個表,其中第一個表按原樣返回,其餘表與第一個表中的行匹配。如果記錄不匹配,則返回 NULL。
使用左連線連線多個表的語法如下:
SELECT column1, column2, column3... FROM table1 LEFT JOIN table2 ON condition_1 LEFT JOIN table3 ON condition_2 .... .... LEFT 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 | 薩里卡 | 4500 |
| 100 | 阿萊克婭 | 3623 |
| 101 | 雷瓦蒂 | 1291 |
| 103 | 維韋克 | 3426 |
以下查詢使用左連線連線 CUSTOMERS、ORDERS 和 EMPLOYEE 表:
SELECT CUSTOMERS.ID, CUSTOMERS.NAME, ORDERS.DATE, EMPLOYEE.EMPLOYEE_NAME FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID LEFT JOIN EMPLOYEE ON ORDERS.OID = EMPLOYEE.EID;
透過此查詢,我們將顯示客戶的 id、姓名以及訂單日期和銷售該商品的員工姓名。
輸出
獲得的結果表如下:
| ID | 姓名 | 日期 | 員工姓名 |
|---|---|---|---|
| 1 | 拉梅什 | NULL | NULL |
| 2 | 希蘭 | 2009-11-20 00:00:00 | 雷瓦蒂 |
| 3 | 考希克 | 2009-10-08 00:00:00 | 阿萊克婭 |
| 3 | 考希克 | 2009-10-08 00:00:00 | 薩里卡 |
| 4 | 查伊塔利 | 2008-05-20 00:00:00 | 維韋克 |
| 5 | 哈迪克 | NULL | NULL |
| 6 | 科馬爾 | NULL | NULL |
| 7 | 穆菲 | NULL | NULL |
如上表所示,客戶考希克下了三張訂單,其中兩張由員工阿萊克婭銷售,一張由薩里卡銷售。希蘭和查伊塔利分別下了一張訂單,分別由雷瓦蒂和維韋克銷售。這些訂單的日期也將顯示。如果訂單未在特定日期下達,則返回 NULL。
帶有 WHERE 子句的左連線
除了 ON 子句之外,還可以對左連線實施後獲得的結果集應用 WHERE 子句。這樣做將進一步過濾資料。
語法
與 WHERE 子句一起使用左連線的語法如下:
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name WHERE condition;
示例
可以使用 WHERE 子句過濾組合資料庫表中的記錄。考慮之前的兩個表 CUSTOMERS 和 ORDERS;並使用左連線查詢連線它們,並使用 WHERE 子句應用一些約束。
SELECT ID, NAME, DATE, AMOUNT FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID WHERE ORDERS.AMOUNT > 2000.00;
輸出
在左連線中應用 where 子句後的結果表包含金額值大於 2000.00 的行:
| ID | 姓名 | 日期 | 金額 |
|---|---|---|---|
| 3 | 考希克 | 2009-10-08 00:00:00 | 3000.00 |
| 4 | 查伊塔利 | 2008-05-20 00:00:00 | 2060.00 |