SQL查詢語句的執(zhí)行順序解析

SQL語句執(zhí)行順序

1.jpg

結(jié)合上圖详拙,整理出如下偽SQL查詢語句嘹朗。


2.jpg

從這個順序中我們可以發(fā)現(xiàn)餐禁,所有的查詢語句都是從 FROM 開始執(zhí)行的。在實(shí)際執(zhí)行過程中跑芳,每個步驟都會為下一個步驟生成一個虛擬表轴总,這個虛擬表將作為下一個執(zhí)行步驟的輸入。 接下來博个,我們詳細(xì)的介紹下每個步驟的具體執(zhí)行過程怀樟。

1 FROM 執(zhí)行笛卡爾積

FROM 才是 SQL 語句執(zhí)行的第一步,并非 SELECT 盆佣。對FROM子句中的前兩個表執(zhí)行笛卡爾積(交叉聯(lián)接)往堡,生成虛擬表VT1,獲取不同數(shù)據(jù)源的數(shù)據(jù)集共耍。

FROM子句執(zhí)行順序?yàn)閺暮笸奥腔摇挠业阶螅現(xiàn)ROM 子句中寫在最后的表(基礎(chǔ)表 driving table)將被最先處理痹兜,即最后的表為驅(qū)動表穆咐,當(dāng)FROM 子句中包含多個表的情況下,我們需要選擇數(shù)據(jù)最少的表作為基礎(chǔ)表。

2 ON 應(yīng)用ON過濾器

對虛擬表VT1 應(yīng)用ON篩選器对湃,ON 中的邏輯表達(dá)式將應(yīng)用到虛擬表 VT1中的各個行崖叫,篩選出滿足ON 邏輯表達(dá)式的行,生成虛擬表 VT2 拍柒。

3 JOIN 添加外部行

如果指定了OUTER JOIN保留表中未找到匹配的行將作為外部行添加到虛擬表 VT2心傀,生成虛擬表 VT3。保留表如下:

LEFT OUTER JOIN把左表記為保留表
RIGHT OUTER JOIN把右表記為保留表
FULL OUTER JOIN把左右表都作為保留表
在虛擬表 VT2表的基礎(chǔ)上添加保留表中被過濾條件過濾掉的數(shù)據(jù)拆讯,非保留表中的數(shù)據(jù)被賦予NULL值脂男,最后生成虛擬表 VT3。

如果FROM子句包含兩個以上的表往果,則對上一個聯(lián)接生成的結(jié)果表和下一個表重復(fù)執(zhí)行步驟1~3疆液,直到處理完所有的表為止。

4 WHERE 應(yīng)用WEHRE過濾器

對虛擬表 VT3應(yīng)用WHERE篩選器陕贮。根據(jù)指定的條件對數(shù)據(jù)進(jìn)行篩選堕油,并把滿足的數(shù)據(jù)插入虛擬表 VT4。

由于數(shù)據(jù)還沒有分組肮之,因此現(xiàn)在還不能在WHERE過濾器中使用聚合函數(shù)對分組統(tǒng)計(jì)的過濾掉缺。
同時,由于還沒有進(jìn)行列的選取操作戈擒,因此在SELECT中使用列的別名也是不被允許的眶明。

5 GROUP BY 分組

按GROUP BY子句中的列/列表將虛擬表 VT4中的行唯一的值組合成為一組,生成虛擬表VT5筐高。如果應(yīng)用了GROUP BY搜囱,那么后面的所有步驟都只能得到的虛擬表VT5的列或者是聚合函數(shù)(count、sum柑土、avg等)蜀肘。原因在于最終的結(jié)果集中只為每個組包含一行。

同時稽屏,從這一步開始扮宠,后面的語句中都可以使用SELECT中的別名。

6 AGG_FUNC 計(jì)算聚合函數(shù)

計(jì)算 max 等聚合函數(shù)狐榔。SQL Aggregate 函數(shù)計(jì)算從列中取得的值坛增,返回一個單一的值。常用的 Aggregate 函數(shù)包涵以下幾種:

AVG:返回平均值
COUNT:返回行數(shù)
FIRST:返回第一個記錄的值
LAST:返回最后一個記錄的值
MAX: 返回最大值
MIN:返回最小值
SUM: 返回總和

7 WITH 應(yīng)用ROLLUP或CUBE

對虛擬表 VT5應(yīng)用ROLLUP或CUBE選項(xiàng)薄腻,生成虛擬表 VT6收捣。

CUBE 和 ROLLUP 區(qū)別如下:

CUBE 生成的結(jié)果數(shù)據(jù)集顯示了所選列中值的所有組合的聚合。
ROLLUP 生成的結(jié)果數(shù)據(jù)集顯示了所選列中值的某一層次結(jié)構(gòu)的聚合庵楷。

8 HAVING 應(yīng)用HAVING過濾器

對虛擬表VT6應(yīng)用HAVING篩選器坏晦。根據(jù)指定的條件對數(shù)據(jù)進(jìn)行篩選,并把滿足的數(shù)據(jù)插入虛擬表VT7。

HAVING 語句在SQL中的主要作用與WHERE語句作用是相同的昆婿,但是HAVING是過濾聚合值,在 SQL 中增加 HAVING 子句原因就是蜓斧,WHERE 關(guān)鍵字無法與聚合函數(shù)一起使用仓蛆,HAVING子句主要和GROUP BY子句配合使用。

9 SELECT 選出指定列

