1. 程式人生 > >《T-SQL查詢》讀書筆記Part 1.邏輯查詢處理知多少

《T-SQL查詢》讀書筆記Part 1.邏輯查詢處理知多少

一、關於T-SQL

  T-SQL是ANSI和ISO SQL標準的MS SQL擴充套件,其正式名稱為Transact-SQL,但一般程式設計師都稱其為T-SQL。

二、邏輯查詢處理各個階段

2.1 邏輯查詢處理流程總覽

2.2 邏輯查詢處理階段解釋

  (1)FROM:標識出查詢的來源表,處理表運算子。每個運算子會應用一系列的子階段。eg.在JOIN連線運算中涉及的階段是笛卡爾積、ON篩選器和新增外部行。FROM階段會生成一個虛擬表,這裡暫定為VT1。

    • (1-J1)笛卡爾積:對涉及到的兩個表執行笛卡爾積(交叉聯接),生成虛擬表VT1-J1。
    • (1-J2)ON篩選器:對VT1-J1中的行根據ON子句中出現的謂詞進行篩選。只有讓該謂詞取值為TRUE的行,才能插入到VT1-J2中。
    • (1-J3)新增外部行:如果指定了OUTER JOIN(相對於CROSS JOIN或INNER JOIN),則將保留表(Preserved Table)中沒有找到匹配的行,作為外部行新增到VT1-J2中,生成VT1-J3。

  (2)WHERE:根據在WHERE子句中出現的謂詞對VT1中的行進行篩選。只有讓謂詞計算結果為TRUE的行,才會插入VT2中。

  (3)GROUP BY:按照GROUP BY子句中指定的列名列表,將VT2中的行進行分組,生成VT3。最終,每個分組只有一個結果行。

  (4)HAVING:根據HAVING子句出現的謂詞對VT3中的分組進行篩選。只有讓謂詞計算結果為TRUE的行,才會插入VT4。

  (5)SELECT:處理SELECT子句中的元素,產生VT5。

    • (5-1)計算表示式:計算SELECT列表中的表示式,生成VT5-1。
    • (5-2)DISTINCT:刪除VT5-1中的重複行,生成VT5-2。
    • (5-3)TOP:根據ORDER BY子句定義的邏輯排序,從VT5-2中選擇前面指定數量或百分比的行,生成VT5-3。

  (6)ORDER BY:根據ORDER BY子句中指定的列名列表,對VT5-3中的行進行排序,生成遊標VC6。

三、查詢示例詳解

3.1 示例場景

  假設有兩張表:Customers和Orders,表結構和資料如下:

  

  這裡我們要查詢來自Madrid並且訂單數少於3個的客戶,查詢程式碼和結果也如下圖所示:

  

3.2 各階段解釋

  (1)FROM階段:

FROM dbo.Customers AS C
  LEFT OUTER JOIN dbo.Orders AS O
    ON C.customerid = O.customerid

  步驟1-J1=>笛卡爾積

  這裡先不考慮LEFT OUTER,通過JOIN交叉聯接後形成虛擬表VT1-J1:

  

  步驟1-J2=>ON篩選器

  ON篩選器的作用在於從上一步生成的虛擬表VT1-J1中的所有行中篩選出只有使 C.customerid = O.customerid 為TRUE的那些行,將其輸出到新的虛擬表VT1-J2中。

  

  步驟1-J3=>新增外部行

  這一步只會在外連結(OUTER JOIN)中才會發生。這裡是:Customers AS C LEFT OUTER JOIN Orders AS O,即Customer作為保留表。最終的虛擬表VT1-J3如下:

  

  *.這裡Customer作為保留表,所以FISSA雖然沒有滿足ON篩選器,但是也會被新增到虛擬表中。

  (2)WHERE階段:

WHERE C.city = 'Madrid'

  在此階段會去掉VT1中客戶為MRPHS的行(因為其cityid不是Madrid),生成如下所示的VT2:

  

ON和WHERE的區別:WHERE對行的刪除是最終的,而ON對行的刪除並不是,因此步驟1-J3新增外部行時會再添加回來。此外,只有當使用外連線時,ON和WHERE才存在這種邏輯區別。 

  (3)GROUP BY階段:

GROUP BY C.customerid

  這一步將VT2中的資料行按組進行重組,得到VT3如下圖所示:

  

  (4)HAVING階段:

