1、手寫SQL順序
sql
select <select_list> from <table_name> <join_type> join <join_table> on <join_condition> where <where_condition> group by <group_by_list> having <having_condition> order by <order_by_condition> limit <limt_number>
2、MySql執行順序ide
from <left table> on <on_condition> <join_type> join <join_table> where <where_condition> group by <group_by_list> <sum()avg()等聚合函數> having <having_condition> select <select_list> distinct order by <order_by_condition> limit <limit_number>
3、MySql執行順序理解
函數
第一步:加載from子句的前兩個表計算笛卡爾積,生成虛擬表vt1;
blog
第二步:篩選關聯表符合on表達式的數據,保留主表,生成虛擬表vt2;排序
第三步:若是使用的是外鏈接,執行on的時候,會將主表中不符合on條件的數據也加載進來,作爲外部行it
第四步:若是from子句中的表數量大於2,則重複第一步到第三步,直至全部的表都加載完畢,更新vt3;io
第五步:執行where表達式,篩選掉不符合條件的數據生成vt4;table
第六步:執行group by子句。group by 子句執行事後,會對子句組合成惟一值而且對每一個惟一值只包含一行,生成vt5,。一旦執行group by,後面的全部步驟只能獲得vt5中的列(group by的子句包含的列)和聚合函數。class
第七步:執行聚合函數,生成vt6;select
第八步:執行having表達式,篩選vt6中的數據。having是惟一一個在分組後的條件篩選,生成vt7;
第九步:從vt7中篩選列,生成vt8;
第十步:執行distinct,對vt8去重,生成vt9。其實執行過group by後就不必再去執行distinct,由於分組後,每組只會有一條數據,而且每條數據都不相同。
第十一步:對vt9進行排序,此處返回的不是一個虛擬表,而是一個遊標,記錄了數據的排序順序,此處可使用別名;
第十二步:執行limit語句,將結果返回給客戶端
4、其餘
一、on和where的區別?
簡單地說,當有外關聯表時,on主要是針對外關聯表進行篩選,主表保留,當沒有關聯表時,兩者做用相同。
例如在左外連時,首先執行on,篩選掉外連表中不符合on表達式的數據,而where的篩選是對主表的篩選。
二、圖解