欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文講懂SQL執(zhí)行順序

 更新時(shí)間:2023年09月04日 10:39:43   作者:不想做靚仔  
開(kāi)發(fā)人員需要應(yīng)用SQL語(yǔ)句來(lái)構(gòu)建數(shù)據(jù)庫(kù)模型,測(cè)試人員需要用SQL語(yǔ)句來(lái)操作數(shù)據(jù)庫(kù)數(shù)據(jù),到底SQL語(yǔ)句的查詢執(zhí)行順序是怎樣的呢,本文就來(lái)介紹一下

SQL語(yǔ)句執(zhí)行順序

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

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

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

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

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

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

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

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

對(duì)虛擬表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ǔ)上添加保留表中被過(guò)濾條件過(guò)濾掉的數(shù)據(jù),非保留表中的數(shù)據(jù)被賦予NULL值,最后生成虛擬表 VT3

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

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

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

  • 由于數(shù)據(jù)還沒(méi)有分組,因此現(xiàn)在還不能在WHERE過(guò)濾器中使用聚合函數(shù)對(duì)分組統(tǒng)計(jì)的過(guò)濾。
  • 同時(shí),由于還沒(méi)有進(jìn)行列的選取操作,因此在SELECT中使用列的別名也是不被允許的。

5 GROUP BY 分組

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

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

AGG_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

對(duì)虛擬表 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過(guò)濾器

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

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

9 SELECT 選出指定列

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

10 DISTINCT 行去重

將重復(fù)的行從虛擬表 VT8中移除,產(chǎn)生虛擬表 VT9。DISTINCT用來(lái)刪除重復(fù)行,只保留唯一的。

11 ORDER BY 排列

將虛擬表 VT9中的行按ORDER BY 子句中的列/列表排序,生成游標(biāo) VC10 ,注意不是虛擬表。因此使用 ORDER BY 子句查詢不能應(yīng)用于表達(dá)式。同時(shí),ORDER BY子句的執(zhí)行順序?yàn)閺淖蟮接遗判?,是非常消耗資源的。

12 LIMIT/OFFSET 指定返回行

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

實(shí)例

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

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

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

  • 首先執(zhí)行 FROM 子句, 從學(xué)生成績(jī)表中組裝數(shù)據(jù)源的數(shù)據(jù)。
  • 執(zhí)行 WHERE 子句, 篩選學(xué)生成績(jī)表中所有學(xué)生的數(shù)學(xué)成績(jī)不為 NULL 的數(shù)據(jù) 。
  • 執(zhí)行 GROUP BY 子句, 把學(xué)生成績(jī)表按 "班級(jí)" 字段進(jìn)行分組。
  • 計(jì)算 avg 聚合函數(shù), 按找每個(gè)班級(jí)分組求出 數(shù)學(xué)平均成績(jī)。
  • 執(zhí)行 HAVING 子句, 篩選出班級(jí) 數(shù)學(xué)平均成績(jī)大于 75 分的。
  • 執(zhí)行SELECT語(yǔ)句,返回?cái)?shù)據(jù),但別著急,還需要執(zhí)行后面幾個(gè)步驟。
  • 執(zhí)行 ORDER BY 子句, 把最后的結(jié)果按 "數(shù)學(xué)平均成績(jī)" 進(jìn)行排序。
  • 執(zhí)行LIMIT ,限制僅返回3條數(shù)據(jù)。結(jié)合ORDER BY 子句,即返回所有班級(jí)中數(shù)學(xué)平均成績(jī)的前三的班級(jí)及其數(shù)學(xué)平均成績(jī)。

思考一下,如果我們將上面語(yǔ)句改成,如下會(huì)怎樣?

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

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

