1. 程式人生 > >mysql學習筆記--巢狀子查詢和相關子查詢

mysql學習筆記--巢狀子查詢和相關子查詢

子查詢:巢狀在其他查詢中的查詢稱之。   
子查詢又稱內部,而包含子查詢的語句稱之外部查詢(又稱主查詢)。   
所有的子查詢可以分為兩類,即相關子查詢和非相關子查詢   
1. 非相關子查詢是獨立於外部查詢的子查詢,子查詢總共執行一次,執行完畢後將值傳遞給外部查詢。   
2. 相關子查詢的執行依賴於外部查詢的資料,外部查詢執行一行,子查詢就執行一次。   
故非相關子查詢比相關子查詢效率高   
巢狀子查詢的執行不依賴與外部的查詢。
執行過程:
(1)執行子查詢,其結果不被顯示,而是傳遞給外部查詢,作為外部查詢的條件使用。

(2)執行外部查詢,並顯示整個結果。  
巢狀子查詢一般可以分為:返回單值的子查詢 和 返回一個列表的子查詢 
相關子查詢的執行依賴於外部查詢。多數情況下是子查詢的WHERE子句中引用了外部查詢的表,外部查詢執行一行,子查詢就執行一次
執行過程:

(1)從外層查詢中取出一個元組,將元組相關列的值傳給內層查詢。

(元組的概念:元組是關係資料庫中的基本概念,關係是一張表,表中的每行(即資料庫中的每條記錄)就是一個元組,每列就是一個屬性。 在二維表裡,元組也稱為記錄

(2)執行內層查詢,得到子查詢操作的值。
(3)外查詢根據子查詢返回的結果或結果集得到滿足條件的行。
(4)然後外層查詢取出下一個元組重複做步驟1-3,直到外層的元組全部處理完畢
下面是相關子查詢的執行過程

orders表資料:

customers表資料:


sql語句:

SELECT cust_name,cust_state ,(SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders FROM customers ORDER BY cust_name;

該子查詢中的cust_id是一個變數,所以需要先從外部得到一個cust_id然後進行查詢。該例子中,先從外部檢索中取出一個元組(第一條記錄),然後在元組中取出cust_id,代入到子查詢中,即where cust_id=10001,得到orders表中cust_id為10001的數量,然後返回第一條結果的orders。再從外部檢索出中取得第二個元組(第二條記錄)再代入到子查詢中,如此進行到最後一條記錄。最後得到結果如下: