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(*),当然也是对的。