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

 

posted @ 2013-01-28 13:55  伴夏  阅读(690)  评论(0编辑  收藏  举报