MySQL語句最先執(zhí)行的總是FROM操作违柏,最后執(zhí)行的是LIMIT操作。其中每一個操作都會產(chǎn)生一張?zhí)摂M的表帐萎,這個虛擬的表作為一個處理的輸入撩独,只是這些虛擬的表對用戶來說是透明的敞曹,但是只有最后一個虛擬的表才會被作為結(jié)果返回。如果沒有在語句中指定某一個子句(比如group by ,having,order by)综膀,那么將會跳過相應(yīng)的步驟澳迫。
具體分析一下查詢處理的每一個階段
- FORM: 對FROM的左邊的表和右邊的表計算笛卡爾積。產(chǎn)生虛表(VT1)
- ON: 對虛表from語句產(chǎn)生的虛擬表(VT1)進行ON篩選剧劝,只有那些符合<join-condition>的行才會被記錄在虛表(VT2)中
- JOIN: 如果指定了OUTER JOIN(比如left join橄登、 right join)那么保留表中未匹配的行就會作為外部行添加到on語句產(chǎn)生的虛擬表(VT2)中,并產(chǎn)生虛擬表(VT3), 如果from子句中包含兩個以上的表的話(存在多個join)讥此,那么就會對上一個join連接產(chǎn)生的結(jié)果(VT3)和下一個表重復(fù)執(zhí)行步驟1~3這三個步驟拢锹,一直到處理完所有的表為止
- WHERE: 對on語句產(chǎn)生的虛擬表(VT3)進行WHERE條件過濾。只有符合<where-condition>的記錄才會被插入到虛擬表(VT4中)
- GROUP BY: 根據(jù)group by子句中的列萄喳,對where語句產(chǎn)生的虛擬表(VT4)中的記錄進行分組操作卒稳,并產(chǎn)生虛擬表(VT5).
- HAVING: 對group by產(chǎn)生的虛擬表(VT5)應(yīng)用having過濾,只有符合<having-condition>的記錄才會被 插入到虛擬表(VT7)中
- order by:對上一條語句產(chǎn)生的虛擬表進行排序操作,并生產(chǎn)新的虛擬表
- limit: 對上一條語句產(chǎn)生的虛擬表進行分頁操作
- 最后執(zhí)行selelct 與from之前的語句