簡(jiǎn)單了解MySQL SELECT執(zhí)行順序
SELECT語(yǔ)句的完整語(yǔ)法為:
(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) HAVING <having_condition> (9) ORDER BY <order_by_condition> (10) LIMIT <limit_number>
說(shuō)明:語(yǔ)法前面的序號(hào)為SELECT執(zhí)行順序
MySQL的SELECT執(zhí)行順序一共分為10步,如上所標(biāo)注的那樣,最先執(zhí)行的是FROM操作,最后執(zhí)行的是LIMIT操作。其中每一次操作都會(huì)產(chǎn)生一張?zhí)摂M的表,這個(gè)虛擬的表作為一個(gè)處理的輸入,只是這些虛擬的表對(duì)用戶(hù)來(lái)說(shuō)是透明的,但是只有最后一個(gè)虛擬的表才會(huì)被作為結(jié)果返回。如果沒(méi)有在語(yǔ)句中指定某一個(gè)子句,那么將會(huì)跳過(guò)相應(yīng)的步驟。
下面我們來(lái)具體分析一下查詢(xún)處理的每一個(gè)階段
SELECT a.customer_id, COUNT(b.order_id) as total_orders FROM table1 AS a LEFT JOIN table2 AS b ON a.customer_id = b.customer_id WHERE a.city = 'hangzhou' GROUP BY a.customer_id HAVING count(b.order_id) < 2 ORDER BY total_orders DESC;
1、FORM: 對(duì)FROM左邊的表和右邊的表計(jì)算笛卡爾積,產(chǎn)生虛表VT1。
2、ON: 對(duì)虛表VT1進(jìn)行ON過(guò)濾,只有那些符合<join-condition>的行才會(huì)被記錄在虛表VT2中。
3、JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就會(huì)作為外部行添加到虛擬表VT2中,產(chǎn)生虛擬表VT3。
4、WHERE: 對(duì)虛擬表VT3進(jìn)行WHERE條件過(guò)濾。只有符合<where-condition>的記錄才會(huì)被插入到虛擬表VT4中。
5、GROUP BY: 根據(jù)group by子句中的列,對(duì)VT4中的記錄進(jìn)行分組操作,產(chǎn)生VT5。
6、HAVING: 對(duì)虛擬表VT5應(yīng)用having過(guò)濾,只有符合<having-condition>的記錄才會(huì)被 插入到虛擬表VT6中。
7、SELECT: 執(zhí)行select操作,選擇指定的列,插入到虛擬表VT7中。
8、DISTINCT: 對(duì)VT7中的記錄進(jìn)行去重。產(chǎn)生虛擬表VT8.
9、ORDER BY: 將虛擬表VT8中的記錄按照<order_by_list>進(jìn)行排序操作,產(chǎn)生虛擬表VT9.
10、LIMIT:取出指定行的記錄,產(chǎn)生虛擬表VT10, 并將結(jié)果返回。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MYSQL將表名稱(chēng)修改成大寫(xiě)的存儲(chǔ)過(guò)程
這篇文章主要為大家詳細(xì)介紹了MYSQL將表名稱(chēng)修改成大寫(xiě)的存儲(chǔ)過(guò)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08MySQL數(shù)據(jù)時(shí)區(qū)問(wèn)題以及datetime和timestamp類(lèi)型存儲(chǔ)的差異
這篇文章主要介紹了MySQL數(shù)據(jù)時(shí)區(qū)問(wèn)題以及datetime和timestamp類(lèi)型存儲(chǔ)的差異,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢(xún)方法及其優(yōu)化建議
這篇文章主要介紹了MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢(xún)方法及其優(yōu)化建議,幫助大家更好的處理MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-08-08從云數(shù)據(jù)遷移服務(wù)看MySQL大表抽取模式的原理解析
這篇文章主要介紹了從云數(shù)據(jù)遷移服務(wù)看MySQL大表抽取模式的原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02MySQL中主鍵為0與主鍵自排約束的關(guān)系詳解(細(xì)節(jié))
這篇文章主要給大家介紹了關(guān)于MySQL中主鍵為0與主鍵自排約束的關(guān)系的相關(guān)資料,主要介紹的是其中的一些非常細(xì)的細(xì)節(jié),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05Mysql5.7.11在windows10上的安裝與配置(解壓版)
本文分為三大步給大家介紹Mysql5.7.11解壓版在windows10上的安裝與配置,另外還給大家?guī)?lái)了mysql5.7.11服務(wù)無(wú)法啟動(dòng),錯(cuò)誤代碼3534的解決方案,非常不錯(cuò),有需要的朋友參考下2016-08-08