首先看下面一條比較完成語句,都是比較常見的關鍵字。
USE Temp; 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;
我們來詳細分析一下sql語句的邏輯處理順序,雖然select在每條語句的第一位,但實際上它是被最后才處理的
1.from
2.where
3.group by
4.having
5.select
6.order by
7.TOP
在仔細分析每個執行順序代表的意思 (它的實際順序)
FROM Sales.Orders WHERE custid = 71 GROUP BY empid, YEAR(orderdate) HAVING COUNT(*) > 1
SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numorders ORDER BY empid, orderyear;
1.從 Orders 表查詢數據
2.根據條件篩選客戶ID等於71的
3.對客戶id和訂單年度 進行分組
4. 再選出大於一個訂單的組
5.返回查詢出的數據 以及你要展示的字段
6.最終對客戶id 和訂單 進行排序
7.輸出
輸入的鍵入順序和處理順序不一致是有原因的,SQL設計師是為了讓用戶按照英文的方式提供自己的請求
建議、坑
1. from 表時 最好給定 庫名和表名 Sales.Orders 讓表顯示表示 不用程序檢索。
2. where 子句相當重要 SQL Server 會對where 條件 進行評估訪問請求數據要使用的索引,通過索引可以大大減少表掃描時間
同時 where 子句檢索 完成后 它返回的是檢索結果為True的行 ,但始終記住, SQL 數據庫使用三值謂詞邏輯,也就是說有三個結果。
True,False 或 UNKNOWN , 返回true 行 並不等同於 不返回False 實際上是不返回 False 行 和 UNKNOWN 行 以后會再博客中專門講NULL。
3.記住除count(*)之外, 聚合函數都是忽略NULL標記 如果有一組數據“1,1,3,4,5,null”列名為qty 表達式Count(*) 返回的是6 但是 Count(qty)
是5 count中給定顯示值 就會默認尋找已知值 也可以 count(distinct qty ) 返回的是4 去重復 這個 可以用來 處理 返回每個不重復統計問題很方便 它和 select distinct 有很大性能區別 以后會細講 也可以 sum(distinct qty ) 是13 也是用作統計不重復數據。
4.因為 group by 屬於行處理 在having 先計算所以having 中可以出現 聚合函數 。
5.像上面的 “YEAR(orderdate)” SQL Server 只對它運行一次 能識別查詢中重復使用的相同表達式
6.最好別使用 select * 盡管你要查詢 所有字段。
7.使用 order by 對有大量重復的字段進行排序是無效的 例如對日期進行排序 這樣一個排序選10條 會有多個被認為是對的結果 所以我們要確保排序字段的數據唯一性, 以及在 select distinct 時 排序 會導致 單個結果對應多個源數據行。