数据库having和聚合函数使用方法

student表|studentid|studentname|classid|age||1|s1|101|20||2|s2|101|22|为什么这样查询select*fr... student表

| studentid | studentname | classid | age |
| 1 | s1 | 101 | 20 |
| 2 | s2 | 101 | 22 |
为什么这样查询select * from student having student.age>21;可以,
select avg(student.age) from student having student.age>21;却会报错?
select * from student having student.age>avg(student.age);这句的含义是什么?
=====================补 充=======================

诚心感谢所有网友的回答对我提供的帮助,谢谢!

(1)select * from student having student.age>21;这条语句中没有分组却能成功,是不是代表,默认将每一条数据分成一个组?
而select avg(student.age) from student;这条查询默认会将所有数据作为一个分组处理;所以当两个糅合在一起的时候就会报错。能这样理解吗?

(2)select * from student having student.age>avg(student.age);查询为空
而select * from student having student.age<avg(student.age);查询出第一条数据来,
为什么会出现这种情况?

能再次帮我解决以上疑惑吗?谢谢!
展开
 我来答
AWPLP
2013-08-29 · TA获得超过752个赞
知道小有建树答主
回答量:171
采纳率:0%
帮助的人:151万
展开全部
having 你可以认为是聚合函数的 where 部分,
使用聚合函数后,比如 avg(age) ,这是是不允许用where限定 avg(age)的,
而是用having avg(age)>21。
有聚合函数后,关于聚合函数的条件就用having。

最后一段的sql的目的是 选出年龄大于平均年龄的 学生的信息 ,但是是错误语句,少了group by。
追问
诚心感谢您的回答对我提供的帮助,谢谢!
(1)select * from student having student.age>21;这条语句中没有分组却能成功,是不是代表,默认将每一条数据分成一个组?
而select avg(student.age) from student;这条查询默认会将所有数据作为一个分组处理;所以当两个糅合在一起的时候就会报错。能这样理解吗?
追答
(1)
第一条语句:你不要纠结如何理解你这条语句了,没有这样写的。sql语句中,增加having 的原因就是因为 使用聚合函数后,where不能限定聚合函数的条件,所以增加了having。
select * from student having student.age>21 没有这样写的,不用聚合函数时基本上可以不考虑having(有时候除外,这里用不到),再者,不同的数据库可能对语法要求不一样,你这样写oracle上应该不行。
第二条语句:select avg(student.age) from student having student.age>21,同上,用having的目的就是为了限定聚合函数,前面用了聚合函数,后面的having就针对聚合函数限定,像你这样即使能跑的通也没有意义的。
记住:出现聚合函数时,用having(特例除外),并且 having一般是跟 group by一起用的,没有聚合函数时用where就行,不用老是想着having的...
(2)
这两条语句能跑的通?应该是错误语句,因为你选的“*”,又用了聚合函数,并且缺少group by等等很多错误..
为什么聚合函数总是伴随着 group by?因为 需要按照group by的字段分组。
比如说 你用到了 avg函数,你要取平均数,但是你是按照什么来取平均数的?你举例的这个表只有两条数据,再加上一条 3,s1,101,10 学号是3 ,但是也叫s1,有重名情况,这时候你按照id进行group by 和 按照 name 进行 group by 所求得的平均数是不一样的,数据条数也是不一样的。
最简单的有having的语句:
select 字段1,字段2,sum(字段3) from 表 A group by 字段1,字段2 having sum(字段3)>常数。
体会一样语法。
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
匿名用户
2013-08-29
展开全部

很简单的问题,你可以这样理解  having 和 where 都是进行条件筛选的,但 having 必须和 group by 同时出现才可以,使用下面的例子吧

select classname 班级名, count(1) 人数
  from student
 where age > 12
 group by classname
 having count(*) > 20

这条SQL的功能是查询 所有学生所在班级年级大于12岁的学生超过20人的班级

这里面用到了分组,首先需要把年级大于12岁的学生找出来,是在分组(group by)之前进行的

然后进行分组,分组以后再判断 count(*) > 20,即 班级人数大于20人的,是在分组(group by)之后进行的

记住这两条就行,where 是在分组(group by)之前处理的,having 是在分组之后处理的

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sky496967173
2013-08-29 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4060
采纳率:80%
帮助的人:589万
展开全部
having大多时候要和group by一起使用;
student.age 最好用别名t.age(给student起个别名);

最后一条sql语句是说:查询出年龄大于平均年龄的学生。
追问
谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式