很久沒有寫部落格了,最近一直忙於找工作,心都沒辦法安靜下來。通過最近的面試,也給自己暴露了不少問題,其中很重要的一塊就是資料庫,因為項目的原因,最近兩年在文思的香港馬會的項目組都沒有使用過資料庫,所以資料庫這一塊也成了我的短板,所以也借離職在家這段時間,系統地回顧一下資料庫的知識,我會寫成一個系列並堅持寫下去。
先從select語句寫起,因為它是學習T-SQL的基礎。首先總結一下select語句邏輯處理順序,如下,下面按照邏輯順序來總結。
from
where
group by
having
select
over
distinct
top
order by
from子句
from子句是在邏輯處理階段第一個要處理的查詢子句。它是用來指定要查詢的表名,以及對錶進行操作的表運算子。下面的例子是對Sales資料庫結構描述中的Orders表進行查詢,看sql語句:
SELECT orderid,custid,empid,orderdate,freightFROM Sales.Orders;
執行結果:
注意:1> 應該總是用資料庫結構描述來限定代碼中的對象名稱,如Sales.Order。
2> 應該顯示指定要查詢的列,避免一些額外的代價。
3> select出的結果看起來是以特定的順序返回(以orderid的升序排列)的, 但不能保證絕對這樣。
4> Sql server分隔識別碼使用方括弧,如[Order Details]
where子句
它的作用是過濾由from階段返回的行,可以指定一個謂詞或邏輯運算式。如where階段只保留id為71的客戶下的訂單,sql代碼如下:
SELECT orderid,custid,empid,orderdate,freightFROM Sales.OrdersWHERE custid=71;
程式輸出結果為:
group by子句
group by階段可以將前面邏輯查詢處理階段返回的行按“組”進行組合,每個組由在group by子句中指定的各元素決定。如對於where階段返回的資料中出現的每個僱員id和訂單年份值的唯一組合,sql代碼如下:
SELECT empid , YEAR(orderdate) AS orderyear , SUM(freight) AS totalfreight , COUNT(*) AS numordersFROM Sales.OrdersWHERE custid = 71GROUP BY empid , YEAR(orderdate);
程式輸出結果為:
注意:1,group by階段之後的所有階段(包括having,select以及order by)的操作對象都是組。比如這裡是select。
2,一個元素如果不在group by列表中出現,就只能作為彙總函式(Count,Sum,Avg,Min以及Max)的輸入,比如這裡的Sum和Count函數。