如何使用使用 HAVING 与 ORDER BY?

时间煮雨
@R星校长

使用having子句进行分组筛选

简单来说,having子句用来对分组后的数据进行筛选,即having针对查询结果中的列发挥筛选数据作用。因此having通常与Group by连用。

基本格式:

select [聚合函数] 字段名 from 表名 [where 查询条件] [group by 字段名] [having 字段名 筛选条件]

Info的数据信息仍如下:

categorycountdigest
a5a2002
a2a2001
a11a2001
b20b2003
b15b2002
b3b2001
c9c2005
c9c2004
c8c2003
c7c2002
c4c2001

示例:查询将表中数据分类后数量大于20的类别信息

在这里插入图片描述

select语句中,wheregroup byhaving子句和聚合函数的执行次序如下:

  1. where子句从数据源中去除不符合条件的数据;

  2. 然后group by子句搜集数据行到各个组中;

  3. 接着统计函数为各个组计算统计值;

  4. 最后having子句去掉不符合其组搜索条件的各组数据行。

HavingWhere的区别

where子句都可以用having代替,区别在于where过滤行,having过滤分组;

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行;

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件过滤出特定的组,也可以使用多个分组标准进行分组。

having结合where示例:

在这里插入图片描述

Group ByOrder By

基本格式

select [聚合函数] 字段名 from 表名 [where 查询条件] [group by 字段名] [order by 字段名 排序方向]

示例:(以降序方式输出数据分类的汇总)

在这里插入图片描述
若分组字段和排序字段一样时,可不需要order by关键字,则只需告知排序方向,即可简写成:

在这里插入图片描述

编程要求

  1. 我们要评选三好学生,条件是至少有两门课程在90分以上(包括90分)才能有资格,请列出符合的学生的学号(sno)及其90分以上(包括90分)科目总数;
  2. 学校评选先进学生,要求平均成绩大于90分(包括90分)的学生都有资格,并且语文课必须在95分以上(包括95分),请列出有资格的学生的学号(sno)及其科目的平均分。

给定数据表tb_grade格式如下:

snopnoscore
1语文95
1数学98
1英语90
2语文89
2数学91
2英语92
3语文85
3数学88
3英语96
4语文95
4数学89
4英语88

预期输出:

sno    count(*)
1        3
2        2
sno    avg(score)
1        94.3333
4        90.6667

开始你的任务吧,祝你成功!

USE School;

#请在此处添加实现代码
########## Begin ##########

#1.查询表中至少有两门课程在90分以上的学生信息
select sno, count(*) 
from tb_grade
where score >= 90
group by sno 
having count(*) >= 2;

#2.查询表中平均成绩大于90分且语文课在95分以上的学生信息
select sno, avg(score)
from tb_grade
where sno in 
(select sno from tb_grade 
where score >=95 and pno = '语文')
group by sno
having avg(score) > 90;

########## End ##########

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页