SQL的嵌套查詢與連接查詢


1.嵌套查詢連接查詢的性能

  連接查詢一般較快子查詢很難被優化。(當然和DB優化有關,也可能子查詢比連接查詢快)其實不能一概而論的~~ 不過,問了下DBA同學,他建議是能用join的,盡量不要用嵌套查詢。以下內容,部分是來自網上的一些觀點,自己稍加整理的。
   子查詢是實現關聯式計算的一種實例,連接實現了關聯式代數。關於關聯式計算(relational calculus)和關聯式代數(relational algebra),貌似比較數學或者理論性的東西理論,我也還沒深入弄明白。
  很多人也說到,這個性能的比較,不能一概而論的,需要具體的每個Case具體分析。
   也有人說(並有在某種DBMS上用一個例子證明),子查詢可以也可能被優化為與join一樣的執行計划,性能可以一樣的。
  說一下概念吧:在一個SELECT語句的WHERE子句或HAVING子句中嵌套另一個SELECT語句的查詢稱為嵌套查詢,又稱子查詢。一個select...From...Where查詢語句塊可以嵌套在另一個select...From...Where查詢塊的Where子句中,稱為嵌套查詢。外層查詢稱為父查詢,主查詢。內層查詢稱為子查詢,從查詢。子查詢可以嵌套多層,子查詢查詢到的結果又成為父查詢的條件。子查詢中不能有order by分組語句。先處理子查詢,再處理父查詢。 子查詢除非能確保內層select只返回一個行的值,否則應在外層where子句中用一個in限定符,即要返回多個值,要用in或者not in哦,所以當在編譯過程中出現“子查詢只返回一個值”的錯誤時,就要考慮是不是要用in和not in.

  MySQL從4.1版本開始支持子查詢,使用子查詢進行SELECT語句嵌套查詢,可以一次完成很多邏輯上需要多個步驟才能完成的SQL操作。子查詢雖然很靈活,但是執行效率並不高。執行子查詢時,MYSQL需要創建臨時表,查詢完畢后再刪除這些臨時表,所以,子查詢的速度會受到一定的影響,這里多了一個創建和銷毀臨時表的過程。優化方式:可以使用連接查詢(JOIN)代替子查詢,連接查詢不需要建立臨時表,因此其速度比子查詢快。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM