SQL - 內連線



SQL 的連線子句用於基於公共欄位/列組合資料庫中的多個相關表。

連線主要分為兩種型別:內連線外連線。其他連線,如左連線、右連線、全連線等,只是這兩種主要連線的子型別。在本教程中,我們只學習內連線。

SQL 內連線

SQL 內連線是一種連線,它透過檢索兩個表中都具有匹配值(在公共列中)的記錄來組合多個表。

它將第一個表的每一行與第二個表的每一行進行比較,以查詢滿足連線謂詞的所有行對。當滿足連線謂詞時,來自兩個表的列值將組合到一個新表中。

Inner Join
內連線也稱為等值連線。它是預設連線;也就是說,即使使用“連線”關鍵字代替“內連線”,表也是使用公共列的匹配記錄連線的。

解釋

讓我們來看一個示例場景,以便更好地理解。

假設我們有一家公司員工的資訊,分為兩個表:EmpDetails 和 Marital status。其中,

  • EmpDetails 表包含員工 ID、姓名和工資等詳細資訊。

  • MaritalStatus 表包含員工 ID、年齡和婚姻狀況等詳細資訊。

Inner Join

當我們根據連線謂詞EmpDetails.EmpID = MaritalStatus.EmpID對這兩個表執行內連線操作時,結果記錄包含以下資訊:匹配記錄的 ID、姓名、工資、年齡和狀態。

語法

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

SELECT column_name(s)
FROM table1
INNER 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

現在,讓我們使用如下所示的內連線查詢組合這兩個表:

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

輸出

此查詢的結果如下所示:

ID 姓名 金額 日期
3 Kaushik 3000.00 2009-10-08 00:00:00
3 Kaushik 1500.00 2009-10-08 00:00:00
2 Khilan 1560.00 2009-11-20 00:00:00
4 Chaitali 2060.00 2008-05-20 00:00:00

使用內連線連線多個表

到目前為止,我們只學習瞭如何使用內連線連線兩個表。但是,我們也可以使用內連線連線儘可能多的表,方法是指定條件(根據該條件連線這些表)。

語法

以下是使用內連線連線多個表的語法:

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

請注意,即使在這種情況下,也只能根據單個條件將兩個表連線在一起。此過程依次進行,直到所有表都組合在一起。

示例

讓我們使用之前的 CUSTOMERS 和 ORDERS 表以及一個名為EMPLOYEE的新表。我們將使用以下查詢建立 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

使用以下查詢,我們可以組合 CUSTOMERS、ORDERS 和 EMPLOYEE 三個表。

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

輸出

上述內連線查詢的結果如下所示:

OID 日期 金額 員工姓名
102 2009-10-08 00:00:00 3000.00 SARIKA
100 2009-10-08 00:00:00 1500.00 ALEKHYA
101 2009-11-20 00:00:00 1560.00 REVATHI
103 2008-05-20 00:00:00 2060.00 VIVEK

帶有 WHERE 子句的內連線

SQL 中的子句用於在使用 SQL 查詢檢索資料時應用約束。SQL 使用各種子句來約束資料;例如 WHERE 子句、GROUP BY 子句、ORDER BY 子句、UNION 子句等。

WHERE 子句用於過濾表中的資料。此子句指定一個條件,僅檢索滿足該條件的記錄。

內連線使用 WHERE 子句對要檢索的資料應用更多約束。例如,在檢索組織的員工記錄時,如果我們只想檢查每月收入超過 25000 的員工的資料,我們需要指定 WHERE 條件 (salary > 25000) 以僅檢索這些員工記錄。

語法

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

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

示例

在此示例中,我們使用內連線查詢連線 CUSTOMERS 和 ORDERS 表,並使用 WHERE 子句對結果應用一些約束。

在這裡,我們從 CUSTOMERS 表中檢索 ID 和 NAME,從 ORDERS 表中檢索 DATE 和 AMOUNT,其中支付的金額高於 2000。

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

輸出

應用內連線和 WHERE 子句後的結果表包含 AMOUNT 值大於 2000.00 的行:

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