SQL 子查詢

在本教程中,您將學(xué)習(xí)如何在SQL中將查詢嵌入另一個(gè)查詢中。

什么是子查詢?

子查詢,也稱為嵌套查詢或子選擇,是SELECT嵌入在另一個(gè)SQL查詢的 WHEREHAVING子句中的查詢。子查詢返回的數(shù)據(jù)由外部語(yǔ)句使用,與使用文字值的方式相同。

子查詢提供了一種簡(jiǎn)單而有效的方法來(lái)處理依賴于另一個(gè)查詢結(jié)果的查詢。它們幾乎與普通的SELECT語(yǔ)句相同,但幾乎沒有限制。最重要的幾點(diǎn)如下:

  • 子查詢必須始終出現(xiàn)在括號(hào)內(nèi)。

  • 子查詢必須只返回一列。這意味著不能在子查詢中使用SELECT *,除非所引用的表只有一列。如果目的是行比較,可以使用返回多列的子查詢。

  • 您只能使用返回多個(gè)值運(yùn)算符(例如INNOT IN運(yùn)算符)的多行的子查詢。

  • 子查詢不能是UNION。只允許一個(gè)SELECT語(yǔ)句。

子查詢最常與SELECT語(yǔ)句一起使用,但是也可以在INSERTUPDATEDELETE語(yǔ)句中或在另一個(gè)子查詢中使用它們。

帶有SELECT語(yǔ)句的子查詢

以下語(yǔ)句僅返回訂單表中訂單價(jià)值超過(guò)5000美元的那些客戶的詳細(xì)信息。 還要注意,我們?cè)谧硬樵冎惺褂昧岁P(guān)鍵字DISTINCT從結(jié)果集中消除了重復(fù)的cust_id值。

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

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

注意:子查詢可以嵌套在外部SELECT,INSERTUPDATEDELETE語(yǔ)句的WHEREHAVING子句中,也可以嵌套在其他子查詢中。

帶有INSERT語(yǔ)句的子查詢

子查詢也可以與INSERT語(yǔ)句一起使用。這是一個(gè)實(shí)例:

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

上面的語(yǔ)句將通過(guò)使用子查詢返回的數(shù)據(jù),將高級(jí)客戶的記錄插入名為premium_customers的表中。 這里的高級(jí)客戶是已下訂單價(jià)值超過(guò)5000美元的客戶。

提示:查閱有關(guān)SQL克隆表的教程,以了解如何使用INSERT?...?SELECT 語(yǔ)句快速將多行從另一個(gè)表插入到表中。

帶有UPDATE語(yǔ)句的子查詢

您還可以將子查詢與UPDATE語(yǔ)句結(jié)合使用,以更新表中的單列或多列,如下所示:

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

通過(guò)將當(dāng)前訂單值增加10美元,上述語(yǔ)句將更新訂單(orders)表中郵政編碼為75016的地區(qū)的客戶的訂單值。

帶有DELETE語(yǔ)句的子查詢

同樣,可以將子查詢與DELETE語(yǔ)句結(jié)合使用,以刪除表中的單行或多行,如下所示:

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

上面示例中的SQL語(yǔ)句將從包含product_id為5的產(chǎn)品的訂單表中刪除這些訂單。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清