欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > SQL語句的各個關鍵字的解析過程詳細總結

SQL語句的各個關鍵字的解析過程詳細總結

熱門標簽:慶陽地圖標注 北京400電話辦理多少錢 榕城市地圖標注 怎么給高德做地圖標注 承德地圖標注公司名需要花錢嗎 電銷外呼系統軟件功能 咸陽電腦外呼系統運營商 美團地圖標注商戶認證注冊 浙江穩定外呼系統供應商

由于最近需要做一些sql query性能提升的研究,因此研究了一下sql語句的解決過程。在園子里看了下,大家寫了很多相關的文章,大家的側重點各有不同。本文是我在看了各種資料后手機總結的,會詳細的,一步一步的講述一個sql語句的各個關鍵字的解析過程,歡迎大家互相學習。

SQL語句的解析順序

簡單的說一個sql語句是按照如下的順序解析的:

1. FROM FROM后面的表標識了這條語句要查詢的數據源。和一些子句如,(1-J1)笛卡爾積,(1-J2)ON過濾,(1-J3)添加外部列,所要應用的對象。FROM過程之后會生成一個虛擬表VT1。
(1-J1)笛卡爾積 這個步驟會計算兩個相關聯表的笛卡爾積(CROSS JOIN) ,生成虛擬表VT1-J1。
(1-J2)ON過濾 這個步驟基于虛擬表VT1-J1這一個虛擬表進行過濾,過濾出所有滿足ON 謂詞條件的列,生成虛擬表VT1-J2。
(1-J3)添加外部行  如果使用了外連接,保留表中的不符合ON條件的列也會被加入到VT1-J2中,作為外部行,生成虛擬表VT1-J3。 
2. WHERE 對VT1過程中生成的臨時表進行過濾,滿足where子句的列被插入到VT2表中。
3. GROUP BY 這個子句會把VT2中生成的表按照GROUP BY中的列進行分組。生成VT3表。
4. HAVING 這個子句對VT3表中的不同的組進行過濾,滿足HAVING條件的子句被加入到VT4表中。
5. SELECT 這個子句對SELECT子句中的元素進行處理,生成VT5表。
(5-1)計算表達式 計算SELECT 子句中的表達式,生成VT5-1
(5-2)DISTINCT 尋找VT5-1中的重復列,并刪掉,生成VT5-2
(5-3)TOP 從ORDER BY子句定義的結果中,篩選出符合條件的列。生成VT5-3表
ORDER BY 從VT5-3中的表中,根據ORDER BY 子句的條件對結果進行排序,生成VC6表。

客戶,訂單的查詢例子

首先創建一個Customers表,插入如下數據:

customerid city
FISSA Madrid
FRNDO Madrid
KRLOS Madrid
MRPHS Zion

創建一個Orders表,插入如下數據:

orderid customerid
1 FRNDO
2 FRNDO
3 KRLOS
4 KRLOS
5 KRLOS
6 MRPHS
7 NULL

假如我們想要查詢來自Madrid的,訂單數小于3的客戶,并把他們的訂單數顯示出來,結果按照訂單數從小到大進行排序。

復制代碼 代碼如下:

SELECT C.customerid, COUNT(O.orderid) AS numorders
FROM dbo.Customers AS C
LEFT OUTER JOIN dbo.Orders AS O
ON C.customerid = O.customerid
WHERE C.city = 'Madrid'
GROUP BY C.customerid
HAVING COUNT(O.orderid) 3
ORDER BY numorders

查詢結果為:

customerid numorders
FISSA 0
FRNDO 2

下面我們會詳細的講述sql是怎樣計算出這個結果的:

FROM子句

FROM子句標識了需要查詢的表,如果指定了表操作,會從左到右的處理,每一個基于一個或者兩個表的表操作都會返回一個輸出表。左邊表的輸出結果會作為下一個表操作的輸入結果。例如,交表相關的操作有 (1-J1)笛卡爾積,(1-J2)ON過濾器,(1-J3)添加外部列。FROM句子生成虛擬表VT1。

Step 1-J1:執行笛卡爾積(CROSS JOIN)

笛卡爾積會把左右兩個表每一行所有可能的組合都列出來生成表VT1-J1,如果左表有m列,右表有n列,那么笛卡爾積之后生成的VT1-J1表將會有m×n列。

