SQL 子查詢
在本教程中,你將學習如何在 SQL 中的另一個查詢中嵌入查詢。
什麼是子查詢?
子查詢(也稱為巢狀查詢或子選擇)是嵌入在另一個 SQL 查詢的帶有 WHERE
和 HAVING
子句的 SELECT
查詢。子查詢返回的資料由外部語句使用,與使用文字值的方式相同。
子查詢提供了一種簡單有效的方法來處理依賴於另一個查詢結果的查詢。它們幾乎與正常 SELECT
陳述相同,但幾乎沒有限制。最重要的列表如下:
- 子查詢必須始終出現在括號內。
- 子查詢必須只返回一列。這意味著你不能在子查詢中使用
SELECT *
,除非你引用的表只有一列。如果目的是行比較,則可以使用返回多個列的子查詢。 - 你只能使用返回多行的子查詢和多個值運算子,例如
IN
或NOT IN
運算子。 - 子查詢不能是一個
UNION
。只有一個SELECT
語句是允許的。
子查詢跟 SELECT
語句最頻繁使用的語句,但是你可以在 INSERT
、 UPDATE
或 DELETE
內部使用它們,或者其它子查詢中使用。
帶有 SELECT 語句的子查詢
以下語句僅返回 orders 表中訂單值超過 5000 美元的客戶的詳細資訊。另請注意,我們在子查詢中使用了 DISTINCT
關鍵字來消除結果集中重複的 cust_id 值。
SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders
WHERE order_value > 5000);
提示: 子查詢可以返回單個值,單個行,單個列或包含一列或多列的一行或多行的表。
注: 子查詢可以巢狀在外層的 SELECT
、INSERT
、 UPDATE
或者 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 表中刪除這些訂單。