在我们的日常工作中,写sql的时候,group by应该是每个程序员都会遇到的。
今天,我们来谈论一下关于group by 的相关理解。
针对group by 的例子,我们可以写成如下样子:
select (1) from your_table where (2) group by (3) having (4)
下面我们来看一下1、2、3、4分别代表什么,应该怎么用?
首先,我们来看(3):
(3)为group by的字段,字段的选择为:前面sql语句(select (1) from your_table where (2))锁查询出来的字段和聚合函数。
其次,来看(1):
因为,我们再语句中用到了group by,所以,(1)中的列只能是group by 的列或聚合函数(avg,max,min... ...)
再来看(2):
(2)中的限制条件是针对前面查询语句(select (1) from your_table)和一般where语句无异。
最后,我们来看(4):
(4)是什么呢?其实(4)和where的作用是一样的,不同的是它(4)限制的范围为group by 的字段或聚合函数。
说了这么多,大家肯定还是有疑惑。
下面我们用一个实例来进行说明:
--创建表并插入数据: create table sc( 学号 char(3), 课程号 char(5), primary key(学号,课程号), 成绩 int ); --然后插入数据: insert into sc values('103','3-245',86); insert into sc values('105','3-245',75); insert into sc values('109','3-245',68); insert into sc values('103','3-105',92); insert into sc values('105','3-105',88); insert into sc values('109','3-105',76); insert into sc values('101','3-105',64); insert into sc values('107','3-105',91); insert into sc values('108','3-105',78); insert into sc values('101','6-166',85); insert into sc values('107','6-166',79); insert into sc values('108','6-166',81);
好了,现在我们有了表和数据,我们来完成一个实验吧!
实验:查询最低分大于70,且最高分小于90的学号列。
首先,我们应该考虑的是,我们是不是需要分组,针对这个实验,答案是肯定的。
那么,我们又应该以哪一个字段作为依据进行分组呢?分析过后,我们应该以学号作为分组。
最后,我们看到有两个比较关键的字眼“最低分”、“最高分”。那么我们是一定需要用到聚合函数的。
明白以上几个点后,我们就要编写sql语句了。
这个sql语句可以编写为:
select 学号,min(成绩)as 最低分,max(成绩)as 最高分 from sc group by 学号 having MIN(成绩) > 70 and MAX(成绩) < 90;
结果如下: