免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

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

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


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

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

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


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

對虛擬表VT1 應(yīng)用ON篩選器,ON 中的邏輯表達(dá)式將應(yīng)用到虛擬表 VT1中的各個(gè)行,篩選出滿足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子句包含兩個(gè)以上的表,則對上一個(gè)聯(lián)接生成的結(jié)果表和下一個(gè)表重復(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ì)的過濾。

  • 同時(shí),由于還沒有進(jìn)行列的選取操作,因此在SELECT中使用列的別名也是不被允許的。


5 GROUP BY 分組

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

同時(shí),從這一步開始,后面的語句中都可以使用SELECT中的別名。


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

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

  • AVG:返回平均值

  • COUNT:返回行數(shù)

  • FIRST:返回第一個(gè)記錄的值

  • LAST:返回最后一個(gè)記錄的值

  • 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á)式。同時(shí),ORDER BY子句的執(zhí)行順序?yàn)閺淖蟮接遗判颍欠浅O馁Y源的。


12 LIMIT/OFFSET 指定返回行

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


實(shí)例

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

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

  1. 首先執(zhí)行 FROM 子句, 從學(xué)生成績表中組裝數(shù)據(jù)源的數(shù)據(jù)。

  2. 執(zhí)行 WHERE 子句, 篩選學(xué)生成績表中所有學(xué)生的數(shù)學(xué)成績不為 NULL 的數(shù)據(jù) 。

  3. 執(zhí)行 GROUP BY 子句, 把學(xué)生成績表按 '班級' 字段進(jìn)行分組。

  4. 計(jì)算 avg 聚合函數(shù), 按找每個(gè)班級分組求出 數(shù)學(xué)平均成績。

  5. 執(zhí)行 HAVING 子句, 篩選出班級 數(shù)學(xué)平均成績大于 75 分的。

  6. 執(zhí)行SELECT語句,返回?cái)?shù)據(jù),但別著急,還需要執(zhí)行后面幾個(gè)步驟。

  7. 執(zhí)行 ORDER BY 子句, 把最后的結(jié)果按 '數(shù)學(xué)平均成績' 進(jìn)行排序。

  8. 執(zhí)行LIMIT ,限制僅返回3條數(shù)據(jù)。結(jié)合ORDER BY 子句,即返回所有班級中數(shù)學(xué)平均成績的前三的班級及其數(shù)學(xué)平均成績。


思考一下,如果我們將上面語句改成,如下會怎樣?

我們發(fā)現(xiàn),若將 avg(數(shù)學(xué)成績) > 75 放到WHERE子句中,此時(shí)GROUP BY語句還未執(zhí)行,因此此時(shí)聚合值 avg(數(shù)學(xué)成績) 還是未知的,因此會報(bào)錯(cuò)。


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服