Step 1-J1這個步驟等價于執行

SELECT * from Customers C CROSS JOIN Orders O

執行結果為:(共有4×7列)

C.customerid C.city O.orderid O.customerid
FISSA Madrid 1 FRNDO
FISSA Madrid 2 FRNDO
FISSA Madrid 3 KRLOS
FISSA Madrid 4 KRLOS
FISSA Madrid 5 KRLOS
FISSA Madrid 6 MRPHS
FISSA Madrid 7 NULL
FRNDO Madrid 1 FRNDO
FRNDO Madrid 2 FRNDO
FRNDO Madrid 3 KRLOS
FRNDO Madrid 4 KRLOS
FRNDO Madrid 5 KRLOS
FRNDO Madrid 6 MRPHS
FRNDO Madrid 7 NULL
KRLOS Madrid 1 FRNDO
KRLOS Madrid 2 FRNDO
KRLOS Madrid 3 KRLOS
KRLOS Madrid 4 KRLOS
KRLOS Madrid 5 KRLOS
KRLOS Madrid 6 MRPHS
KRLOS Madrid 7 NULL
MRPHS Zion 1 FRNDO
MRPHS Zion 2 FRNDO
MRPHS Zion 3 KRLOS
MRPHS Zion 4 KRLOS
MRPHS Zion 5 KRLOS
MRPHS Zion 6 MRPHS
MRPHS Zion 7 NULL
Step 1-J2:應用ON過濾,(JOIN 條件)

ON過濾條件是sql的三個過濾條件(ON,WHERE,HAVING)中最先執行的,ON過濾條件應用于前一步生成的虛擬表(VT1-J1),滿足ON過濾條件的行會被加入到虛擬表VT1-J2中。在應用了ON 過濾之后,生成的VT1-J2表如下所示:

C.customerid C.city O.orderid O.customerid
FRNDO Madrid 1 FRNDO
FRNDO Madrid 2 FRNDO
KRLOS Madrid 3 KRLOS
KRLOS Madrid 4 KRLOS
KRLOS Madrid 5 KRLOS
MRPHS Zion 6 MRPHS
Step 1-J3:添加外部列

這個步驟只會出現在使用了外連接的情況。對于外連接(LEFT,RIGHT, or FULL),你可以標記一個或者兩個表作為保留表。作為保留表意味著你希望這個表里面的所有列都被返回,即使它里面的數據不滿足ON子句的過濾條件。LEFT OUTER JOIN 把左邊的表標記為保留表,RIGHTOUTER JOIN把右邊的表作為保留表,FULL OUTER JOIN把兩個表都標記為保留表.Step 1-J3為根據VT1-J2中的虛擬表,添加了保留表中不滿足ON 條件的列,在未保留表中沒有對應的列,因此標記為NULL。這個過程生成了虛擬表VT1-J3。

C.customerid C.city O.orderid O.customerid
FISSA Madrid NULL NULL
FRNDO Madrid 1 FRNDO
FRNDO Madrid 2 FRNDO
KRLOS Madrid 3 KRLOS
KRLOS Madrid 4 KRLOS
KRLOS Madrid 5 KRLOS
MRPHS Zion 6 MRPHS

如果FROM子句中有多個表操作運算,sql會按照從左到右的順序處理,左邊生成的臨時表結果作為右邊表的輸入表。

Step 2 WHERE 子句

WHERE過濾被應用到前一步生成的臨時表中,根據WHERE過濾條件生成臨時表VT2。

注意:由于數據現在還沒有被分組,因此現在你不能使用聚合運算-例如:你不能使用這樣的句子 WHERE orderdate = MAX(orderdate)。另外你也不能使用SELECT子句中創建的變量別名,因為現在還沒有處理SELECT子句-例如你不能寫這樣的句子:SELECT YEAR(orderdate) AS orderyear . . . WHERE orderyear > 2008.

應用這個過濾

WHERE C.city = 'Madrid'

這時生成的臨時表VT2的內容如下:

C.customerid C.city O.orderid O.customerid
FISSA Madrid NULL NULL
FRNDO Madrid 1 FRNDO
FRNDO Madrid 2 FRNDO
KRLOS Madrid 3 KRLOS
KRLOS Madrid 4 KRLOS
KRLOS Madrid 5 KRLOS

