这一节内容,来通过一张测试表,进行 MySQL 分组查询和聚集函数的练习。
建表及数据准备,以便后面 SQL 练习:
use yzl; /* 使用yzl这个database */
drop table if exists student_info; /* 如果表student_info存在则删除表student_info */
CREATE TABLE `student_info` ( /* 创建表student_info */
`id` int(11) NOT NULL auto_increment,
`stu_id` int(11) DEFAULT NULL COMMENT '学生ID',
`stu_name` varchar(30) DEFAULT NULL COMMENT '学生姓名',
`stu_class` varchar(30) DEFAULT NULL COMMENT '学生班级',
`stu_score` int(11) DEFAULT NULL COMMENT '学生分数',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
COMMENT '记录更新时间',
PRIMARY KEY (`id`),
KEY `idx_stu_id` (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into student_info(stu_id,stu_name,stu_class,stu_score) values(1,'zhang','1班',80),(2,'wang','1班',90),(3,'zhao','2班',80),(4,'liu','2班',86),(5,'duan','2班',88);
查询全表数据,方便后面实验时进行对比。
select * from student_info;
select count(*) from student_info;
count(*) 表示记录总数。
select stu_class,count(*) from student_info group by stu_class;
group by 表示分组 该语句表示对 stu_class 字段分组,然后显示 stu_class 和每一组 stu_class 的数据量。
select stu_class,group_concat(stu_name) from student_info group by stu_class;
select stu_class,max(stu_score) as maxscore from student_info group by stu_class;
max 表示求最大值。 SQL 表示按 stu_class 分组后,显示 stu_class 和每一组的 stu_score 最大值。
select stu_class,avg(stu_score) as avgscore from student_info group by stu_class;
avg 表示求平均数。 SQL 表示对 stu_class 分组后,显示 stu_class 和对应的 stu_score 平均值。
select stu_class,sum(stu_score) as avgscore from student_info group by stu_class;
sum 表示求和 SQL 表示对 stu_class 分组后,显示 stu_class 和对应的 stu_score 总和。
select stu_class,avg(stu_score) as avgscore from student_info group by stu_class having avgscore>=85;
having 作用是筛选分组之后的数据,where 表示筛选分组之前的数据。 SQL 表示对 stu_class 分组后,显示出所有 stu_class 组中 stu_score 平均数大于或等于 85 的 stu_class 值和 stu_score 平均数。