SQL Server 2008的邏輯查詢處理步驟
最近我則剛剛收到了微軟最有價(jià)值專家項(xiàng)目組寄來(lái)的該書(shū)的SQL Server 2008英文版本-《Inside Microsoft SQL Server 2008:T-SQL Querying》(http://www.microsoft.com/learning/en/us/book.aspx?ID=12804&locale=en-us),大致翻了一下,發(fā)現(xiàn)內(nèi)容變動(dòng)不少,既有新增的章節(jié),也有基于SQL Server 2005或2008新技術(shù)重新書(shū)寫(xiě)的SQL查詢示例。
我先就邏輯查詢處理步驟方面給大家介紹一下兩本書(shū)之間的差異吧,因?yàn)槲乙苍趧傞_(kāi)始閱讀,以后逐步給大家介紹。
我們知道,查詢的邏輯處理過(guò)程是分階段完成的,每個(gè)階段都會(huì)產(chǎn)生一個(gè)虛擬表,該虛擬表會(huì)作為下一個(gè)階段的輸入。但是,這些過(guò)程中間階段生成的虛擬表對(duì)于查詢用戶是不可用的,只有最后階段所生成的虛擬表(即查詢結(jié)果)才返回給查詢用戶。
在該書(shū)的SQL Server 2005版本中,將一個(gè)聯(lián)接查詢的邏輯處理分為了10個(gè)步驟:
(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
而在SQL Server 2008版本中,則對(duì)邏輯階段的描述擴(kuò)展到了所有的邏輯語(yǔ)句,而不僅僅是聯(lián)接處理,如APPLY、PIVOT等。按這種分類方式,將邏輯步驟分成了6部分,部分步驟中包含了子步驟。
(5)SELECT (5-2)DISTINCT (5-3)<TOP_specification> (5-1)<select_list>
(1)FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <join_condition>
|(1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
|(1-P) <left_table> PIVOT(<pivot_specifications>) AS <alias>
|(1-U) <left_table> UNPIVOT(<unpivot_specifications>) AS <alias>
(2)WHERE <where_condition>
(3)GROUP BY <group_by_list> (3-CR)WITH {CUBE | ROLLUP}
(4)HAVING <having_condition>
(6)ORDER BY <order_by_list>
下圖更詳細(xì)地描述了各個(gè)處理步驟的流程。
這種步驟分類相比2005版本而言更加全面和具體。上面步驟中的3-CR是我添加上去的,我覺(jué)得這樣的描述更加全面。3-CR中的WITH ROLLUP和WITH CUBE參數(shù),在SQL Server 2008中已經(jīng)被GROUP BY子句的GROUPING SETS、ROLLUP和CUBE運(yùn)算符代替,不再推薦使用不符合ISO標(biāo)準(zhǔn)的WITH ROLLUP、WITH CUBE和ALL語(yǔ)法。但是,這并不影響邏輯處理的順序。
下面是對(duì)邏輯處理過(guò)程中各個(gè)步驟的說(shuō)明,請(qǐng)注意虛擬表(VTn)的生成步驟:
· 步驟1(FROM):該步驟中用于驗(yàn)證查詢的源表,并處理表操作符。每個(gè)表操作符應(yīng)用于一系列子步驟。例如,在上面用于聯(lián)接的(1-J)步驟中會(huì)涉及如下的子步驟。最終這些子步驟完成后,將生成虛擬表VT1。
Ø (1-J1):執(zhí)行l(wèi)eft_table和right_table兩個(gè)表的交叉聯(lián)接(笛卡兒乘積),生成虛擬表VT1-J1;
Ø (1-J2):對(duì)笛卡兒乘積應(yīng)用ON篩選器,生成虛擬表VT1-J2;
Ø (1-J3):如果是外部聯(lián)接,會(huì)在該步驟中將被ON篩選掉的外部行添加到VT1-J2中,生成VT1-J3。否則,將跳過(guò)該步驟。
· 步驟2(WHERE):對(duì)VT1應(yīng)用WHERE篩選器,將符合篩選條件的行插入到VT2中。
· 步驟3(GROUP BY):按GROUP BY子句中的列列表對(duì)VT2中的行分組,生成VT3。如果語(yǔ)句中包含WITH CUBE或WITH ROLLUP,則將分組統(tǒng)計(jì)結(jié)果再次加總后插入VT3,生成VT3-RC。
· 步驟4(HAVING):對(duì)VT3應(yīng)用HAVING篩選器,將符合篩選條件的行插入到VT4。
· 步驟5(SELECT):處理SELECT子句中的元素,生成VT5。
u (5-1)計(jì)算表達(dá)式:該步驟計(jì)算SELECT列表中的表達(dá)式,生成VT5-1;
u (5-2)DISTINCT:從VT5-1中移除重復(fù)行,生成VT5-2;
u (5-3)TOP:該步驟根據(jù)ORDER BY子句中指定的排序規(guī)則,從VT5-2的開(kāi)始處篩選出指定數(shù)量或比例的行。
· 步驟6(ORDER BY):該步驟對(duì)VT5-3中的行按ORDER BY子句中的列列表進(jìn)行排序,生成一個(gè)游標(biāo)VC6。
相關(guān)文章
我也有微信朋友圈了 Android實(shí)現(xiàn)
最近寫(xiě)了一個(gè)簡(jiǎn)單的朋友圈程序,包含了朋友圈的列表實(shí)現(xiàn),視頻的錄制、預(yù)覽與上傳,圖片可選擇拍照或者從相冊(cè)選取,從相冊(cè)選取可以一次選擇多張照片,并且限制照片的張數(shù),想擁有真正屬于自己的朋友圈嗎?快來(lái)圍觀2016-05-05sql 自定義百分比轉(zhuǎn)換小數(shù)函數(shù)代碼
sqlserver中自定義百分比轉(zhuǎn)換小數(shù)函數(shù),需要的朋友可以參考下。2011-09-09SQLSERVER 語(yǔ)句交錯(cuò)引發(fā)的死鎖問(wèn)題案例詳解
這篇文章主要介紹了SQLSERVER 語(yǔ)句交錯(cuò)引發(fā)的死鎖研究,要解決死鎖問(wèn)題,個(gè)人感覺(jué)需要非常熟知各種隔離級(jí)別,尤其是 可提交讀 模式下的 CURD 加解鎖過(guò)程,這一篇我們就來(lái)好好聊一聊2023-02-02SQL注入之sqlmap入門(mén)學(xué)習(xí)
本文主要介紹了SQL注入之sqlmap入門(mén)學(xué)習(xí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05SQL Server數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程介紹
這篇文章主要介紹了SQL Server數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程介紹,本文講解了什么是存儲(chǔ)過(guò)程、存儲(chǔ)過(guò)程語(yǔ)法、存儲(chǔ)過(guò)程的一些使用實(shí)例等內(nèi)容,需要的朋友可以參考下2015-01-01SqlServer2012中LEAD函數(shù)簡(jiǎn)單分析
SQL SERVER 2012 T-SQL新增幾個(gè)聚合函數(shù): FIRST_VALUE LAST_VALUE LEAD LAG,今天我們首先來(lái)簡(jiǎn)單分析下LEAD,希望對(duì)大家有所幫助,能夠盡快熟悉這個(gè)聚合函數(shù)2014-08-08實(shí)現(xiàn)按關(guān)健字模糊查詢,并按匹配度排序的SQL語(yǔ)句
SQL語(yǔ)句實(shí)現(xiàn)按關(guān)健字模糊查詢,并按匹配度排序2009-09-09sql實(shí)現(xiàn)split函數(shù)的腳本
這篇文章主要介紹了sql實(shí)現(xiàn)split函數(shù)的腳本,大家參考使用吧2013-11-11