在這個例子中,你需要在ON子句中使用ON C.customerid = O.customerid過濾,沒有訂單的客戶在1-J2這一步中被過濾掉,但是在1-J3這一步中作為外部列又被加回來。但是,由于你只想返回來自Madrid的客戶,因此你需要在WHERE子句中過濾城市(WHERE C.city = ‘Madrid'),如果你放在ON過濾中,不屬于Madrid的客戶在添加外部列中會被添加回來。

關于ON 和 WHERE 的區別需要在這里說明一下,ON 和WHERE 的主要區別在于 ON 實在添加外部列之前進行過濾,WHERE 是在之后。ON過濾掉的列會在1-J3中添加回來。如果你不需要添加外部列,那么這兩個過濾是相同的。

Step 3 GROUP BY子句

這個子句會把前一步中生成的臨時表中的數據進行分組,每一行都會分到并且只分到一個組里,生成虛擬表VT3。VT3表中包含了VT2表中所有的數據,和分組標識符。

這是生成的臨時表VT3的內容如下:

Groups
C.customerid
C.customerid C.city O.orderid O.customerid
FISSA FISSA Madrid NULL NULL
FRNDO FRNDO Madrid 1 FRNDO
FRNDO Madrid 2 FRNDO
  KRLOS Madrid 3 KRLOS
KRLOS KRLOS Madrid 4 KRLOS
  KRLOS Madrid 5 KRLOS

sql最終返回的結果中,每一個分組必須只能返回一行(除非被過濾掉),因此當一個sql語句中使用了GROUP BY時,在GROUP BY后面處理的子句,如SELECT,HAVING子句等,只能使用出現在GROUP BY后面的列,對于沒有出現GROUP BY后面的列必須使用聚合函數(如 MAX ,MIN,COUNT,AVG等),保證每一個GROUP只返回一行。

Step 4 HAVING子句

HAVING子句用來過濾前一步生成的臨時表,并且只作用于分組后的數據,滿足HAVING條件的GROUP被添加到虛擬表VT4中。

當應用了這個過濾:

復制代碼 代碼如下:

HAVING COUNT(O.orderid) 3

之后,生成的VT4表內容如下:

Groups
C.customerid
C.customerid C.city O.orderid O.customerid
FISSA FISSA Madrid NULL NULL
FRNDO FRNDO Madrid 1 FRNDO
  FRNDO Madrid 2 FRNDO

需要注意的一點是,這里面使用的是COUNT(O.orderid),而不是COUNT(*),由于這個查詢中添加了外部列,COUNT方法會忽略NULL的列,導致出現了你不想要的結果。

Step 5 SELECT 子句

盡管出現在sql語句的最前面,SELECT在第五步的時候才被處理,SELECT子句返回的表會最終返回給調用者。這個子句包含三個子階段:(5-1)計算表達式,(5-2) 處理DISTINCT,(5-3)應用TOP過濾。

Step 5-1 計算表達式

SELECT子句中的表達式可以返回或者操作前一步表中返回的基本列。如果這個sql語句是一個聚合查詢,在Step 3之后,你只能使用GROUP BY中的列,對不屬于GROUP集合中的列必須使用聚合運算。不屬于FROM表中基本列的必須為其起一個別名,如YEAR(orderdate) AS orderyear。

注意:在SELECT子句中創建的別名,不能在之前的Step中使用,即使在SELECT子句中也不能。原因是sql的很多操作是同時操作(all at once operation),至于什么是all-at-once operation這里就不再介紹了。因此,SELECT子句中創建的別名只能在后面的子句中使用,如ORDER BY。例如:SELECT YEAR(orderdate) AS orderyear . . . ORDER BY orderyear。

在這個例子中:

復制代碼 代碼如下:

SELECT C.customerid, COUNT(O.orderid) AS numorders

結果會得到一個虛擬表VT5-1:

C.customerid numorders
FIFSSA 0
FRNDO 2

Step 5-2:應用DISTINCT子句

如果sql語句中使用了DISTINCT,sql會把重復列去掉,生成虛擬表VT5-2。

Step 5-3:應用TOP選項

TOP選項是T-SQL提供的一個功能,用來表示顯示多少行。基于ORDER BY子句定義的順序,指定個數的列會被查詢出來。這個過程生成虛擬表VT5-3。

正如上文提到的,這一步依賴于ORDER BY定義的順序來決定哪些列應該顯示在前面。如果你沒有指定結果的ORDER BY順序,也沒有使用WITH TIES子句 ,每一次的返回結果可能會不一致。

在我們的例子中,Step 5-3被省略了,因為我們沒有使用TOP關鍵字。

Step 6:ORDER BY子句

前一步返回的虛擬表在這一步被排序,根據ORDER BY子句指定的順序,返回游標VC6。ORDER BY子句也是唯一一個可以使用SELECT子句創建的別名的地方。

注意:這一步和之前不同的地方在于,這一步返回的結果是一個游標,而不是表。sql是基于集合理論的,一個集合沒有對他的行定義順序,它只是一個成員的邏輯集合,因此成員的順序并不重要。帶有ORDER BY子句的sql返回一個按照特定序列組織每一行的對象。ANSI 把這樣的一個對象叫游標。理解這一點對你了解sql很重要。

 上面的步驟如圖所示:

本書中主要內容是參照 Inside Microsoft SQL Server 2008:T-SQL Query,中的內容,大家如果想深入了解sql查詢相關的知識,可以找這本書看看,我這有英文原版的pdf,需要的可以找我要。

您可能感興趣的文章:
  • sql連接查詢中,where關鍵字的位置講解
  • sql中的left join及on、where條件關鍵字的區別詳解
  • Mysql帶And關鍵字的多條件查詢語句
  • MySQL單表多關鍵字模糊查詢的實現方法
  • MySQL 5.7中的關鍵字與保留字詳解
  • sql server關鍵字詳解大全(圖文)
  • SQL中一些小巧但常用的關鍵字小結

標簽:貴州 新鄉 拉薩 上海 呼和浩特 江蘇 重慶 昭通

巨人網絡通訊聲明:本文標題《SQL語句的各個關鍵字的解析過程詳細總結》,本文關鍵詞  SQL,語句,的,各個,關鍵字,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL語句的各個關鍵字的解析過程詳細總結》相關的同類信息!
  • 本頁收集關于SQL語句的各個關鍵字的解析過程詳細總結的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    日韩精品一区二区三区蜜臀| 亚洲成人三级小说| 国产在线不卡视频| 亚洲人人夜夜澡人人爽| 欧美在线观看视频一区二区三区| 国产精品初高中害羞小美女文| 韩国女主播一区| 免费黄色片网站| 日韩一级欧美一级| 日韩精品午夜视频| 少妇一级淫片免费放播放| 欧美精品久久一区| 亚洲一级二级三级在线免费观看| 中文字幕avav| 91九色02白丝porn| 亚洲美女视频在线观看| 中文字幕avav| 欧美浪妇xxxx高跟鞋交| 午夜电影久久久| 在线黄色免费网站| 日韩亚洲欧美在线| 久久99国产乱子伦精品免费| 日韩女同一区二区三区 | 蜜桃视频无码区在线观看| 在线亚洲高清视频| 亚洲一区二区三区小说| 老司机免费视频| 欧美大片顶级少妇| 国产真实乱对白精彩久久| 亚洲午夜久久久| 国产又黄又粗又猛又爽的视频 | 久久精品在线免费观看| 国产精品一区一区| 在线免费观看亚洲视频| 亚洲激情男女视频| 先锋资源av在线| 精品国免费一区二区三区| 国产美女在线精品| 色综合久久久久网| 亚洲成人福利片| 一色道久久88加勒比一| 欧美韩日一区二区三区四区| 不卡电影一区二区三区| 欧美区视频在线观看| 青青草精品视频| 日本女人性生活视频| 一区二区三区不卡视频在线观看| 性久久久久久久久久久| 国产色综合一区| 91麻豆精品视频| 欧美大度的电影原声| 成人免费看视频| 欧美人妖巨大在线| 久久超碰97中文字幕| 黄色一级片中国| 日韩黄色免费电影| 欧美一级片在线视频| 亚洲一二三专区| 老司机精品免费视频| 亚洲精品国产一区二区三区四区在线| 中国极品少妇videossexhd| 久久精品综合网| 黄色av电影网站| 国产区在线观看成人精品| 白丝校花扒腿让我c| 久久婷婷色综合| 久久黄色一级视频| 久久久久久久综合狠狠综合| 91理论电影在线观看| 久久免费视频色| 亚洲美女精品视频| 国产精品网站在线观看| 亚洲天堂av网站| 国产精品久久久久影院老司| 欧美大片免费播放器| 亚洲欧洲精品一区二区精品久久久 | 欧美影院一区二区三区| 精品一区二区在线播放| 欧美视频一区在线| 国产伦精品一区二区三区视频青涩 | 国产视频一区二区在线| 黄色污在线观看| 亚洲色图欧美激情| 午夜影院黄色片| 五月激情综合婷婷| 色婷婷综合五月| 国产一区二区三区综合| 91精品午夜视频| 91亚洲午夜精品久久久久久| 久久精品一区二区三区四区| 熟妇高潮一区二区| 最新国产成人在线观看| 舐め犯し波多野结衣在线观看| 亚洲综合激情小说| 五月天激情丁香| 国内精品国产成人国产三级粉色| 欧美日韩情趣电影| 成人丝袜18视频在线观看| 精品国产污网站| 中文字幕乱视频| 国产精品的网站| 三级黄色录像视频| 精品综合免费视频观看| 欧美一级日韩免费不卡| 91亚洲精品久久久蜜桃| 国产精品成人一区二区艾草| 日本一二三不卡视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩免费观看一区二区三区| eeuss影院一区二区三区 | 9.1成人看片免费版| 亚洲成人av电影| 欧美系列亚洲系列| av激情成人网| 亚洲欧洲日韩一区二区三区| 日韩三级在线观看视频| 国产一区二区三区高清播放| 精品国产免费久久 | 精品国精品国产尤物美女| 免费a v网站| 婷婷成人综合网| 欧美电影在哪看比较好| 最新日本中文字幕| 亚洲国产美女搞黄色| 欧美日韩电影在线播放| 蜜桃色一区二区三区| 亚洲国产成人av| 911精品产国品一二三产区| www日本在线观看| 亚洲在线中文字幕| 欧美日韩精品一区二区天天拍小说 | 中文字幕在线观看视频www| 亚洲免费观看高清完整版在线观看熊| 欧美黑人性猛交xxx| jiyouzz国产精品久久| 亚洲视频在线观看三级| 色综合一个色综合亚洲| 99久久精品国产精品久久| 亚洲美女视频在线| 欧美精品丝袜中出| 久久久久9999| 老司机一区二区| 久久久久99精品国产片| 多男操一女视频| voyeur盗摄精品| 亚洲综合色网站| 欧美高清精品3d| 三上悠亚ssⅰn939无码播放| 久久草av在线| 国产精品久99| 欧美日韩一区二区三区在线| 精品国产一区在线| 麻豆专区一区二区三区四区五区| 久久久精品国产免大香伊| 美国一级片在线观看| 99精品偷自拍| 午夜精品一区二区三区三上悠亚| 日韩精品一区二区三区在线| 能直接看的av| 成人av网址在线观看| 亚洲丰满少妇videoshd| 欧美成人三级电影在线| 亚洲人与黑人屁股眼交| 91女人视频在线观看| 丝袜美腿成人在线| 久久久蜜桃精品| 色哟哟亚洲精品| 精品一区二区视频在线观看| 精品一区精品二区高清| 国产精品成人免费精品自在线观看| 欧美日韩一区视频| 中文字幕免费视频| 不卡的av在线播放| 天天操天天干天天综合网| 国产亚洲va综合人人澡精品| 色综合久久中文综合久久97| 国产二级一片内射视频播放 | 欧美精品一区二区在线观看| 东方av正在进入| 91丝袜在线观看| 国产99久久精品| 午夜不卡av在线| 国产精品三级视频| 欧美精品自拍偷拍| 天天色天天综合| 亚洲欧美日本一区| 成人久久视频在线观看| 亚洲va欧美va天堂v国产综合| 久久久精品欧美丰满| 欧美亚一区二区| 五月婷六月丁香| www.黄色网| 国产精品一区二区91| 亚洲大尺度视频在线观看| 国产三级精品在线| 51午夜精品国产| 日本妇女毛茸茸| 性欧美精品中出| 韩国一区二区三区四区| 国产成人亚洲综合a∨婷婷图片|