被小哥瘋狂輸出一晚上,大體講明白了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字段
二、執行順序
以上每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只有最後一步生成的表纔會會給調用者。如果沒有在查詢中指定某一個子句,將跳過相應的步驟。
- FROM:對FROM子句中的前兩個表執行笛卡爾積(交叉聯接),生成虛擬表VT1。
- ON:對VT1應用ON篩選器,只有那些使爲真才被插入到TV2。
- JOIN:如果指定了OUTER JOIN(相對於CROSS JOIN或INNER JOIN),保留表中未找到匹配的行將作爲外部行添加到VT2,生成TV3。如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到處理完所有的表位置。
- WHERE:對TV3應用WHERE篩選器,只有使爲true的行才插入TV4。
- GROUP BY:按GROUP BY子句中的列列表對TV4中的行進行分組,生成TV5。
- HAVING:對VT5應用HAVING篩選器,只有使爲true的組插入到VT6。
- SELECT:處理SELECT列表,產生VT7。
- DISTINCT:將重複的行從VT7中刪除,產品VT8。
- ORDER BY:將VT8中的行按ORDER BY子句中的列列表順序,生成一個遊標(VC19)。
NOTE:其實ON和WHERE都起着篩選的作用,然而當條件可以放到ON時,首選放至ON,可以大大提高查詢效率。