今天繼續發整理學習篇~查詢5步走,一步一回頭~ 通常來說查詢的順序呢~從 From -> Where -> Group By -> Select -> Order By 一般來說我們一個語句從查詢開始,藉助了 AdventureWorks2014 來舉例 SELECT TOP 50 a.Person
今天繼續發整理學習篇~查詢5步走,一步一回頭~
通常來說查詢的順序呢~從 From -> Where -> Group By -> Select -> Order By
一般來說我們一個語句從查詢開始,藉助了 AdventureWorks2014 來舉例
SELECT TOP 50 a.PersonType,a.LastName,a.FirstName,c.CardNumber,c.CardType FROM Person.Person a INNER JOIN Sales.PersonCreditCard b ON a.BusinessEntityID = b.BusinessEntityID INNER JOIN Sales.CreditCard c ON b.CreditCardID = c.CreditCardID ORDER BY a.BusinessEntityID
1、首先,執行這個查詢,第一步首先會找到 From
在From 裡面,決定標識那些需要查詢和返回的表。如果說From 裡面還有表運算符 (比如join) ,那還需要從左到右去執行處理這些運算符。每次運算,都是將1個或者2個表進行運算輸入,返回一個輸出表。返回的輸出表作為再右邊的表的左輸入。以此類推。
最終的操作將為下一個操作作為輸入表。
而每次的運算操作,都分為3個步驟
1、1 第一步會將左右2個表做個連接 ~比方說 a (m 行) 和 b(n行) 做了連接,那首先就會先做出一個 m*n 的虛擬表出來,標識著這2個表參與了連接操作
1、2 第二步會使用 on 來進行根據連接條件進行行篩選 ~ 這個就好理解羅~就是把連接條件是符合的挑選出來嘛~ 不過這裡註意null 值的判斷就可以
1、3 第三步是添加外部行,這個步驟是將保留表中被過濾的行重新添加進去虛擬表。
(*保留表 :我簡單理解就是 a left join b 則 a 為保留表, a right join b 則b 為保留表 a full join b 則 ab 同為保留表)
2、 從from 裡面標識了哪些行需要被檢索出來之後,到了第二步 where 篩選。
(where的作用大家都知道了~我就不說了)
從where 進行篩選,和通過第一步的篩選有什麼不一樣呢? 不一樣的地方在於。被 on 刷走的數據,有可能會通過添加外部行的時候從新添加到中間結果裡面,但是如果被where 刷走的行,則是沒有機會翻身了。這個是它們之間最大的區別
還有就是,通過where 的篩選器的時候在select 之前,所以在where 的篩選裡面,不能使用列別名進行篩選。就是因為這是執行順序所決定的
3、 group by 和 having
group by 也容易,就是將跟在 group by 之後的相同的 expression 值相同的,匯聚成一行進行顯示。
having 嘛~就是對group by 之後聚合的結果可以使用having 進行一個篩選。
因為 group by 和 having 也都是在 select 之前,所以並不能使用列別名,只能用表達式
4、select
通過select 來查出返回到用戶界面的實際數據到底是哪些列,哪些值
4、1 首先是需要計算表達式,在select 裡面,是不允許有這種 select a+1 as b ,b+1 as c 即不允許應用列別名。
(*根據解釋,因為sql server 的運算是並行的,所以在查詢表達式的時候 a+1 和 b+1 是同時進行的,b+1 在運算的時候是不會知道別名b 是什麼值,而是直接拋錯)
4、2 根據步驟4.1 計算出來的表達式,然後就取用 distinct 關鍵字去重~ distinct 是在這一步才發揮作用哦~
4、3 最後是根據top 關鍵字決定是否全部返回結果集
5、Order by
Order By 是走到最後一步了~last shot
最後一步是通過 order by 決定返回的順序。這個時候因為order by 在select 之後,所以order by 就可以引用列別名,但是也再不能使用 別名之前的表達式了(除非表達式是一個欄位並且存在在表裡面)
**關鍵點是通過order by 返回的數據,不是集合,是游標,是游標,是游標!!!這就是為什麼在子查詢,CTE等語句裡面,不允許在不使用top 的情況下使用 order by ,就是因為order by 改變了集合而成為了游標!
好~說完了,說得不好的地方請用力拍
參考:<SQL Server 技術內幕:T-Sql 查詢>