T-SQL compute與聚集函數的注意細節

compute 和 compute by 子句

select 工號,姓名,職務,基本工資,部門編號
from 員工
compute count(工號) as 員工總數,avg(基本工資)

提示錯誤:消息 156,級別 15,狀態 1,第 3 行
關鍵字 'as' 附近有語法錯誤。

解釋:改子句中屬性不能取別名,系統會自動分配cnt,avg作爲列名

where中不可以使用聚集函數,當然也不可以使用聚集後的字段的別名

select 商品.商品編號,商品名
from 商品 join 銷售明細 on 商品.商品編號=銷售明細.商品編號
where sum(金額)>10000
group by 商品.商品編號,商品名

錯誤提示:聚合不應出現在 WHERE 子句中,除非該聚合位於 HAVING 子句或選擇列表所包含的子查詢中,並且要對其進行聚合的列是外部引用。

解釋:where子句中不能用聚集函數作爲條件表達式

如果改成:select 商品.商品編號,商品名,sum(金額) as 銷售總額
from 商品 join 銷售明細 on 商品.商品編號=銷售明細.商品編號
where 銷售總額>10000
group by 商品.商品編號,商品名

則提示錯誤:列名 '銷售總額' 無效。

 

這裏需要探討 SQL Select語句完整的執行順序: 

1、from子句組裝來自不同數據源的數據;
2、where子句基於指定的條件對記錄行進行篩選;
3、group by子句將數據劃分爲多個分組;
4、使用聚集函數進行計算;
5、使用having子句篩選分組,通常會使用到聚集函數;
6、計算所有的表達式;
7、select 的字段;
8、使用order by對結果集進行排序,可以使用聚集函數。

SQL語言不同於其他編程語言的最明顯特徵是處理代碼的順序。在大多數據庫語言中,代碼按編碼順序被處理。但在SQL語句中,第一個被處理的子句式FROM,而不是第一齣現的SELECT。SQL查詢處理的步驟序號:

  (1)  FROM <left_table>  

  (3) <join_type> JOIN <right_table> 

  (2) ON <join_condition> 

  (4) WHERE <where_condition> 

  (5) GROUP BY <group_by_list> 

  (6) WITH {CUBE | ROLLUP} 

  (7) HAVING <having_condition> 

  (8) SELECT 

  (9) DISTINCT    

  (9) ORDER BY <order_by_list>

  (10) <TOP_specification> <select_list>

所以在執行where子句時,‘銷售總額’還未計算。

 ③ HAVING子句可以使用(且常常使用聚集函數),但是不可以引用聚集後的別名

select 部門編號,count(*) 人數
from 員工
group by 部門編號
having 人數>3

 提示錯誤:消息 207,級別 16,狀態 1,第 4 行  列名 '人數' 無效。

正確寫法:將別名“人數”改成count(*)即可

④ order by子句後面可以使用聚集函數,且可以使用聚集函數的別名

select 部門編號,count(*) 人數
from 員工
group by 部門編號
order by 人數

這個可以正確顯示查詢結果,如果把人數改爲count(*),當然也是對的。

 

發佈了26 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章