oracle数据库:having 过滤组信息

在获取组信息的时候,如果需要满足一定的条件时,可以使用having来过滤组的条件。
结构:

select ... from ... where ... group by ...having...

这里以下面的表为例子:
在这里插入图片描述
这里还是以性别为分组标准,但是要加上一个条件,平均分大于90的才显示出来【这是对分组后的结果加上一个条件】。

select sex,avg(english) as english from student group by sex having avg(english)>=90;

来看看结果:
在这里插入图片描述
因为男生的平均分小于90分,被过滤掉了。

语法执行顺序:

  1. from student;先知道从哪个表查内容
  2. group by ... 以什么分组,找到分组的标准
  3. having ... 分组后的内容以什么条件过滤
  4. select ... 从符合条件的分组里面拿哪些内容

过滤行记录和组信息

行记录的过滤是针对每条记录的筛选,组信息的过滤是针对组的筛选,是可以同时出现的,先筛选行信息,再过滤组信息。

  1. where 筛选行,只能出现行信息
  2. having 过滤组,只能出现组信息

结构:select ... from ... where ... group by ... having ...
执行顺序:

  1. from ...
  2. where ...
  3. group by ...
  4. having ...
  5. select ...

这里还是以之前的student表来进行试验,不过这里往里面添加几条数据,方便操作。

insert into student values(7,'小红','女',19,86,70);
insert into student values(8,'小兰','女',18,77,66);
insert into student values(9,'小艳','女',17,69,58);
insert into student values(10,'热巴','女',22,83,84);
insert into student values(11,'赵丽颖','女',21,99,98);
insert into student values(12,'鞠婧祎','女',24,62,76);

添加之后查看表里面所有数据如下图:
在这里插入图片描述
这里来做一个例子:

  • 查询学生年龄段和该年龄段里面学生的数量
  • 行记录条件:只统计数学成绩大于60分的学生 【where
  • 分组条件:只记录年龄段里面有2个及以上学生的分组 【having

来看看具体实现:

select age,count(age) from student where math>=60 group by age having count(age)>=2;

执行一下看看结果:
在这里插入图片描述
符合条件的只有18岁的4个学生。

Guess you like

Origin blog.csdn.net/will__be/article/details/117472467