SQL 子查詢

在本教程中,你將學習如何在 SQL 中的另一個查詢中嵌入查詢。

什麼是子查詢?

子查詢(也稱為巢狀查詢或子選擇)是嵌入在另一個 SQL 查詢的帶有 WHEREHAVING 子句的 SELECT 查詢。子查詢返回的資料由外部語句使用,與使用文字值的方式相同。

子查詢提供了一種簡單有效的方法來處理依賴於另一個查詢結果的查詢。它們幾乎與正常 SELECT 陳述相同,但幾乎沒有限制。最重要的列表如下:

  • 子查詢必須始終出現在括號內。
  • 子查詢必須只返回一列。這意味著你不能在子查詢中使用 SELECT *,除非你引用的表只有一列。如果目的是行比較,則可以使用返回多個列的子查詢。
  • 你只能使用返回多行的子查詢和多個值運算子,例如 INNOT IN 運算子。
  • 子查詢不能是一個 UNION。只有一個 SELECT 語句是允許的。

子查詢跟 SELECT 語句最頻繁使用的語句,但是你可以在 INSERTUPDATEDELETE 內部使用它們,或者其它子查詢中使用。

帶有 SELECT 語句的子查詢

以下語句僅返回 orders 表中訂單值超過 5000 美元的客戶的詳細資訊。另請注意,我們在子查詢中使用了 DISTINCT 關鍵字來消除結果集中重複的 cust_id 值。

SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders 
                      WHERE order_value > 5000);

提示: 子查詢可以返回單個值,單個行,單個列或包含一列或多列的一行或多行的表。

注: 子查詢可以巢狀在外層的 SELECTINSERTUPDATE 或者 DELETE 語句的 WHERE 或者 HAVING 子句的內部,或其它子查詢中。

使用 INSERT 語句的子查詢

子查詢也可以與 INSERT 語句一起使用。這是一個例子:

INSERT INTO premium_customers 
SELECT * FROM customers 
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders 
                      WHERE order_value > 5000);

上述語句將使用從子查詢返回的資料將高階客戶的記錄插入名為 premium_customers 的表中。在這裡,高階客戶是訂購價值超過 5000 美元的客戶。

提示: 檢視有關 SQL 克隆表 的教程,瞭解如何使用 INSERT ... SELECT statement 從另一個錶快速地將多行插入到表中。

帶有 UPDATE 語句的子查詢

你還可以將子查詢與 UPDATE 語句結合使用來更新表中的單個或多個列,如下所示:

UPDATE orders
SET order_value = order_value + 10
WHERE cust_id IN (SELECT cust_id FROM customers 
                      WHERE postal_code = 75016);

上述宣告將居住在郵政編碼為 75016 的區域的客戶的訂單值增加 10 美元來更新 orders 表中的 order 數值。

帶有 DELETE 語句的子查詢

同樣,你可以將子查詢與 DELETE 語句結合使用來刪除表中的單行或多行,如下所示:

DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_details 
                   WHERE product_id = 5);

上面示例中的 SQL 語句將從包含 product_id 為 5 的產品的 orders 表中刪除這些訂單。