SQL Server查詢基礎(1)

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:  From
   2:  Where
   3:  Group by
   4:  Having
   5:  Select 
   6:  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是降序)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章