HAVING COUNT(O.orderid) < 3

  這一步從VT3中進行篩選,只有使得COUNT(O.orderid)<3邏輯值為TRUE的組,才會進入到VT4。HAVING篩選器是唯一可用於分組資料的篩選器。

  

這裡沒有使用COUNT(*)是因為在外聯接中,COUNT(*)會把外部行也統計在內,比如會將FISSA的訂單數統計為1,這明顯是錯誤的。  

  (5)SELECT階段:

  步驟5-1=>計算表示式

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

  得到VT5-1

  

  步驟5-2=>應用DISTINCT子句

  此示例木有DISTINCT子句,故VT5-1沒有變化。

  步驟5-3=>應用TOP選項

  TOP選項時T-SQL特有的一項功能,允許指定要返回的行數或百分比。不過,此示例也沒有指定TOP,估計VT5=VT5-1。

  (6)ORDER BY階段:

ORDER BY numorders

  這一步將對VT5進行排序,返回遊標VC6。ORDER BY子句也是唯一可以重用SELECT列表中建立的列別名的步驟

  

參考資料

  

  [美] Itzik Ben-Gan 著,成保棟 譯,《Microsoft SQL Server 2008技術內幕:T-SQL查詢》

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

T-SQL查詢讀書筆記Part 1.邏輯查詢處理多少

一、關於T-SQL   T-SQL是ANSI和ISO SQL標準的MS SQL擴充套件,其正式名稱為Transact-SQL,但一般程式設計師都稱其為T-SQL。 二、邏輯查詢處理各個階段 2.1 邏輯查詢處理流程總覽 2.2 邏輯查詢處理階段解釋   (1)FROM:標識出查詢的來源表,處理表

T-SQL查詢讀書筆記Part 3.索引的基本知識

索引優化是查詢優化中最重要的一部分,索引是一種用於排序和搜尋的結構,在查詢資料時索引可以減少對I/O的需要;當計劃中的某些元素需要或是可以利用經過排序的資料時,也會減少對排序的需要。某些方面的優化可以適度提高效能,而索引優化經常可以大幅度地提高查詢效能。 一、表和索引的結構 1.1 頁和區   頁是MS

T-SQL查詢讀書筆記Part 2.執行計劃

一、關於執行計劃 執行計劃是優化器生成的用於確定如何處理一個給定查詢的“工作計劃”。一個計劃包含一組運算子,通常按照特定的順序來應用這些運算子。此外,一些運算子可以在它們之前的運算子還在處理時被應用(即不一定是完全序列),還有一些運算子也有可能被應用多次。 二、圖形化執行計劃 2.1 SSMS中

強大的SQLSQL Cookbook讀書筆記1——對字母數字混合的資料排序

最近,在看SQL Cookbook真的很不錯的一本書,許多解決方案,都十分精妙,真切的體會到了,SQL的強大。 注:我用的是ORACLE 11g 下面是書2.4中的一個例項--對字母數字混合的資料序列的排序 首先,我們需要書中的一張表emp,書中沒有提供建表的檔案或者是語句

關於T-SQL中exists或者not exists子查詢的“偽優化”的做法

png tro ges width 9.png 當前 color 盡心 alt 問題起源 在使用t-sql中的exists(或者not exists)子查詢的時候,不知道什麽時候開始,發現一小部分人存在一種“偽優化”的一些做法,並且向不明真相

數據結構與算法(刺猬書)讀書筆記1)----數組

split() ring 此外 結果 shift 即使 cnblogs 操作符 main 在JavaScript中,數組其實是一種特殊的對象,用來表示偏移量的索引是該對象的屬性,所以JavaScript的數組本質上是對象。同時這些數字索引在內部會被轉換成為字符串類型,因為J

《FDTD electromagnetic field using MATLAB》讀書筆記 Figure 1.2

sam 運行 legend net ext eat hit pri cnblogs 函數f(x)用采樣間隔Δx=π/5進行采樣,使用向前差商、向後差商和中心差商三種公式來近似一階導數。 書中代碼: %% -----------------

android BSP與硬件相關子系統讀書筆記1)android BSP移植綜述