將虛擬表 VT7中的在SELECT中出現(xiàn)的列篩選出來挎春,并對字段進(jìn)行處理看疙,計(jì)算SELECT子句中的表達(dá)式,產(chǎn)生虛擬表 VT8直奋。

10 DISTINCT 行去重

將重復(fù)的行從虛擬表 VT8中移除能庆,產(chǎn)生虛擬表 VT9。DISTINCT用來刪除重復(fù)行脚线,只保留唯一的搁胆。

11 ORDER BY 排列

將虛擬表 VT9中的行按ORDER BY 子句中的列/列表排序,生成游標(biāo) VC10 邮绿,注意不是虛擬表渠旁。因此使用 ORDER BY 子句查詢不能應(yīng)用于表達(dá)式。同時船逮,ORDER BY子句的執(zhí)行順序?yàn)閺淖蟮接遗判蚬死埃欠浅O馁Y源的。

12 LIMIT/OFFSET 指定返回行

從VC10的開始處選擇指定數(shù)量行挖胃,生成虛擬表 VT11杂靶,并返回調(diào)用者。

實(shí)例
接下來酱鸭,我們看一個實(shí)例吗垮,以下SQL查詢語句是否存在問題?


3.jpg

首先凛辣,我們先看下如上SQL的執(zhí)行順序抱既,如下:

首先執(zhí)行 FROM 子句, 從學(xué)生成績表中組裝數(shù)據(jù)源的數(shù)據(jù)。
執(zhí)行 WHERE 子句, 篩選學(xué)生成績表中所有學(xué)生的數(shù)學(xué)成績不為 NULL 的數(shù)據(jù) 扁誓。
執(zhí)行 GROUP BY 子句, 把學(xué)生成績表按 "班級" 字段進(jìn)行分組防泵。
計(jì)算 avg 聚合函數(shù), 按找每個班級分組求出 數(shù)學(xué)平均成績。
執(zhí)行 HAVING 子句, 篩選出班級 數(shù)學(xué)平均成績大于 75 分的蝗敢。
執(zhí)行SELECT語句捷泞,返回?cái)?shù)據(jù),但別著急寿谴,還需要執(zhí)行后面幾個步驟锁右。
執(zhí)行 ORDER BY 子句, 把最后的結(jié)果按 "數(shù)學(xué)平均成績" 進(jìn)行排序。
執(zhí)行LIMIT ,限制僅返回3條數(shù)據(jù)咏瑟。結(jié)合ORDER BY 子句拂到,即返回所有班級中數(shù)學(xué)平均成績的前三的班級及其數(shù)學(xué)平均成績。
思考一下码泞,如果我們將上面語句改成兄旬,如下會怎樣?


4.jpg

我們發(fā)現(xiàn)余寥,若將avg(數(shù)學(xué)成績) > 75放到WHERE子句中领铐,此時GROUP BY語句還未執(zhí)行,因此此時聚合值avg(數(shù)學(xué)成績)還是未知的宋舷,因此會報(bào)錯绪撵。
5.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祝蝠,隨后出現(xiàn)的幾起案子音诈,更是在濱河造成了極大的恐慌,老刑警劉巖续膳,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件改艇,死亡現(xiàn)場離奇詭異,居然都是意外死亡坟岔,警方通過查閱死者的電腦和手機(jī)谒兄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來社付,“玉大人承疲,你說我怎么就攤上這事∨缚В” “怎么了燕鸽?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長啼辣。 經(jīng)常有香客問我啊研,道長,這世上最難降的妖魔是什么鸥拧? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任党远,我火速辦了婚禮,結(jié)果婚禮上富弦,老公的妹妹穿的比我還像新娘沟娱。我一直安慰自己,他們只是感情好腕柜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布济似。 她就那樣靜靜地躺著矫废,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砰蠢。 梳的紋絲不亂的頭發(fā)上蓖扑,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機(jī)與錄音娩脾,去河邊找鬼赵誓。 笑死,一個胖子當(dāng)著我的面吹牛柿赊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幻枉,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼碰声,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熬甫?” 一聲冷哼從身側(cè)響起胰挑,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椿肩,沒想到半個月后瞻颂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郑象,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年贡这,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂榛。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡盖矫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出击奶,到底是詐尸還是另有隱情辈双,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布柜砾,位于F島的核電站湃望,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痰驱。R本人自食惡果不足惜证芭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萄唇。 院中可真熱鬧檩帐,春花似錦、人聲如沸另萤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泛源,卻和暖如春拔妥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背达箍。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工没龙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缎玫。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓硬纤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赃磨。 傳聞我的和親對象是個殘疾皇子筝家,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 查詢語句中select from where group by having order by limit的執(zhí)行順...
    許小小晴閱讀 3,210評論 1 3
  • SQL語言不同于其他編程語言(如C++,Java)邻辉,最明顯的不同體現(xiàn)在處理代碼的順序上溪王。在大多數(shù)編程語言中,代碼按...
    晨曦詩雨閱讀 2,409評論 1 4
  • 看值骇,他們吃得多嗨莹菱!昨晚一來感謝大姐大姐夫,二來也招待一下從廣東回老家的大姐的二個小孫子吱瘩,三來給大家的聚會找個理...
    心悅_311b閱讀 678評論 0 1
  • 比背負(fù)壓力的趕路更累的是什么道伟? 是沒有期待的躺著。 當(dāng)下搅裙, 我們唯一能做的 就是為了心之所向 全力以赴 不要心存僥...
    麗曉徐閱讀 289評論 0 0