MySQL的語(yǔ)句一共分為11步,如下圖所標(biāo)注的那樣,最先執(zhí)行的總是FROM操作恕洲,最后執(zhí)行的是LIMIT操作来涨。其中每一個(gè)操作都會(huì)產(chǎn)生一張?zhí)摂M的表图焰,這個(gè)虛擬的表作為一個(gè)處理的輸入,只是這些虛擬的表對(duì)用戶來(lái)說(shuō)是透明的蹦掐,但是只有最后一個(gè)虛擬的表才會(huì)被作為結(jié)果返回技羔。如果沒有在語(yǔ)句中指定某一個(gè)子句,那么將會(huì)跳過相應(yīng)的步驟卧抗。
下面我們來(lái)具體分析一下查詢處理的每一個(gè)階段
FORM: 對(duì)FROM的左邊的表和右邊的表計(jì)算笛卡爾積藤滥。產(chǎn)生虛表VT1
ON: 對(duì)虛表VT1進(jìn)行ON篩選,只有那些符合的行才會(huì)被記錄在虛表VT2中社裆。
JOIN: 如果指定了OUTER JOIN(比如left join拙绊、 right join),那么保留表中未匹配的行就會(huì)作為外部行添加到虛擬表VT2中,產(chǎn)生虛擬表VT3, rug from子句中包含兩個(gè)以上的表的話标沪,那么就會(huì)對(duì)上一個(gè)join連接產(chǎn)生的結(jié)果VT3和下一個(gè)表重復(fù)執(zhí)行步驟1~3這三個(gè)步驟榄攀,一直到處理完所有的表為止。
WHERE: 對(duì)虛擬表VT3進(jìn)行WHERE條件過濾金句。只有符合的記錄才會(huì)被插入到虛擬表VT4中檩赢。
GROUP BY: 根據(jù)group by子句中的列,對(duì)VT4中的記錄進(jìn)行分組操作趴梢,產(chǎn)生VT5.
CUBE | ROLLUP: 對(duì)表VT5進(jìn)行cube或者rollup操作漠畜,產(chǎn)生表VT6.
HAVING: 對(duì)虛擬表VT6應(yīng)用having過濾,只有符合的記錄才會(huì)被 插入到虛擬表VT7中坞靶。
SELECT: 執(zhí)行select操作憔狞,選擇指定的列,插入到虛擬表VT8中彰阴。
DISTINCT: 對(duì)VT8中的記錄進(jìn)行去重瘾敢。產(chǎn)生虛擬表VT9.
ORDER BY: 將虛擬表VT9中的記錄按照進(jìn)行排序操作,產(chǎn)生虛擬表VT10.
LIMIT:取出指定行的記錄尿这,產(chǎn)生虛擬表VT11, 并將結(jié)果返回簇抵。