1. 程式人生 > >相關子查詢和不相關子查詢

相關子查詢和不相關子查詢

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

 
 
ms對於相關子查詢的解釋:
許多查詢都可以通過執行一次子查詢並將得到的值代入外部查詢的 WHERE 子句中進行計算。在包括相關子查詢(也稱為重複子查詢)的查
 
詢中,子查詢依靠外部查詢獲得值。這意味著子查詢是重複執行的,為外部查詢可能選擇的每一行均執行一次。
 
 
 
--非相關子查詢 
SELECT EMPNO, LASTNAME 
    FROM EMPLOYEE 
    WHERE WORKDEPT = 'A00' 
     AND SALARY > (SELECT AVG(SALARY) 
              FROM EMPLOYEE 
              WHERE WORKDEPT = 'A00') 

--相關子查詢 
SELECT E1.EMPNO, E1.LASTNAME, E1.WORKDEPT 
    FROM EMPLOYEE E1 
    WHERE SALARY > (SELECT AVG(SALARY) 
              FROM EMPLOYEE E2 
              WHERE E2.WORKDEPT = E1.WORKDEPT) 
    ORDER BY E1.WORKDEPT
 
 
 
使用相關子查詢比較多的就是使用exists關鍵字。
 
EXISTS 關鍵字前面沒有列名、常量或其他表示式。由 EXISTS 引入的子查詢的選擇列表通常幾乎都是由星號 (*) 組成。由於只是測試是否存在符合子查詢中指定條件的行,因此不必列出列名。 

由於通常沒有備選的、非子查詢的表示法,因此 EXISTS 關鍵字很重要。儘管一些使用 EXISTS 建立的查詢不能以任何其他方法表示,但許多查詢都可以使用 IN 或者由 ANY 或 ALL 修改的比較運算子來獲取類似結果。 

 
 
其實自己經常在用相關子查詢只是不知道叫啥名字罷了,呵呵
並且,使用exists比等值聯接的查詢效率要高。