前言
每次面试必考SQL,小编这几年一直吃SQL的亏,考题无非就是万年不变学生表,看起来虽然简单,真正写出来,还是有一定难度。于是决定重新整理下关于SQL的面试题,也可以帮助更多的人过SQL这一关。
作为一个工作3年以上测试人员,不会sql基本上能拿到offer的希望渺茫,虽然平常也会用到数据库,都是用的简单的查询语句。困难一点的就直接找开发了,面试想留个好印象,还是得熟练掌握,能在纸上快速写出来。
万年不变学生表
有2张表,学生表(student)基本信息如下
![2c5cf0384a364e4140e804a7dde0f451.png](https://img-blog.csdnimg.cn/img_convert/2c5cf0384a364e4140e804a7dde0f451.png)
科目和分数表(grade)
![d6345097954ff642e5c5ced9f996615f.png](https://img-blog.csdnimg.cn/img_convert/d6345097954ff642e5c5ced9f996615f.png)
排序order by
1.查询所有学生的数学成绩,显示学生姓名name, 分数, 由高到低
SELECT a.name, b.score
FROM student a, grade b
WHERE a.id = b.id
AND kemu = '数学'
ORDER BY score
DESC
![fb71c33d23aa7de1f0abba89a1fb9086.png](https://img-blog.csdnimg.cn/img_convert/fb71c33d23aa7de1f0abba89a1fb9086.png)
统计总成绩sum
2.统计每个学生的总成绩,显示字段:姓名,总成绩
SELECT a.name, sum(b.score) as sum_score
FROM student a, grade b
WHERE a.id = b.id
GROUP BY name
DESC
![0f1c5403c2f272d609a3fca5d5ec1465.png](https://img-blog.csdnimg.cn/img_convert/0f1c5403c2f272d609a3fca5d5ec1465.png)
统计总成绩
3.统计每个学生的总成绩(由于学生可能有重复名字),显示字段:学生id,姓名,总成绩
SELECT a.id, a.name, c.sum_score
from student a,
(SELECT b.id, sum(b.score) as sum_score
FROM grade b
GROUP BY id
) c
WHERE a.id = c.id
ORDER BY sum_score
DESC
![4cbdd38ea21082ca47ae263ebd48243c.png](https://img-blog.csdnimg.cn/img_convert/4cbdd38ea21082ca47ae263ebd48243c.png)
统计单科最好成绩
4.列出各门课程成绩最好的学生, 要求显示字段: 学号,姓名,科目,成绩
第一步先group by找出单科最好成绩,作为第一张表
SELECT b.kemu, MAX(b.score)
FROM grade b
GROUP BY kemu
![23b42e46167859de5b0e6171674e6c62.png](https://img-blog.csdnimg.cn/img_convert/23b42e46167859de5b0e6171674e6c62.png)
再结合学生表和分数表,得到单科最好成绩
-- 单科最好的成绩
SELECT c.id , a.name, c.kemu, c.score
FROM grade c, student a,
(SELECT b.kemu, MAX(b.score) as max_score
FROM grade b
GROUP BY kemu) t
WHERE c.kemu = t.kemu
AND c.score = t.max_score
AND a.id = c.id
![3110de561710a147eabae286fa044361.png](https://img-blog.csdnimg.cn/img_convert/3110de561710a147eabae286fa044361.png)
总结 group by相关用法
函数作用支持性sum(列名)求和
max(列名)最大值
min(列名)最小值
avg(列名)平均值
first(列名)第一条记录仅Access支持last(列名)最后一条记录仅Access支持count(列名)统计记录数注意和count(*)的区别
留个问题:.列出各门课程成绩最好的2位学生, 要求显示字段: 学号,姓名, 科目,成绩