关于聚合函数和列

关于聚合函数和列

http://img1.sycdn.imooc.com//climg/5a3e661b000102a706580325.jpg第15行和24行比较,同样在查询的列该列的情况下,按照grade分组,为什么having后出现的列放在聚合函数中count(age)写条件不会有问题,直接用列id写条件就有问题?

而第15行和19行比较,在查询的列出现id后,having中出现的列即使不放在聚合函数中就不会有问题;

后面又试了一下,如果在group by按照某列分组后,select没有出现该列,having仍可以直接使用该列写条件;

所以,位于select后的列,group by后的列,以及having后的列,三者有什么关系?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
慕粉0907203 2017-12-24 13:02:28

having后面一般都用聚合函数,也就是分组后,就要以组为单位进行比较,having后面也可以不用聚合函数,但是没什么意义,就像第19行,执行完也没结果吧。

我查了一些资料,自己也试了一下,对于select和group by没有严格的限制,只要是表中的字段就可以了,对于having后面的内容做了一下实验,可以跟select后面写的字段;如果select后没写,可以跟group by后面的字段,也可以跟select后面定义的列的别名;然后就是聚合函数了。我觉得吧,只要能根据需求写出sql语句就可以了,如果出现问题再排查。


  • 提问者 慕圣4212008 #1
    其实上面的图我对比发现了一个现象,have后的筛选条件中出现的列,要么被聚合函数修饰;要么出现在group by/select后的查询字段中,否则会报错;第15行执行会报错就是这个原因;但是不明白为什么会这样; 你说的最后一句话其实我不是很赞同,如果每次出现问题都要等执行后才发现,不如先弄清楚原理,防范于未然; 我查到的group by原则只有这条:group by函数应该的使用应该是SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数 ,但是看18行这条语句就可以执行成功且有结果,id并没有被放入聚合函数中;
    2017-12-24 14:15:36
  • 好帮手慕珊 回复 提问者 慕圣4212008 #2
    你好!having后面跟select后面的字段,也可以跟聚合函数,这些都是sql语句的语法规则,没有深层的原理,语法上就是这么设计的。可以把你查到并实践了的这些内容,总结之后记录下来,方便以后查看。祝学习愉快!
    2017-12-25 10:01:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师