首先看下麵一條比較完成語句,都是比較常見的關鍵字。 我們來詳細分析一下sql語句的邏輯處理順序,雖然select在每條語句的第一位,但實際上它是被最後才處理的 1.from 2.where 3.group by 4.having 5.select 6.order by 在仔細分析每個執行順序代表的意 ...
首先看下麵一條比較完成語句,都是比較常見的關鍵字。
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
在仔細分析每個執行順序代表的意思 (它的實際順序)
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 時 排序 會導致 單個結果對應多個源數據行。