MySQL数据库——分组选择数据

目录

第1关:GROUP BY 与聚合函数

GROUP BY与聚合函数的使用

第2关 使用HAVING与ORDER BY

使用having子句进行分组筛选

select语句中,where、group by、having子句和聚合函数的执行次序如下:

Having与Where的区别

Group By 和 Order By


第1关:GROUP BY 与聚合函数

GROUP BY与聚合函数的使用

基本格式:

  1. select [聚合函数] 字段名 from 表名 [where 查询条件] [group by 字段名]

select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中

编程要求:对年级Id和性别进行分组,分别统计表中2、3、4年级的男生总人数和女生总人数。

student表数据结构如下:

stuIdgradeIdsex
02012
02212
03193
05085
06106
01011
02242
04134

预期输出:

  1. gradeId sex count(*)
  2.   2   女  1
  3.   2   男  2
  4.   3   女  1
  5.   4   女  1
#查询表中2,3,4年级中分别男女的总人数
select gradeId,sex,count(*) 
from student 
where gradeId in(2,3,4) 
group by gradeId,sex;

第2关 使用HAVING与ORDER BY

使用having子句进行分组筛选

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

基本格式:

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

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

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

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

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

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

HavingWhere的区别

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

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

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

Group By 和 Order By

基本格式

  1. select [聚合函数] 字段名 from 表名 [where 查询条件] [group 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

预期输出:

  1.  sno  count(*)
  2.   1   3
  3.   2   2
  4.  sno avg(score)
  5.   1  94.3333
  6.   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 pno='语文' and score >= 95) group by sno having avg(score)>90;

########## End ##########
  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椅糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值