国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

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

2024-08-31 00:44:18
字體:
來源:轉載
供稿:網友

由于最近需要做一些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表,插入如下數據:

customeridcity

FISSAMadrid

FRNDOMadrid

KRLOSMadrid

MRPHSZion

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

orderidcustomerid

1FRNDO

2FRNDO

3KRLOS

4KRLOS

5KRLOS

6MRPHS

7NULL

假如我們想要查詢來自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


查詢結果為:

customeridnumorders

FISSA0

FRNDO2

下面我們會詳細的講述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.customeridC.cityO.orderidO.customerid

FISSAMadrid1FRNDO

FISSAMadrid2FRNDO

FISSAMadrid3KRLOS

FISSAMadrid4KRLOS

FISSAMadrid5KRLOS

FISSAMadrid6MRPHS

FISSAMadrid7NULL

FRNDOMadrid1FRNDO

FRNDOMadrid2FRNDO

FRNDOMadrid3KRLOS

FRNDOMadrid4KRLOS

FRNDOMadrid5KRLOS

FRNDOMadrid6MRPHS

FRNDOMadrid7NULL

KRLOSMadrid1FRNDO

KRLOSMadrid2FRNDO

KRLOSMadrid3KRLOS

KRLOSMadrid4KRLOS

KRLOSMadrid5KRLOS

KRLOSMadrid6MRPHS

KRLOSMadrid7NULL

MRPHSZion1FRNDO

MRPHSZion2FRNDO

MRPHSZion3KRLOS

MRPHSZion4KRLOS

MRPHSZion5KRLOS

MRPHSZion6MRPHS

MRPHSZion7NULL

Step 1-J2:應用ON過濾,(JOIN 條件)

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

C.customeridC.cityO.orderidO.customerid

FRNDOMadrid1FRNDO

FRNDOMadrid2FRNDO

KRLOSMadrid3KRLOS

KRLOSMadrid4KRLOS

KRLOSMadrid5KRLOS

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玛多县| 天峻县| 玉龙| 杭州市| 黎川县| 葵青区| 石渠县| 松原市| 铜山县| 太谷县| 富顺县| 施秉县| 仁寿县| 长兴县| 廉江市| 本溪市| 平原县| 理塘县| 安陆市| 天台县| 桂阳县| 黔南| 延津县| 烟台市| 广东省| 东乌珠穆沁旗| 凯里市| 绥宁县| 淮北市| 沈丘县| 浦县| 清镇市| 乌恰县| 独山县| 钟祥市| 博客| 南通市| 扶沟县| 鄂托克前旗| 南涧| 华池县|