SQL語句執行順序

    被小哥瘋狂輸出一晚上,大體講明白了SQL語句執行順序。這邊總結一下。

    NOTE:關於SQL基礎知識,可以參考博文SQL零階入門學習筆記(基礎篇);關於SQL的函數應用,可以參考博文SQL函數學習筆記

一、書寫順序

SELECT DISTINCT COLUMN_NAME FROM TABLE_NAME1
(INNER/LEFT/RIGHT/FULL)JOIN TABLE_NAME2 ON 字段
WHERE CONDITION GROUP BY 字段
HAVING CONDITION ORDER BY字段

二、執行順序

    以上每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只有最後一步生成的表纔會會給調用者。如果沒有在查詢中指定某一個子句,將跳過相應的步驟。

  1. FROM:對FROM子句中的前兩個表執行笛卡爾積(交叉聯接),生成虛擬表VT1。
  2. ON:對VT1應用ON篩選器,只有那些使爲真才被插入到TV2。
  3. JOIN:如果指定了OUTER JOIN(相對於CROSS JOIN或INNER JOIN),保留表中未找到匹配的行將作爲外部行添加到VT2,生成TV3。如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到處理完所有的表位置。
  4. WHERE:對TV3應用WHERE篩選器,只有使爲true的行才插入TV4。
  5. GROUP BY:按GROUP BY子句中的列列表對TV4中的行進行分組,生成TV5。
  6. HAVING:對VT5應用HAVING篩選器,只有使爲true的組插入到VT6。
  7. SELECT:處理SELECT列表,產生VT7。
  8. DISTINCT:將重複的行從VT7中刪除,產品VT8。
  9. ORDER BY:將VT8中的行按ORDER BY子句中的列列表順序,生成一個遊標(VC19)。

NOTE:其實ON和WHERE都起着篩選的作用,然而當條件可以放到ON時,首選放至ON,可以大大提高查詢效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章