tin 不用 googl csdn splay 編寫 app開發 意圖過濾器 trac 從linux驅動轉行至Android驅動開發大半年了,一開始就產生了一個很糾結目標和問題,就是不停的google如何porting android!這個問題得到的結果對於初出茅廬的我,感

《算法導論》讀書筆記--第1、2章課後題 (轉)

秦九韶 ons 全局變量 思考 end exc ray 存在 檢查 第一章 轉自http://www.cnblogs.com/batteryhp/p/4654860.html 思考題 1-1(運行時間的比較)確定時間t內求解的問題的最大規模。 上面是網上提供的答案。

崔華基於oracle的SQL優化讀書筆記(一)如何得到真實的執行計劃

hash mes getting binary oracl only 中文 fun roc ---恢復內容開始--- 得到目標SQL的執行計劃,大致有以下四種方式: 1.explain plan 命令 2.DBMS_XPLAN包 3.SQLPLUS中的autotrace開關

UML精粹讀書筆記1

淘寶 bsp 技能 uml 這也 參考 一個 每次 現在 我決定每次讀一下書,還是來說說一些想法的好。漫畫就先算了吧,等我把火影補完再說吧。 如果什麽時候我的主站建好了的話,我會在我自己的主站上去更新。 今天終於把這本書的簡體中文版搞到手了,有幾個小插曲: 1.這本書是

《如何編寫研究報告》讀書筆記0-1脈絡

alt 研究 .com 研究報告 png pos ima 分享 info 《如何編寫研究報告》讀書筆記0-1脈絡

PCIE協議解析 synopsys IP loopback 讀書筆記1

overview 沒有 發出 調試 期望 pci 附加 error edit 1 Overview Core支持單個Pcie內核的Loopback功能,該功能主要為了做芯片驗證,以及在沒有遠程接收器件的情況下完成自己的回環。同時,Core也支持有遠程接收器件的lo

C Primer Plus (第6版) 讀書筆記_Chapter 1

抽象 ner 競爭 crete 個數字 面向 ref 編程 bsd 第 1 章 初識 C 語言 ■ C 的歷史和特性 ■ 編寫程序的步驟 ■ 編譯器和鏈接器的一些知識 ■ C 標準 1.1 C 語言的起源 1972年,貝爾實驗室的 丹尼斯 ? 裏奇

線性代數及其應用 讀書筆記11.1 線性方程組

-m 線性代數 align tex center 技術 bubuko image bsp 線性代數及其應用 讀書筆記(1) 1.1 線性方程組

《C程式設計習慣》讀書筆記1-6章)

最近在看兩本國人寫的書:C程式設計習慣、Linux C程式設計。越看越發現如獲至寶。有時真覺得,看國外的書,都能將晦澀概念深入淺出解釋通透,而國內的書,能切合國人的習慣來解釋和應用知識。以前只青睞國外的書,這兩本國內的電子書本來只想簡單瀏覽一遍鞏固基礎,現在越看越想做讀書筆記,因為實在是很多看似

T-SQL基礎(一)之簡單查詢

名詞解釋 SQL: Structured Query Language,結構化查詢語言,是一種在關係型資料庫中用於管理資料的標準語言。SQL是一種宣告式程式語言,即只需表明需要什麼而無需關注實現細節(C#中的LINQ也是如此)。 SQL方言:在SQL基礎上延伸的其它語言,如SQL Server中

Effective Java 第三版讀書筆記——條款1.考慮使用靜態工廠方法替代構造器

lean jdb 底層 public lasso 基本 win inter nds 獲取一個類的實例的傳統方法是使用公開的構造器,除此之外,一個類還可以提供公開的靜態工廠方法(static factory method)來返回它的實例。例如 Boolean 類中的 valu

python爬蟲讀書筆記1

1.使用urllib2模組下載URL import urllib2 def download(url): return urllib2.urlopen(url).read() 2.捕獲異常 出現下載錯誤時,該函式能夠捕獲異常,然後返回None。 import urllib2

老男孩shell實戰讀書筆記1-5章節)

老男孩shell教程(1-5章節) 關於檢視系統變數命令 set: 輸出所有的變數,包括全域性變數和區域性變數 env:只顯示全域性變數 declare:輸出所有的變數、函式、整數和已經匯出(export)的變數 刪除環境變數 unset 變數名 關於設定(全域性)環境變數的三種方法 expo