到此這篇關(guān)于一文講懂SQL執(zhí)行順序的文章就介紹到這了,更多相關(guān)SQL執(zhí)行順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 批量執(zhí)行sql語(yǔ)句的方法

    批量執(zhí)行sql語(yǔ)句的方法

    批量執(zhí)行數(shù)據(jù)庫(kù)插入,可以了解下sql的begin使用方法
    2008-12-12
  • SQL 多條件查詢幾種實(shí)現(xiàn)方法詳細(xì)介紹

    SQL 多條件查詢幾種實(shí)現(xiàn)方法詳細(xì)介紹

    這篇文章主要介紹了SQL 多條件查詢兩種實(shí)現(xiàn)方法詳細(xì)介紹的相關(guān)資料,一種是排列結(jié)合,另一種是動(dòng)態(tài)拼接SQL,需要的朋友可以參考下
    2016-12-12
  • SQL Server視圖的更新排查及清除緩存的操作方法

    SQL Server視圖的更新排查及清除緩存的操作方法

    文章主要介紹了在SQLServer中遇到視圖結(jié)構(gòu)與實(shí)際表結(jié)構(gòu)不一致的問(wèn)題,并提供了三種解決方案:刷新視圖、清空?qǐng)?zhí)行計(jì)劃緩存和清空數(shù)據(jù)緩存,每種方法都有其適用場(chǎng)景和注意事項(xiàng),需要的朋友可以參考下
    2025-02-02
  • SQL Server 中查看SQL句子執(zhí)行所用的時(shí)間

    SQL Server 中查看SQL句子執(zhí)行所用的時(shí)間

    在MSSQL Server中通過(guò)查看SQL語(yǔ)句執(zhí)行所用的時(shí)間,來(lái)衡量SQL語(yǔ)句的性能。
    2009-07-07
  • 如何創(chuàng)建支持FILESTREAM的數(shù)據(jù)庫(kù)示例探討

    如何創(chuàng)建支持FILESTREAM的數(shù)據(jù)庫(kù)示例探討

    FILESTREAM使用一種特殊類型的文件組,因此在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),必須至少為一個(gè)文件組指定 CONTAINS FILESTREAM 子句接下來(lái)為你詳細(xì)介紹下如何創(chuàng)建支持 FILESTREAM 的數(shù)據(jù)庫(kù)
    2013-03-03
  • SQLSERVER對(duì)索引的利用及非SARG運(yùn)算符認(rèn)識(shí)

    SQLSERVER對(duì)索引的利用及非SARG運(yùn)算符認(rèn)識(shí)

    SQL對(duì)篩選條件簡(jiǎn)稱:SARG(search argument/SARG)當(dāng)然這里不是說(shuō)SQLSERVER的where子句,是說(shuō)SQLSERVER對(duì)索引的利用,感興趣的朋友可以了解下,或許本文的知識(shí)點(diǎn)對(duì)你有所幫助哈
    2013-02-02
  • 使用SQL語(yǔ)言查詢多個(gè)Excel表格的操作方法

    使用SQL語(yǔ)言查詢多個(gè)Excel表格的操作方法

    本文介紹了如何使用SQL語(yǔ)言查詢多個(gè)Excel表格,通過(guò)將所有Excel表格放入一個(gè).xlsx文件中,并使用pandas和pandasql庫(kù)進(jìn)行讀取和查詢,此外,還探討了如何實(shí)現(xiàn)一個(gè)自定義的calcite文件適配器來(lái)支持Excel文件的查詢,感興趣的朋友一起看看吧
    2025-01-01
  • SQL?Server基礎(chǔ)教程之游標(biāo)(Cursor)

    SQL?Server基礎(chǔ)教程之游標(biāo)(Cursor)

    這篇文章主要給大家介紹了關(guān)于SQL?Server基礎(chǔ)教程之游標(biāo)(Cursor)的相關(guān)資料,游標(biāo)是SQL Server的一種數(shù)據(jù)訪問(wèn)機(jī)制,它允許用戶訪問(wèn)單獨(dú)的數(shù)據(jù)行,需要的朋友可以參考下
    2023-11-11
  • 數(shù)據(jù)庫(kù)觸發(fā)器DB2和SqlServer有哪些區(qū)別

    數(shù)據(jù)庫(kù)觸發(fā)器DB2和SqlServer有哪些區(qū)別

    大部分?jǐn)?shù)據(jù)庫(kù)語(yǔ)句的基本語(yǔ)法是相同的,但具體到的每一種數(shù)據(jù)庫(kù),又有些不一樣,例如觸發(fā)器,DB2和SQL Server兩種很大的不同。對(duì)數(shù)據(jù)庫(kù)觸發(fā)器DB2和SqlServer有哪些區(qū)別感興趣的朋友一起看看本文吧
    2015-11-11
  • 實(shí)例講解SQL Server加密功能

    實(shí)例講解SQL Server加密功能

    本文實(shí)例講解了SQL Server加密功能,文章思路清晰,對(duì)SQL Server加密功能感興趣的朋友可以參考下
    2015-07-07

最新評(píng)論