①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(*),當然也是對的。