子查詢
即嵌套在其他查詢中的查詢。
利用子查詢進(jìn)行過濾
例:
- 檢索包含物品TNT2的所有訂單的編號。
- 檢索具有前一步驟列出的訂單編號的所有客戶的ID。
- 檢索前一步驟返回的所有客戶ID的客戶信息。
把一條SELECT語句返回的結(jié)果用于另一條SELECT語句的WHERE子句。
第一步:
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';
第二步:查詢具有訂單20005和20007的客戶ID。
SELECT cust_id
FROM orders
WHERE order_num IN (20005,20007);
現(xiàn)在,把第一個查詢變?yōu)樽硬樵兘M合兩個查詢:
SELECT cust_id
FROM orders
WHERE order_num IN (SELECT
FROM orderitems
WHERE prod_id = 'TNT2');
!:在SELECT語句中,子查詢總是從內(nèi)向外處理。
以上得到了訂購物品TNT2的所有客戶的ID。下一步是檢索這些客戶ID的客戶信息:
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (10001,10004);
將WHERE子句轉(zhuǎn)換為子查詢:
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2'));
作為計算字段使用子查詢
例:假如需要顯示customers表中每個客戶的訂單總數(shù)。訂單與相應(yīng)客戶ID存儲在orders表中。步驟:
- 從customers表中檢索客戶列表。
- 對于檢索出的每個客戶,統(tǒng)計其在orders表中的訂單數(shù)目。
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.custid) AS orders
FROM cusomers
ORDER BY cust_name;
相關(guān)子查詢(correlatedsubquery):涉及外部查詢的子查詢。這種類型的子查詢稱為相關(guān)子查詢。任何時候只要列名可能有多義性,就必須使用這種語法(表名和列名由一個句點分隔)。