SQLServer 2008 技術內幕——T-SQL 查詢 筆記
1、SQL程式設計有許多獨特之處,如:面向集合的思維方式、查詢元素的邏輯處理順序、三值邏輯。如果不掌握這些知識就開始用SQL程式設計,得到的將是冗餘的、效能低下的程式碼,而且難以維護。
2、在SQLServer中負責生成實際工作計劃(執行計劃)的元件是:查詢優化器(query optimizer)。只有在確保結果集正確的前提下,優化器才會走捷徑。明確區分查詢的邏輯處理和物理處理是非常重要的。
3、邏輯查詢的各個階段:
(5) SELECT (5-2) DISTINCT (5-3) TOP (<top_specification>) (5-1) <select_list>
(1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate>
|(1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
|(1-P) <left_table> PIVOT (<pivot_specification>) AS <alias>
|(1-U) <left_table> UNPIVOT (<unpivot_specification>) AS <alias>
(2) WHERE <where_predicate>
(3) GROUP BY <group_by_specification>
(4) HAVING <having_predicate>
(6) ORDER BY <order_by_list>;
第一步:FROM :表示出查詢的來源表,在聯結運算中涉及的階段是(1-J1)笛卡兒積、(1-J2)ON篩選器和(1-J3)新增外部行。並生成虛擬表VT1。
1.1、笛卡兒積:兩表執行笛卡兒積,生成虛擬表VT1-J1。
1.2、ON篩選器:針對VT1-J1中滿足ON為true的行,插入VT1-J2。
1.3、新增外部行:如果指定了OUTER JOIN (相對於CROSS JOIN或INNER JOIN ),則將保留表中沒有匹配的行,作為外部行新增,生成VT1-J3。
第二步:WHERE:根據WHERE 子句中的謂詞對VT1中的資料進行行篩選,只對結果為TRUE的行,插入VT2。
第三步:GROUP BY :根據group by中的列表,將VT2進行分組,每一組只有一個結果行,生成VT3。
第四步:HAVING:根據HAVING出現的謂詞對VT3金信篩選,只讓結果為TRUE的組才插入VT4。
第五步:SELECT:處理SELECT 子句中的元素,產生VT5。
5.1、計算表示式:根據SELECT 列表中的表示式,生成VT5-1。
5.2、DISTINCT:刪除VT5-1中重複的行,生成VT5-2。
5.3、TOP:根據ORDER BY 子句定義邏輯排序,從VT5-2中選擇前面指定數量或百分比的行,生產VT5-3。
第六步:ORDER BY :根據ORDER BY 子句中指定的列名,對VT5-3進行排序。生成遊標VC6。
對於三值邏輯:
a、所有的查詢篩選器(ON、WHERE 和HAVING )都把null當作FALSE來處理。
b、check約束中的null值被當作TRUE來對待。
c、UNIQUE約束、集合運算(UNION 和EXCEPT)、及排序和分組操作,認為兩個null是相等的。
注意:
1、如果FROM 子句中有多個表運算子,則按從左到右的順序進行處理。每個表運算子的結果作為下一個表運算子的左輸入,最後生成虛擬表作為下一階段的輸入。
2、因為在WHERE之前還沒對資料分組,所以WHERE 子句不能使用聚合。在篩選器中,ON對保留表中部分行的刪除並不是最終的,而WHERE是最終的。只有使用外聯結的時候,ON和WHERE才有邏輯區別。
3、如果在查詢中指定了GROUP BY ,後續所有步驟都只能在指定的分組上操作。
4、HAVING是唯一可用於分組資料的篩選器。
5、由於SQL具有多個運算同時計算(all-at-once operation),所以SELECT 語句中的邏輯順序是無關的。
6、ORDER BY 是唯一可以使用SELECT 中別名的步驟。
相關文章
- SQL Server 2008技術內幕:T-SQL語言基礎 筆記SQLServer筆記
- 【Microsoft SQL Server 2008 技術內幕:T-SQL語言基礎】二、查詢篇ROSSQLServer
- Spring技術內幕筆記(2):Spring MVC 與 WebSpring筆記MVCWeb
- 《T-SQL查詢》讀書筆記Part 1.邏輯查詢處理知多少SQL筆記
- WebKit技術內幕WebKit
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《四》表MySql儲存引擎筆記
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《六》鎖MySql儲存引擎筆記
- 《深入分析JavaWeb技術內幕》之讀書筆記(篇三)JavaWeb筆記
- 《spring技術內幕》讀書筆記3-AOP的實現Spring筆記
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《三》檔案MySql儲存引擎筆記
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《七》事務MySql儲存引擎筆記
- sqlserver查詢最接近的記錄SQLServer
- 【Mysql技術內幕筆記--1】--Mysql體系結構和儲存引擎MySql筆記儲存引擎
- 讀書筆記】《PostgreSQL指南-內幕探索》-3.2單表查詢的代價估計筆記SQL
- 【讀書筆記】《PostgreSQL指南-內幕探索》-3.3建立單表查詢的計劃樹筆記SQL
- ShowMeBug 核心技術內幕
- 讀《etcd 技術內幕》
- 揭祕《Arduino技術內幕》UI
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《二》InnoDB儲存引擎MySql儲存引擎筆記
- 《ASP.Net Core技術內幕與專案實戰》讀書筆記_1ASP.NET筆記
- 關於SQLServer2005的學習筆記——子查詢SQLServer筆記
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《五》索引與演算法MySql儲存引擎筆記索引演算法
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《八》備份與恢復MySql儲存引擎筆記
- 簡述Spring技術內幕Spring
- MFC技術內幕簡結 (轉)
- SQLSERVER2008R2 T-SQL備份指令碼SQLServer指令碼
- 查詢SQLSERVER執行過的SQL記錄SQLServer
- 本人新書《SQL Server 2008資料庫技術內幕》前言--已出版新書SQLServer資料庫
- 查詢SQLSERVER版本號SQLServer
- SqlServer遞迴查詢SQLServer遞迴
- 「NGW」前端新技術賽場:Serverless SSR 技術內幕前端Server
- Mybatis技術內幕(2.3.3):反射模組-InvokerMyBatis反射
- Mybatis技術內幕(2.3.4):反射模組-ObjectFactoryMyBatis反射Object
- Mybatis技術內幕(2.3.1):反射模組-ReflectorMyBatis反射
- Mybatis技術內幕(1):Mybatis簡介MyBatis
- [Mysql技術內幕]Innodb儲存引擎MySql儲存引擎
- PostgreSQL技術內幕(七)索引掃描SQL索引
- Mysql技術內幕之InnoDB鎖探究MySql