AVG(grade) AS avg_grade **** having avg_grade 问题

sageking2 2008-10-29 10:07:45

if object_id('sc')is not null drop table sc
go
Create table SC(
sno char(6) NOT NULL,
cno char(2) NOT NULL,
grade numeric(2))
INSERT into SC(sno,cno,grade)
select '200101','c1',90 union all
select '200101','c2',85 union all
select '200101','c3',80 union all
select '210101','c1',85 union all
select '210101','c2',75 union all
select '220101','c3',70 union all
select '230101','c1',99 union all
select '230101','c3',88 union all
select '230101','c2',88
--上面是csdn是我今天早上在csdn获得的绝对没问题
Select sno,AVG(grade) AS avg_grade from SC group by sno having AVG(grade) > 83 order by avg_grade DESC;

Select sno,AVG(grade) AS avg_grade from SC group by sno having avg_grade > 83 order by avg_grade DESC;
--报错:列名'avg_grade' 无效。既然可以用avg_grade来将序排列,为什么不可以avg_grade > 83呢?大家讨论下!
--因为书上(不知道N年前的数据库版本)的是用下面这行语句,而且按自然人的思想也应该是下面这行更能表达意思.

上csdn,用教育网,网速真慢啊!
...全文
803 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
smart_zcg 2008-10-29
  • 打赏
  • 举报
回复
这是因为列的别名的识别时间和having子句中的条件筛选时间是不一样的。
select语句的执行循序中,having子句中的条件筛选先于输出列名称的识别,也就是说having子句执行的时候sql server根本就不知道当前的select语句的输出列是什么,所以你在having子句中试图引用列别名avg_grade肯定不行,这个时候在having子句中sql server不能识别avg_grade。
再举个例子,order by子句是在select执行输出列后的排序操作,所以在排序过程中sql server就已经知道你要输出哪些列了,因此我们通常在order by子句中制定列别名就不会有错误。
建议楼主阅读一下<<inside sql server 2005 T-SQL查询>>这本书的第一章,该章节对于select语句的各个子句在什么时候被解析执行有详细的论述。相信你看过之后就不会提这样的问题了。
水族杰纶 2008-10-29
  • 打赏
  • 举报
回复
/*
这个是用在聚合函数的用法。当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算。运算完后就要用到HAVING 的用法了,就是进行判断了,例如说判断聚合函数的值是否大于某一个值等等
*/
  • 打赏
  • 举报
回复
原因很简单,avg_grade并不是SC的列名,而只是为查询结果中AVG(grade)的列取一个名字。

即在查询结果还没有出来之前avg_grade是不存在的
-狙击手- 2008-10-29
  • 打赏
  • 举报
回复

Select sno,AVG(grade) AS avg_grade from SC group by sno having avg_grade > 83 order by avg_grade DESC;

--------------------------------------
Select
sno,
AVG(grade) AS avg_grade
from
SC
where
avg_grade > 83
group by
sno
order by
avg_grade DESC;
takeshe 2008-10-29
  • 打赏
  • 举报
回复
up
rucypli 2008-10-29
  • 打赏
  • 举报
回复
为组指定条件
通过为作为一个整体的组指定条件(即 HAVING 子句),可限定查询中出现的组。在对数据进行分组和聚合后,将用到 HAVING 子句中的条件。只有符合条件的组才出现在查询中。


先用having 然后 select 出来 avg
CN_SQL 2008-10-29
  • 打赏
  • 举报
回复
这是语法问题,楼主去看看联机丛书,没太多好说的。

34,870

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