筆記參考來自SQL必知必會,SQL新手讀物,感覺不錯,記錄一下學習時的筆記,方便以後查詢
這篇筆記主要是記錄下子查詢篇
什麼是子查詢,我覺得就是當我們創建了多個表時,我們的查詢任務無法在一個表中完成,需要其他表的數據時,我們使用子查詢。。
下面是書中例子
各訂單的物品存儲在相關的OrderItems表中。Orders表不存儲顧客信息,只存儲顧客ID。顧客的實際信息存儲在Customers表中。
現在,假如需要列出訂購物品RGAN01的所有顧客,應該怎樣檢索?下面列出具體的步驟。
1. 檢索包含物品RGAN01的所有訂單的編號。 2. 檢索具有前一步驟列出的訂單編號的所有顧客的ID。 3. 檢索前一步驟返回的所有顧客ID的顧客信息。
SELECT order_num FROM OrderItems WHERE prod_id = ‘RGAN01’;
order_num
20007
20008
SELECT cust_id FROM Orders WHERE order_num IN (20007,20008);
cust_id
1000000004
1000000005
現在,結合這兩個查詢,把第一個查詢(返回訂單號的那一個)變爲子查詢。請看下面的SELECT語句:
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = ‘RGAN01’);
cust_id
1000000004
1000000005
警告:作爲子查詢的SELECT語句只能查詢單個列。企圖檢索多個列將返回錯誤
作爲計算字段使用子查詢
使用子查詢的另一方法是創建計算字段。假如需要顯示Customers表中每個顧客的訂單總數。訂單與相應的顧客ID存儲在Orders表中。
- 從Customers表中檢索顧客列表; 2. 對於檢索出的每個顧客,統計其在Orders表中的訂單數目。
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers ORDER BY cust_name;
這條SELECT語句對Customers表中每個顧客返回三列:cust_name、cust_state和orders。orders是一個計算字段,它是由圓括號中的子查詢建立的。該子查詢對檢索出的每個顧客執行一次。在此例中,該子查詢執行了5次,因爲檢索出了5個顧客。
也是就說我們用第一個檢索語句,檢索出了一個顧客,我們之後的子查詢從Order中查找id與剛纔Customers的id相等的訂單,返回其數量,別名設置爲orders儲存,最後第一個查詢沒查到一個顧客,我們的子查詢都需要查詢Order訂單與之對應的進行返回。
子查詢中的WHERE子句與前面使用的WHERE子句稍有不同,因爲它使用了完全限定列名,而不只是列名(cust_id)。它指定表名和列名 (Orders.cust_id和Customers.cust_id)。下面的WHERE子句告訴SQL,比較Orders表中的cust_id和當前正從Customers表中檢索的cust_id