SQL讀書筆記(六) 子查詢

筆記參考來自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表中。

  1. 從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

發佈了83 篇原創文章 · 獲贊 68 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章