mysql的語句一共分為11步,如下圖所标注的那樣,最先執行的總是from操作,最後執行的是limit操作。其中每一個操作都會産生一張虛拟的表,這個虛拟的表作為一個處理的輸入,隻是這些虛拟的表對使用者來說是透明的,但是隻有最後一個虛拟的表才會被作為結果傳回。如果沒有在語句中指定某一個子句,那麼将會跳過相應的步驟。

form: 對from的左邊的表和右邊的表計算笛卡爾積。産生虛表vt1
on: 對虛表vt1進行on篩選,隻有那些符合<join-condition>的行才會被記錄在虛表vt2中。
join: 如果指定了outer join(比如left join、 right join),那麼保留表中未比對的行就會作為外部行添加到虛拟表vt2中,産生虛拟表vt3, rug from子句中包含兩個以上的表的話,那麼就會對上一個join連接配接産生的結果vt3和下一個表重複執行步驟1~3這三個步驟,一直到處理完所有的表為止。
where: 對虛拟表vt3進行where條件過濾。隻有符合<where-condition>的記錄才會被插入到虛拟表vt4中。
group by: 根據group by子句中的列,對vt4中的記錄進行分組操作,産生vt5.
cube | rollup: 對表vt5進行cube或者rollup操作,産生表vt6.
having: 對虛拟表vt6應用having過濾,隻有符合<having-condition>的記錄才會被 插入到虛拟表vt7中。
select: 執行select操作,選擇指定的列,插入到虛拟表vt8中。
distinct: 對vt8中的記錄進行去重。産生虛拟表vt9.
order by: 将虛拟表vt9中的記錄按照<order_by_list>進行排序操作,産生虛拟表vt10.
limit:取出指定行的記錄,産生虛拟表vt11, 并将結果傳回。