SQL查詢在日常開發中必不可少的,SQL語句寫的好壞,尤其重要。本系列先以基礎入門。慢慢深入。
注:本系列以讀書筆記形式記錄。
SELECT語句的元素
SELECT語句的目的是對錶進行查詢、應用一定的邏輯處理,並返回結果。按照不同的查詢條件或排序返回不同的結果。
“邏輯查詢處理”是指ANSI SQL定義的概念模型,規定了如何處理一個查詢,以及如何取得最終的結果。
Microsoft SQL Server引擎並沒有嚴格遵守邏輯查詢處理,相反,在物理地處理一個查詢時,它可以自由地調整處理階段的順序,只要最終結果能夠和邏輯查詢處理規定保持一到致。SQL Server可以在查詢的物理處理中採用很多快捷的方式。
爲了更加直觀的描述邏輯查詢和各種SELECT查詢子名。下面看一句SQL腳本。
示例腳本1-1:
Select empid,YEAR(orderdate)As orderyear,COUNT(*) As numorders From Sales.Orders Where custid=71 Group By empid,YEAR(orderdate) Having COUNT(*)>1 Order by empid,orderyear介紹這個語句之前,首先介紹每個查詢子名的邏輯處理順序。
示例腳本1-2:1: From2: Where3: Group by4: Having5: Select6: Order by
以上是SQL子句邏輯處理順序。
注意:Order by是唯一一個在Select以後執行的邏輯子句。
現在分析上面的SQL腳本。
1.從Sales.Orders表中查詢數據。
2.對訂單進行過渡,只保留客戶ID爲71的記錄。
3.按僱員的ID和訂單年份對訂單進行分組。
4.對分組數據(僱員ID和訂單年份)進行過渡,只保留具有多個 訂單的分組。
5.選擇每個分組的僱員ID、訂單年份,以及訂單數量。
6.按照僱員ID和訂單年份對輸出結果進行排序。
我們不能按照邏輯順序來編寫SQL腳本,必須從SELECT開始寫起。
FROM子句
From子名是在邏輯處理階段第一個要處理的查詢子句。它用於指定要查詢的表名,以及對這些表進行操作的表運算符(暫時不介紹運算符)。
示例腳本1-1指定對Sales數據庫架構中的Orders表進行查詢。
WHERE子句
在Where子句中,可以指定一個條件或多個條件,過渡由From階段返回的行,只有滿足條件的才返回行。示例腳本1-1只保留ID爲71的客戶的訂單。
Where子句對查詢性能有重要影響。在過渡表達式的基礎上,SQL Server會計算使用什麼索引來訪問請求的數據。與掃描整個表相對,通過使用索引,有時可以大幅減少SQL Server在獲取請求的數據時付出的代價。
GROUP BY子句
Group by 可以淨前面的邏輯查詢處理返回的行按“組”進行組合。
示例腳本1-1是通過每個僱員ID及訂單年份進行分組。
如果查詢涉及到分組,那麼Group by階段之後的所有階段(包括Having、Select、Order by)的操作對象都是組,而不是單獨的行。每個組最終也表示 爲查詢結果集中的一行。
如果查詢涉及到分組,From前面的要顯示的元素名必須要在Group by後面寫出元素名名。但是如果使用聚合函數(Count、Sum、Avg、Min、Max)就不必寫這些元素名。
HAVING子句
Having子句用於指定對組進行過濾的條件,這與Where階段對單獨的行進行過濾相對就。
因爲Having子句是在對行進行分組後的處理。可以可以在邏輯表達中引用聚合函數。示例腳本1-1Having子句中使用了邏輯表達式Count(*)>1,意味着Having只保留多行的組。
SELECT子句
Select子句用於指定需要在查詢返回結果中包含的列。Select列表中的表達式可以直接基於正在查詢的各個列,也可以在此基礎上進一步的處理。示例腳本1-1empid,YEAR(orderdate)As orderyear。別名除了使用As以外,T-Sql還支持<別名>=<表達式>和<表達式> 中間是空格<別名>。
就是因爲這樣別名定義方式不同,就有這麼個情況,如果在Select列表中的兩個列名之間忘記指定一個逗號,執行起來也不會失敗。相反,Sql Server會認爲第二個是第一個列名的別名。示例:
Select Orderid Custid From Sales.OrderValues查詢出來的結果是Orderid ,但是名字確是Custid 。以後寫SQL語句一定要仔細,這個錯誤很難查出來。
Select子句是在From、Where、Group by、Having子句後處理的。
ORDER BY子句
Order by子句用手 展示數據時對輸出的數據進行排序。從邏輯查詢處理來看,Order by是最後一個的一個子句。
如果不指定Order by子句,查詢結果的順序是自由排序的。可以顯示的指定查詢結果排序Order by 元素名 Desc或Order by 元素名 ASC(Asc是升序、Desc是降序)