GROUP BY 与 聚合函数、 HAVING 与 ORDER BY-MySQL数据库 - 分组选择数据(头歌实践教学平台)

文章目的初衷是希望学习笔记分享给更多的伙伴,并无盈利目的,尊重版权,如有侵犯,请官方工作人员联系博主谢谢。

目录

第1关:GROUP BY 与 聚合函数

任务描述

相关知识

GROUP BY与聚合函数的使用

编程要求

 

第2关:使用 HAVING 与 ORDER BY

任务描述

相关知识

使用having子句进行分组筛选

编程要求


第1关:GROUP BY 与 聚合函数

任务描述

本关任务:使用GROUP BY关键字结合聚合函数将数据进行分组。

相关知识

在之前的实训中我们简单的提到过GROUP BY关键字,本实训让我们进一步了解GROUP BY与聚合函数的使用。

为了完成本关任务,你需要掌握: 1.GROUP BY与聚合函数的结合使用; 2.GROUP BYSELECT指定的字段限制。

GROUP BY与聚合函数的使用

基本格式:

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

先提供表Info结构如下:

categorycountdigest
a5a2002
a2a2001
a11a2001
b10b2003
b6b2002
b3b2001
c9c2005
c9c2004
c8c2003
c7c2002
c4c2001

示例:将表中数据分类并汇总

GROUP BYSELECT指定的字段限制

示例:

 
  1. select category,sum(count),disgest from info group by category;

执行后会提示下错误,如下图。这就是需要注意的一点,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中

编程要求

在右侧编辑器补充代码,对年级Id和性别进行分组,分别统计表中2、3、4年级的男生总人数和女生总人数。

student表数据结构如下:

stuIdgradeIdsex
02012
02212
03193
05085
06106
01011
02242
04134

要求输出结果显示如下:

USE School;

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

#1.查询表中2,3,4年级中分别男女的总人数
select gradeId,sex,count(*) #从student表中选择年级、性别、和统计每一行的个数
from student
where gradeId in (2,3,4)#筛选年级2,3,4出来
group by gradeId,sex#根据相同gradeId和sex划分为一个组内
########## End ##########

第2关:使用 HAVING 与 ORDER BY

任务描述

本关任务:按照要求编写sql查询语句。

相关知识

为了完成本关任务,你需要掌握:

1.使用having子句进行分组筛选;

2.HavingWhere的区别;

3.Group ByOrder By

使用having子句进行分组筛选

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

基本格式:

 
  1. 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 By 和 Order By

基本格式

 
  1. 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

测试说明

平台会对你编写的代码进行测试:

预期输出:

USE School;

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

#1.查询表中至少有两门课程在90分以上的学生信息
select sno,count(*)#选择学生、科目个数连接
from tb_grade
where score>=90 #条件是分数大于90
group by sno having count(pno)>=2;#选择将sno相同的化为一组内,并且选择pno计数大于2的



#2.查询表中平均成绩大于90分且语文课在95分以上的学生信息
select sno,avg(score) 
from tb_grade 
where sno
in #嵌套筛选,先在表中选出语文成绩大于95的同学,然后在外边,从这些同学当中选出平均成绩大于90的
(select sno 
 from tb_grade 
 where  score>=95 and pno ="语文"
 ) 

group by sno having avg(score)>=90;

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

<think>好的,用户想了解SQLGROUP BY聚合函数的用法及系。首先,我需要回顾一下GROUP BY的基本概念。GROUP BY用于将结果集按指定列分组,通常聚合函数一起使用,比如SUM、AVG、COUNT等。这样可以对每个分组进行统计计算,而不是整个表。 接下来,我得理清它们之间的系。聚合函数本身如果不搭配GROUP BY的话,只会对整个数据集进行计算,比如SELECT COUNT(*) FROM table会返回总行数。但加上GROUP BY后,就可以按特定列分组统计,例如按部门统计员工数量。 然后要考虑用户可能遇到的常见问题,比如分组后的筛选。这里需要提到HAVING子句,它WHERE的区别在于,HAVING分组后过滤,而WHERE在分组前。例如,筛选出销售额总和超过1000的部门。 用户提供的引用资料里提到了GROUP BY的语法和聚合函数的结合使用,还有JDBC的例子。我需要将这些内容整合到回答中,确保引用正确。例如,引用[1]说明GROUP BY聚合函数的使用场景,引用[3]提到聚合函数WHERE和GROUP BY的结合。 还要注意用户提到的示例代码,比如直接分组聚合SQL语句,可能需要用具体的例子来说明,比如按产品净重分组计算销售总额。此外,用户可能对分组后的排序有疑问,可以提到ORDER BY的使用。 最后,生成的相问题需要覆盖常见的使用场景、错误处理、性能优化等,帮助用户进一步学习。例如,GROUP BY和DISTINCT的区别,多字段分组的使用,以及如何优化包含GROUP BY的查询性能。</think>### GROUP BY聚合函数系及使用方法 #### 一、基本系说明 1. **依赖系**: GROUP BY 必须聚合函数配合使用,聚合函数(如$COUNT(), SUM(), AVG()$)用于计算分组后的统计值[^1][^3]。 $$SELECT \ 分组字段,\ 聚合函数(字段) \ FROM 表 \ GROUP BY 分组字段$$ 2. **功能互补**: - 聚合函数负责计算数值特征(总和、平均值等) - GROUP BY 定义分组维度(如按部门、地区分组) #### 二、基础使用步骤 1. **单字段分组** ```sql -- 按产品净重分组统计销售总额 SELECT net_w, SUM(sale_price) FROM milk_tea GROUP BY net_w; -- 引用[2]的语法结构 ``` 2. **多字段分组** ```sql -- 按部门和职位统计平均薪资 SELECT department, position, AVG(salary) FROM employees GROUP BY department, position; ``` 3. **分组后过滤** 使用 HAVING 子句对分组结果筛选: ```sql SELECT category, COUNT(*) FROM products WHERE price > 100 -- 分组前筛选 GROUP BY category HAVING COUNT(*) > 10; -- 分组后筛选 ``` #### 三、典型场景示例 1. **带条件统计** ```sql -- 统计每个地区2023年的订单总金额 SELECT region, SUM(order_amount) FROM orders WHERE YEAR(order_date) = 2023 -- 引用[3]的WHERE配合使用 GROUP BY region; ``` 2. **多层聚合** ```sql -- 查询各部门最高平均薪资 SELECT MAX(avg_salary) FROM ( SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department ) dept_avg; ``` #### 四、常见错误规避 1. **SELECT字段约束** SELECT子句中只能包含: - GROUP BY指定的分组字段 - 聚合函数表达式 ❌ 错误示例: ```sql SELECT product_name, SUM(price) -- product_name未在GROUP BY中 FROM products GROUP BY category; ``` 2. **NULL值处理** GROUP BY会将所有NULL值归为同一分组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值