關于sql和MySQL的語句執行順序

sql和mysql執行順序,發現內部機制是一樣的。最大區別是在別名的引用上。

一、sql執行順序 
(1)from 
(3) join 
(2) on 
(4) where 
(5)group by(開始使用select中的別名,后面的語句中都可以使用)
(6) avg,sum.... 
(7)having 
(8) select 
(9) distinct 
(10) order by 

從這個順序中我們不難發現,所有的 查詢語句都是從from開始執行的,在執行過程中,每個步驟都會為下一個步驟生成一個虛擬表,這個虛擬表將作為下一個執行步驟的輸入。
第一步:首先對from子句中的前兩個表執行一個笛卡爾乘積,此時生成虛擬表 vt1(選擇相對小的表做基礎表)
第二步:接下來便是應用on篩選器,on 中的邏輯表達式將應用到 vt1 中的各個行,篩選出滿足on邏輯表達式的行,生成虛擬表 vt2
第三步:如果是outer join 那么這一步就將添加外部行,left outer jion 就把左表在第二步中過濾的添加進來,如果是right outer join 那么就將右表在第二步中過濾掉的行添加進來,這樣生成虛擬表 vt3
第四步:如果 from 子句中的表數目多余兩個表,那么就將vt3和第三個表連接從而計算笛卡爾乘積,生成虛擬表,該過程就是一個重復1-3的步驟,最終得到一個新的虛擬表 vt3。
第五步:應用where篩選器,對上一步生產的虛擬表引用where篩選器,生成虛擬表vt4,在這有個比較重要的細節不得不說一下,對于包含outer join子句的查詢,就有一個讓人感到困惑的問題,到底在on篩選器還是用where篩選器指定邏輯表達式呢?on和where的最大區別在于,如果在on應用邏輯表達式那么在第三步outer join中還可以把移除的行再次添加回來,而where的移除的最終的。舉個簡單的例子,有一個學生表(班級,姓名)和一個成績表(姓名,成績),我現在需要返回一個x班級的全體同學的成績,但是這個班級有幾個學生缺考,也就是說在成績表中沒有記錄。為了得到我們預期的結果我們就需要在on子句指定學生和成績表的關系(學生.姓名=成績.姓名)那么我們是否發現在執行第二步的時候,對于沒有參加考試的學生記錄就不會出現在vt2中,因為他們被on的邏輯表達式過濾掉了,但是我們用left outer join就可以把左表(學生)中沒有參加考試的學生找回來,因為我們想返回的是x班級的所有學生,如果在on中應用學生.班級='x'的話,left outer join會把x班級的所有學生記錄找回(感謝網友康欽謀__康欽苗的指正),所以只能在where篩選器中應用學生.班級='x' 因為它的過濾是最終的。
第六步:group by 子句將中的唯一的值組合成為一組,得到虛擬表vt5。如果應用了group by,那么后面的所有步驟都只能得到的vt5的列或者是聚合函數(count、sum、avg等)。原因在于最終的結果集中只為每個組包含一行。這一點請牢記。
第七步:應用cube或者rollup選項,為vt5生成超組,生成vt6.
第八步:應用having篩選器,生成vt7。having篩選器是第一個也是為唯一一個應用到已分組數據的篩選器。
第九步:處理select子句。將vt7中的在select中出現的列篩選出來。生成vt8.
第十步:應用distinct子句,vt8中移除相同的行,生成vt9。事實上如果應用了group by子句那么distinct是多余的,原因同樣在于,分組的時候是將列中唯一的值分成一組,同時只為每一組返回一行記錄,那么所以的記錄都將是不相同的。
第十一步:應用order by子句。按照order_by_condition排序vt9,此時返回的一個游標,而不是虛擬表。sql是基于集合的理論的,集合不會預先對他的行排序,它只是成員的邏輯集合,成員的順序是無關緊要的。對表進行排序的查詢可以返回一個對象,這個對象包含特定的物理順序的邏輯組織。這個對象就叫游標。正因為返回值是游標,那么使用order by 子句查詢不能應用于表表達式。排序是很需要成本的,除非你必須要排序,否則最好不要指定order by,最后,在這一步中是第一個也是唯一一個可以使用select列表中別名的步驟。
第十二步:應用top選項。此時才返回結果給請求者即用戶。

二、mysql的執行順序
SELECT語句定義
一個完成的SELECT語句包含可選的幾個子句。SELECT語句的定義如下:

SQL代碼 
1、
<SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>] [<ORDER BY clause>] [<LIMIT clause>]   

SELECT子句是必選的,其它子句如WHERE子句、GROUP BY子句等是可選的。
一個SELECT語句中,子句的順序是固定的。例如GROUP BY子句不會位于WHERE子句的前面。

SELECT語句執行順序
SELECT語句中子句的執行順序與SELECT語句中子句的輸入順序是不一樣的,所以并不是從SELECT子句開始執行的,而是按照下面的順序執行:
開始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最終結果

每個子句執行后都會產生一個中間結果,供接下來的子句使用,如果不存在某個子句,就跳過
對比了一下,mysql和sql執行順序基本是一樣的, 標準順序的 SQL 語句為:

select 考生姓名, max(總成績) as max總成績   
  
from tb_Grade   
  
where 考生姓名 is not null   
  
group by 考生姓名   
  
having max(總成績) > 600   
  
order by max總成績   

在上面的示例中 SQL 語句的執行順序如下:

(1). 首先執行 FROM 子句, 從 tb_Grade 表組裝數據源的數據

(2). 執行 WHERE 子句, 篩選 tb_Grade 表中所有數據不為 NULL 的數據

(3). 執行 GROUP BY 子句, 把 tb_Grade 表按 "學生姓名" 列進行分組(注:這一步開始才可以使用select中的別名,他返回的是一個游標,而不是一個表,所以在where中不可以使用select中的別名,而having卻可以使用,感謝網友 zyt1369 提出這個問題)

(4). 計算 max() 聚集函數, 按 "總成績" 求出總成績中最大的一些數值

(5). 執行 HAVING 子句, 篩選課程的總成績大于 600 分的.

(7). 執行 ORDER BY 子句, 把最后的結果按 "Max 成績" 進行排序.

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容

  • 查詢語句中select from where group by having order by limit的執行順...
    許小小晴閱讀 3,223評論 1 3
  • 轉自:https://blog.csdn.net/freeking101/article/details/7652...
    mayiwoaini閱讀 328評論 0 1
  • SQL語句執行順序 結合上圖,整理出如下偽SQL查詢語句。 從這個順序中我們可以發現,所有的查詢語句都是從 FRO...
    can_4999閱讀 373評論 0 1
  • sql語句的執行步驟: 1)語法分析,分析語句的語法是否符合規范,衡量語句中各表達式的意義。 2)語義分析,檢查語...
    一枚豪邁的胡蘿卜閱讀 897評論 0 0
  • 長度單位換算 米,厘米,毫米,公里我就不說了,相信大家都知道怎么換算。我們來說說市制和英美制。 一米等于三市尺,我...
    周泉閱讀 896評論 0 2