成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL查詢語句的執行順序解析

數據庫
我們可以發現,所有的查詢語句都是從 FROM 開始執行的。在實際執行過程中,每個步驟都會為下一個步驟生成一個虛擬表,這個虛擬表將作為下一個執行步驟的輸入。 接下來,我們詳細的介紹下每個步驟的具體執行過程。
 

SQL語句執行順序

SQL查詢語句的執行順序解析

 

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

SQL查詢語句的執行順序解析

 

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

1 FROM 執行笛卡爾積

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

FROM子句執行順序為從后往前、從右到左,FROM 子句中寫在最后的表(基礎表 driving table)將被最先處理,即最后的表為驅動表,當FROM 子句中包含多個表的情況下,我們需要選擇數據最少的表作為基礎表。

2 ON 應用ON過濾器

對虛擬表VT1 應用ON篩選器,ON 中的邏輯表達式將應用到虛擬表 VT1中的各個行,篩選出滿足ON 邏輯表達式的行,生成虛擬表 VT2 。

3 JOIN 添加外部行

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

  • LEFT OUTER JOIN把左表記為保留表
  • RIGHT OUTER JOIN把右表記為保留表
  • FULL OUTER JOIN把左右表都作為保留表

在虛擬表 VT2表的基礎上添加保留表中被過濾條件過濾掉的數據,非保留表中的數據被賦予NULL值,最后生成虛擬表 VT3。

如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1~3,直到處理完所有的表為止。

4 WHERE 應用WEHRE過濾器

對虛擬表 VT3應用WHERE篩選器。根據指定的條件對數據進行篩選,并把滿足的數據插入虛擬表 VT4。

  • 由于數據還沒有分組,因此現在還不能在WHERE過濾器中使用聚合函數對分組統計的過濾。
  • 同時,由于還沒有進行列的選取操作,因此在SELECT中使用列的別名也是不被允許的。

5 GROUP BY 分組

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

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

6 AGG_FUNC 計算聚合函數

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

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

7 WITH 應用ROLLUP或CUBE

對虛擬表 VT5應用ROLLUP或CUBE選項,生成虛擬表 VT6

CUBE 和 ROLLUP 區別如下:

  • CUBE 生成的結果數據集顯示了所選列中值的所有組合的聚合。
  • ROLLUP 生成的結果數據集顯示了所選列中值的某一層次結構的聚合。

8 HAVING 應用HAVING過濾器

對虛擬表VT6應用HAVING篩選器。根據指定的條件對數據進行篩選,并把滿足的數據插入虛擬表VT7。

HAVING 語句在SQL中的主要作用與WHERE語句作用是相同的,但是HAVING是過濾聚合值,在 SQL 中增加 HAVING 子句原因就是,WHERE 關鍵字無法與聚合函數一起使用,HAVING子句主要和GROUP BY子句配合使用。

9 SELECT 選出指定列

將虛擬表 VT7中的在SELECT中出現的列篩選出來,并對字段進行處理,計算SELECT子句中的表達式,產生虛擬表 VT8

10 DISTINCT 行去重

將重復的行從虛擬表 VT8中移除,產生虛擬表 VT9。DISTINCT用來刪除重復行,只保留唯一的。

11 ORDER BY 排列

將虛擬表 VT9中的行按ORDER BY 子句中的列/列表排序,生成游標 VC10 ,注意不是虛擬表。因此使用 ORDER BY 子句查詢不能應用于表達式。同時,ORDER BY子句的執行順序為從左到右排序,是非常消耗資源的。

12 LIMIT/OFFSET 指定返回行

從VC10的開始處選擇指定數量行,生成虛擬表 VT11,并返回調用者。

實例

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

SQL查詢語句的執行順序解析

 

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

  1. 首先執行 FROM 子句, 從學生成績表中組裝數據源的數據。
  2. 執行 WHERE 子句, 篩選學生成績表中所有學生的數學成績不為 NULL 的數據 。
  3. 執行 GROUP BY 子句, 把學生成績表按 "班級" 字段進行分組。
  4. 計算 avg 聚合函數, 按找每個班級分組求出 數學平均成績。
  5. 執行 HAVING 子句, 篩選出班級 數學平均成績大于 75 分的。
  6. 執行SELECT語句,返回數據,但別著急,還需要執行后面幾個步驟。
  7. 執行 ORDER BY 子句, 把最后的結果按 "數學平均成績" 進行排序。
  8. 執行LIMIT ,限制僅返回3條數據。結合ORDER BY 子句,即返回所有班級中數學平均成績的前三的班級及其數學平均成績。

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

SQL查詢語句的執行順序解析

 

我們發現,若將 avg(數學成績) > 75 放到WHERE子句中,此時GROUP BY語句還未執行,因此此時聚合值 avg(數學成績) 還是未知的,因此會報錯。

[[281415]] 

 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2010-09-03 14:47:50

SQLSELECT語句

2021-07-28 07:22:40

SQL順序Hive

2018-09-21 16:13:01

數據庫MySQLSQL

2022-07-28 09:13:30

MySQL數據庫

2022-09-01 16:42:47

MySQL數據庫架構

2024-10-11 17:13:14

SQL數據庫查詢數據庫

2017-05-16 11:20:51

SQL語句解析

2010-09-25 14:44:45

SQL select語

2022-02-11 14:43:53

SQL語句C/S架構

2021-05-26 05:22:48

SQL 數據庫SELECT

2010-09-25 14:59:54

SQL語句

2024-12-26 08:16:26

2020-01-29 19:24:59

SQL數據庫MySQL

2010-10-21 12:16:11

SQL Server查

2019-10-23 08:45:34

SQL數據庫開發

2010-09-26 15:23:24

SQL語句

2010-04-29 14:06:40

Oracle SQL

2010-04-20 15:22:34

Oracle SQL

2010-09-25 16:21:41

SQL語句

2010-11-04 09:43:46

LINQ to SQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品乱码久久久久久按摩 | 一区二区三区四区免费视频 | 日韩一区二区三区av | 中文字幕亚洲一区二区va在线 | 欧美激情国产日韩精品一区18 | 日韩av在线播 | 精精国产xxxx视频在线播放 | 日韩一级免费看 | 91精品国产乱码久久久久久久久 | 视频一二三区 | 国产精品一区二区在线播放 | 自拍偷拍第一页 | 国产98色在线 | 日韩 | 国产精品美女在线观看 | 一本色道久久综合亚洲精品高清 | 欧美一级免费黄色片 | 亚洲精品一区二区三区中文字幕 | 欧洲免费视频 | 欧美区日韩区 | 久久久国产一区 | 一区二区三区四区在线视频 | 国产精品一区二区在线 | 国产精品亚洲第一区在线暖暖韩国 | 国产精品国产精品国产专区不蜜 | 超碰电影 | 一区二区三区精品在线 | 欧美一级在线 | 欧美一区在线视频 | 91av在线电影 | 国产精品美女久久久久aⅴ国产馆 | 中文二区| 亚洲影视在线 | 日韩精品一区二区三区 | 日韩久久精品 | 亚洲成人www | 夜夜爽99久久国产综合精品女不卡 | 国产免费一区二区 | 99精品欧美一区二区三区综合在线 | 亚洲视频一区在线播放 | 一级在线 | 欧美精品综合 |