当前课程知识点:MySQL数据库案例教程 > 第4章 查询与视图 > 4.2 单表查询 > 4-2-3group子句
下面我们来学习group by子句
Group by是分组子句
用于分组聚合统计
所谓聚合
是指对多条记录的某个字段值
进行统计计算
如统计平均值 总和 个数
最大值 最小值等
那接下来我们先来认识几个聚合函数
avg(),sum(),count()
max(),min(),AVG( )
用于计算平均值
SUM( ) 求和 COUNT( ) 计数
MAX( ) 最大值 MIN( ) 最小值
下面通过案例
来学习聚合函数的用法
案例21
统计score表中
所有学生的总分 平均分
最高分和最低分
语句可以这样写
Select sum(result),avg(result)
max(result),min(result)
From score
执行
查询出表中所有学生的
总分 平均分 最高分和最低分
来看案例22
统计score表中01号课程的
总分 平均分 最高分和最低分
语句可以这样写
Select sum(result),avg(result)
max(result),min(result)
From score
Where cno=’01’
执行
查询出01号课程的
总分 平均分 最高分和最低分
来看案例23
统计score表中
参与考试的学生人数和总人次
语句可以这样写
SELECT COUNT(DISTINCT sid) 人数
COUNT(*) 人次
FROM score
Count的参数可以是* 也可以是字段
*表示统计符合条件的所有记录
包含空值null
也可以是一个字段
是字段时可以使用distinct
消除掉重复值
使用*时不能使用distinct
我们来执行
查询出表中
参与考试的总人次数和学生人数
参与考试的人数是11人
总人次是44次
来看案例24
统计student表中男生的人数
查询语句可以这样来写
Select count(*)
From student Where sex=’男’
执行
查询出男生人数有7人
来看案例25
统计student表中女生的人数
语句可以这样写
Select count(*)
From student
Where sex=’女’
执行
查询出女生人数为6人
那么请大家思考案例26
统计student表中男 女生的人数
要同时统计出男女生人数
那该怎么来实现呢
前几个例子都是只能通过
where筛选出某一个字段值的情况
如01号课程
或男生 或女生
要同时统计出
性别的两个不同字段值的数据信息
就没有办法使用where来实现
要解决这个问题
需要使用分组子句
首先来看group by语法
GROUP BY 字段 HAVING 分组条件
它的功能是按字段值
对记录进行分组
聚合函数对每组进行聚合运算
HAVING 分组条件
是在查询出的分组结果中
筛选除满足条件的数据
来看案例26
统计student表中男女生人数
语句可以这样写
Select sex,count(*) 人数
From student
Group by sex
执行
可以看到统计出男女生的人数
案例27
查询统计每门课平均分
显示平均分在80以上的
课程号和平均分
先统计每门课的平均分
语句可以这样写
Select cno,avg(result)
From score
Group by cno
再在统计的结果里
筛选出平均分80分以上的
having avg(result)>=80
执行
筛选出平均分在80以上的
课程号和平均分的两条数据
avg(result)>=80
能不能放在where子句呢
我们来看查询
出现错误
invalid use of group function
错误使用分组函数
也就是avg(result)
不能直接使用在where子句中
那么请同学们注意
聚合函数一般只能出现在
select子句或having子句中
直接出现在where是不允许的
更复杂的应用
我们将在子查询进行学习
案例28
查询统计出
01 02 03号课程的平均分
显示平均分
在80以上的课程号和平均分
查询统计结果
查询统计课程平均分
在80分以上的
我们刚刚讲过
可以这样写语句
Select cno,avg(result)
From score
Group by cno
having avg(result)>=80
那么如何只显示
01 02 03号课程的平均分呢
可以通过先筛选出
01 02 03号课程
添加where子句
where cno in (‘01’,’02’,’03’)
执行
可以看到
01 02 03号课程中平均分
在80以上的只有02号课程
那么这个条件
能不能放到having条件里呢
我们来尝试以下
在分组条件后添加
and cno in (‘01’,’02’,’03’)
好 这个语句是这样的
SELECT cno,AVG(result)
FROM score
GROUP BY cno HAVING
AVG(result)>=80
AND cno IN ('01','02','03')
执行
结果与第一条语句相同
在这里要注意where和having区别
where是先过滤表中记录
满足条件的记录
才进行分组聚合运算
而having是对分组后的
聚合运算结果进行筛选
对于group by子句
请同学们掌握聚合函数
和groupby 的使用
并搞清楚where和having的区别
下面来学习order by子句
order by子句
是对查询结果排序输出
asc为升序 DESC为降序
asc或desc可以省略
默认为升序
可以有多个排序字段
当有多个排序字段时
结果先按照第一个排序字段排序
当第一排序字段的值相同时
第一字段值相同的记录
再按第二排序字段排序
依次类推
来看案例29
查询score表中的成绩
按成绩从高到底排序
成绩相同 按照学号从小到大排序
排序结果的输出使用order by字段
语句可以这样写
Select * from score
Order by result desc
再按学号排序
学号是升序
升序是默认的
可以写也可以不写
sid asc
执行
可以看到查询结果
按照成绩从高到低排序
成绩相同
按照学号从小到大排序
案例30
查询学生基本信息
按年龄从小到大排序输出
这个查询不需要计算年龄
年龄从小到大
那么出生日期就是从大到小
从大到小就是降序
语句可以这样写
Select * from student
Order by birth desc
执行
可以看到查询结果按照
出生日期从大到小排序
最后我们再来学习limit子句
limit子句有两个参数
offset和记录数
offset是相对于
第一条记录的偏移量
第一条记录的偏移量为0
第二条记录的偏移量为1
以此类推
这个参数可以省略
记录数就是输出记录的行数
来看案例31
查询输出01号课程的前3名成绩
这个查询需要
先查询出01号课程的成绩
再按成绩从高到底排序
那么怎么输出三条记录呢
可以使用limit子句
语句可以这样写
Select * from score
Where cno=’01’
Order by result desc
Limit 0,3
执行
查询出01号课程成绩的前3名
并且从大到小排序
再来看一个案例
案例32
查询输出01号课程
成绩的第2和第3名
语句可以这样写
Select * from score
Where cno=’01’
Order by result desc
输出第二和第三条记录
那么偏移是1 记录数是2
执行
那么就查询出
01号课程的第2和第3名的成绩
以上我们通过单表查询
系统地学习了select语句的select子句
where子句 groupby子句 orderby子句
limit子句的用法
请同学们先记住select语句的语法
并通过练习掌握每个子句用法
只有熟练掌握select基本语法
才能为后面的多表查询
和子查询的学习打下基础
讲课的案例和操作题
都在资料压缩包内
请同学们自行下载练习
并调试完成操作练习
本次课就讲到这里
谢谢 再见
-1.1 数据库基础知识
-1.2 MySQL的安装与运行
-第1章 测试
-2.1 数据库的基本操作
-2.2 表的基本操作
-2.3 MySQL数据类型
-2.4 约束设置
-2.5 索引
--2-5索引视频
--2-5索引课件
--2-5索引实训
-第2章测试
-3.1 插入记录
-3.2 修改记录
-3.3 删除记录
--3.3删除记录
-第3章 测试
-4.1 select语句
-4.2 单表查询
-4.3 多表查询
-4.4 子查询
--4-4子查询课件
--4-4子查询实训
-4.5 外键
--4-5外键视频
--4-5外键课件
--4-5外键实训
-4.6 视图
--4-6视图视频1
--4-6视图视频2
--4-6视图课件
--4-6视图实训
-第4章测试
-5.1 函数
--5-1系统函数
--5-1函数课件
--5-1 函数实训
-5.2 流程控制语句
-5.3 事务与游标
-5.4 存储过程
-5.5 触发器
--5-5触发器视频
--5-5触发器课件
--5-5触发器实训
-第5章测试
-6.1 数据库备份与还原
-6.2 异构数据源导入导出
-第6章测试
-7.1 用户管理
-7.2 权限管理
-7.3 应用实例开发
-第7章测试