mysql查询分组与汇总(通过几个练习理清mysql分组查询)
mysql查询分组与汇总(通过几个练习理清mysql分组查询)select sex avg(math) count(*) from stu group by sex;查询男生和女生各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组select sex avg(math) count(*) from stu where math > 70 group by sex;查询男生和女生各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,且分组之后只显示人数大于2个的select sex avg(math) count(*) from stu where math > 70 group by sex having count(*) > 2;where 和 having 区别:
数据准备:创建一个学生表,并插入数据,代码如下:
-- 删除stu表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int -- 编号
name varchar(20) -- 姓名
age int -- 年龄
sex varchar(5) -- 性别
address varchar(100) -- 地址
math double(5 2) -- 数学成绩
english double(5 2) -- 英语成绩
hire_date date -- 入学时间
);
-- 添加数据
INSERT INTO stu(id NAME age sex address math english hire_date)
VALUES
(1 '赵大' 55 '男' '杭州' 66 78 '1995-09-01')
(2 '钱二' 45 '女' '深圳' 98 87 '1998-09-01')
(3 '孙三' 55 '男' '香港' 56 77 '1999-09-02')
(4 '李四' 20 '女' '湖南' 76 65 '1997-09-05')
(5 '周五' 20 '男' '湖南' 86 NULL '1998-09-01')
(6 '吴六' 57 '男' '香港' 99 99 '1998-09-01')
(7 '郑七' 22 '女' '香港' 99 99 '1998-09-01')
(8 '王八衰' 18 '男' '南京' 56 65 '1994-09-02');
创建成功的学生表
语法SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
练习
- 查询男生和女生各自的数学平均分
SELECT sex AVG(math) FROM stu GROUP BY sex;
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
select name sex avg(math) from stu group by sex; -- 这里查询name字段就没有任何意义
虽然能查出结果,但是没有意义
- 查询男生和女生各自的数学平均分,以及各自的人数
select sex avg(math) count(*) from stu group by sex;
- 查询男生和女生各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
select sex avg(math) count(*) from stu where math > 70 group by sex;
- 查询男生和女生各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,且分组之后只显示人数大于2个的
select sex avg(math) count(*) from stu where math > 70 group by sex having count(*) > 2;
where 和 having 区别:
- 执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
- 可判断的条件不一样:where 不能对聚合函数进行判断,having 可以。