黑马程序员技术交流社区

标题: 关于数据库的 GROUP BY [打印本页]

作者: 摄影勾魂    时间: 2013-12-5 22:15
标题: 关于数据库的 GROUP BY
本帖最后由 摄影勾魂 于 2013-12-6 14:15 编辑

在王珊著的《数据库系统概论》第四版P99,例33:求各个课程号及相应的选课人数,给的查询语句是:
  1. SELECT Cno,COUNT(Sno)
  2. FROM SC
  3. GROUP BY Cno;
复制代码

。我现在想把问题中的课程号换成课程名,怎么做?希望有书的同学帮忙看看。这一改涉及的问题好多,不管它有没有价值,我只想知道我就是想得到这么个结果,有没有办法解决。我目前能想到的就是  先查出各个课程号以及对应的选课人数,然后以这个结果建立新表(或者视图),再用新表(或视图)和课程表连接查询。不知道大家有没有更好的办法,最好是不用建表,一旦建表意义就不大了。   这三幅图片分别对应学生、课程和选课三张表。学过王珊这本书的同学应该都很熟悉。我现在就想用查询语句实现这个想法,不要视图,触发器什么的。

作者: 红鹰(Jake)    时间: 2013-12-5 23:47
select Cname,count(sno) from Course inner join Sc on Course.Cno=SC.Cno order by Cname
不知道楼主是否是这个意思
作者: 摄影勾魂    时间: 2013-12-6 09:18
红鹰(Jake) 发表于 2013-12-5 23:47
select Cname,count(sno) from Course inner join Sc on Course.Cno=SC.Cno order by Cname
不知道楼主是否 ...

在我这儿这些语句运行不了。提示:不是单组分组函数。

作者: 摄影勾魂    时间: 2013-12-6 09:44
红鹰(Jake) 发表于 2013-12-5 23:47
select Cname,count(sno) from Course inner join Sc on Course.Cno=SC.Cno order by Cname
不知道楼主是否 ...

你的这个查询语句,使用内连接时是不是可以去掉 inner join ……on ,用where 来替代。这两种方式有啥区别我也不是很清楚,还有最后那个按课程名排序好像也没啥必要。我这个想法应该是不可行而不是不允许,直接在理论上就是不合理的,聚集函数只能作用于单个表。要得到想要的结果,看来只能建一个视图,然后再进行连接查询了,唉。还是谢谢你啊。
作者: 摄影勾魂    时间: 2013-12-6 14:11
本帖最后由 摄影勾魂 于 2013-12-6 14:12 编辑

痛苦了一天终于想到错在哪儿了,我一直忘了一条规则:出现在SELECT 后的字段除了聚集函数外,必须是出现在 GROUP BY 后面的字段。现在这个问题终于解决了。下面的才是我想要的结果:
作者: 摄影勾魂    时间: 2013-12-8 19:28
本帖最后由 摄影勾魂 于 2013-12-8 19:32 编辑

今天终于得到最初想要得到的结果:





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2