1. 程式人生 > >MYSQL 學習筆記記錄整理之三:子查詢

MYSQL 學習筆記記錄整理之三:子查詢

進行 測試 匹配 應該 因此 order 輸出 lec pro

1、利用子查詢進行過濾 eg:假如需要列出訂購物品TNT2的所有客戶,具體步驟: 檢索包含物品TNT2的所有訂單編號 檢索具有前一步驟列出的訂單編號的所有客戶的ID 檢索前一步驟返回的所有客戶ID的客戶信息 上述每個步驟都可以單獨作為一個查詢來執行,可以把一條SELECT語句返回的結果用於另一條SELECT語句的WHERE語句。也可以使用子查詢把3個查詢組合成一條語句。 select order_num FROM orderitems WHERE prod_id=‘TNT2‘; 輸出結果為: order_num:20005,20007 下一步,查詢具有訂單20005和20007的客戶ID。 SELECT cust_id from orders where order_num IN(20005,20007); 輸出結果: cust_id:10001,10004 現在,把第一個查詢(返回訂單號的那一個)變為子查詢組合兩個查詢。請看: SELECT cust_id from orders where order_num IN(select order_num FROM orderitems WHERE prod_id=‘TNT2‘); 輸出結果為: cust_id:10001,10004 分析:在SELECT語句中,子查詢總是從內向外處理。在處理上面的語句時,mysql 實際執行了兩個操作。 現在得到了訂購物品TNT2的所有客戶ID,下一步是檢索這些客戶ID的客戶信息,檢索兩列的SQL語句為: SELECT cust_name ,cust_contact from customers where cust_Id in(10001,10004); 上面,可以把其中的where子句轉換為子查詢而不是硬編碼這些客戶ID。 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‘)); 分析:為了執行上面的select 語句,mysql實際上必須執行3條SELECT語句。最裏邊的子查詢返回訂單號列表,此列表用於其外面的子查詢的WHERE子句。外面的子查詢返回客戶ID列表,此客戶ID列表用於最外層查詢的WHERE子句。最外層查詢確實返回所需的數據。 不過,在實際使用時由於性能的限制,不能嵌套太多的子查詢。 註意:列必須匹配。在WHERE子句中使用子查詢,應該保證SELECT語句具有與WHERE子句中相同數目的列,通常,子查詢將返回單個列並且與單個列匹配,但如果需要也可以使用多個列。雖然子查詢一般與IN操作符結合使用,但也可以用於測試等於(=)、不等於(<>)等。 2、作為計算字段使用子查詢 使用子查詢的另一種方法就是創建計算字段。假如需要顯示customers表中每個客戶的訂單總數,為了執行這個操作,遵循下面的步驟: 從customers表中檢索客戶列表 對於檢索出的每個客戶,統計其在orders表中的訂單數目。 例如:下面的代碼對客戶10001的訂單進行計數。 SELECT COUNT(*) AS orders FROM orders WHERE cust_id=10001; 為了對每個客戶執行COUNT(*)計算,應該將COUNT(*)作為一個子查詢,請看下面: 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表中的每個客戶返回3列: cust_name,cust_state,orders。orders是一個計算字段,它是由圓括號的子查詢建立,該子查詢對檢索出的每個客戶執行一次。在此例子匯總,該子查詢執行了5次,因此檢索出了5個客戶。 小結:子查詢最常見的使用是在WHERE子句的IN操作符中,以及用來填充計算列。

MYSQL 學習筆記記錄整理之三:子查詢