表的结构
create table student_test_info(
id bigint primary key auto_increment,
student_id bigint,
student_name varchar(10),
course_id bigint,
course_name varchar(10),
score bigint
);
insert into student_test_info values
(1,20101,'张x',101,'商务统计',73),
(2,20101,'张X',104,'时间序列分析',67),
(3,20101,'张x',105,'随机过程',52),
(4,20102,'李l',104,'时间序列分析',61),
(5,20102,'李l',102,'应用回归分析',63),
(6,20103,'孙c',101,'商务统计',87),
(7,20103,'孙c',107,'计量经济学',82);
目标:
搜索偏科的学生 (课程有小于某课程平均分的学生)
解决办法:
首先,计算各个课程的平均分,连接到原本的数据表上。
其次, 搜索:课程有小于某课程平均分的学生:
将各科分数-各课程的平均分的,差值,
按学生分组,
删选出差值小于0的学生ID。
最后, SQL语句:
select c.student_id from
select a.*, b.avgS, a.score - b.avgS as diff from
student_test_info a inner join
(select course_id, avg(score) avgS from student_test_info group by course_id ) b on b.course_id = a. course_id
c
group by c.student_id having min(c.diff) < 0
分析总结
1.聚合函数: 可以用来统计、求和、求最值等,分类:
–COUNT:统计行数量
–SUM:获取单个列的合计值
–AVG:计算某个列的平均值
–MAX:计算列的最大值
–MIN:计算列的最小值
2.GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
- join : 把两个或多个表的行结合起来,基于这些表之间的共同字段。
4.ON 和 WHERE 过滤条件的区别如下:
ON : 条件是在生成临时表时使用的条件,只有用join 的时候bai 才用。
WHERE : 条件是在临时表已经生成后,对临时表进行的过滤条件。
- HAVING :因为WHERE 关键字无法与聚合函数一起使用。
网友评论