MySql學習筆記(二):SQL執行順序

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的篩選是對主表的篩選。

二、圖解

image.png

相關文章
相關標籤/搜索