ORACLE SQL分组函数的理解
开发工具与关键技术:Oracle sql*plus PLSQL Developer
作者:张国军
撰写时间:2019年03月30日
对于分组函数有些人可能不是很理解、或者是不知道怎么使用,那么我给大家讲解一下我对分组函数的理解。
首先我们看拿下边的表结构举一个例子:
查询每一位学生的学号、姓名、总成绩是多少。
按照表结构我们可以看出所需要的表字段有:Student表(Sno、Sname)和Score表(Degree)
两张表,那么我们需要连表查询,从题目可以得出我们要查询的字段是:学号、姓名、总成绩
我们可以通过Sno进行等值连接。如下
Select a.Sno,Sname,Sum(Degree)
From Student a join Score b on a.Sno=b.Sno;
通过连接查询的我可以得到以下的数据
我们可以看得出每一位同学都考了两课成绩,那我们分组的话只要按照Sname,或者是按照Sno进行分组然后总成绩我们给它一个Sum分组函数就可以了
Select Sno,Sname,Sum(Degree)
From Student a join Score b on a.Sno=b.Sno
Group by Sno,Sname;
Group by 我将它理解为(按什么分组)
那么我们可以看出是按Sno,Sname进行分组。那我们看一下表结构,一个学生的姓名就对应一个学号,所以按Sno,Sname进行分组都是一个道理,只是多强调了一遍。
按照学号进行分组统计成绩,我们也可以这样理解吧:
A同学 第一课成绩a1=60 分,第二课成绩a2 =80分
B同学 第一课成绩b1=40分,第二课成绩b2=70分
那么我们按照学号分组的话那就是:每个同学为一组,然后统计他们的总成绩
那么就是:A同学,总成绩(a1+a2=140分) 为第一条数据
B同学,总成绩(b1+b2=110分) 为第二条数据
那就是A同学所考的科目数分为一组,B同学所考的科目数分为一组,然后把他们所考的科目数的分数相加起来那就是每个同学的总成绩了。
另外值得一提的是,使用分组函数不能使用Where子句进行筛选,也就是:
Select a.Sno,Sname,Sum(Degree)
From Student a join Score b on a.Sno=b.Sno
Where Sum(Degree)>150
Group by a.Sno,Sname;
Where里面是不可以使用分组函数的,所以我们需要使用到另外一个关键词:Having
Having实在Group by之后使用的,Having使用方法跟Where差不多,不同的是Having是对分组函数进行筛选,这是值得我们注意的地方。
Select a.Sno,Sname,Sum(Degree)
From Student a join Score b on a.Sno=b.Sno
Group by a.Sno,Sname
Having Sum(Degree)>150;
这是我个人对分组函数的理解,可能个人理解方式不同,可以作为参考。