相關子查詢和不相關子查詢
阿新 • • 發佈:2019-02-06
子查詢:巢狀在其他查詢中的查詢稱之。 子查詢又稱內部,而包含子查詢的語句稱之外部查詢(又稱主查詢)。 所有的子查詢可以分為兩類,即相關子查詢和非相關子查詢 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比等值聯接的查詢效率要高。