Bootstrap

数据分析sql面试必会6题经典_经典SQL面试题及答案分析

1、学生表 student(s_id:学生id,s_name:学生姓名,s_birth:学生生日,s_sex:学生性别):

2、教师表teacher(t_id:教师id,t_name:教师姓名)

3、课程表 course(c_id:课程id,c_name:课程名称,t_id:教师id):

4、成绩表 score(s_id:学生id,c_id:课程id,score:分数)

初始化数据的sql附在文章末尾

挑战

1、查询各科成绩前三名的记录

--方法1:SELECT s_name,a.s_id,a.c_id,a.score FROM score a LEFT JOIN score b ON a.c_id = b.c_id AND a.score=a.score)<=2 ORDER BY a.c_id思路:

SELECT * FROM score a JOIN score b ON a.c_id=b.c_id WHERE a.c_id=‘03’ 这一句,形成了03课程的所有学员的两两组合(带上03,是为了简化数据,便于分析)SELECT * FROM score a JOIN score b ON a.c_id=b.c_id WHERE a.c_id=‘03’ AND a.score

SELECT *FROM (SELECT s_id,score,c_id FROM score WHERE c_id='01') aJOIN (SELECT s_id,score,c_id FROM score WHERE c_id='02') bON a.s_id=b.s_id WHERE a.score>b.score思路:

通过SELECT s_id,score,c_id FROM score WHERE c_id='01’和SELECT s_id,score,c_id FROM score WHERE c_id='02’的两个临时表联查,得到每个学员的01、02课程成绩情况:接下来,a.score>b.score条件直接筛选就可以了。

3、查询和"04"号的同学学习的课程完全相同的其他同学的信息

SELECT score.s_id,COUNT(DISTINCT c_id) FROM student JOIN score ON student.s_id=score.s_id GROUP BY score.s_id HAVING COUNT(DISTINCT c_id)= (SELECT COUNT(c_id) FROM score WHERE s_id='04') AND s_id NOT IN -- 筛选出学过(04号同学未学课程)的学生,通过not in排除掉 (SELECT s_id FROM score WHERE c_id IN (SELECT DISTINCT(c_id) FROM course WHERE c_id NOT IN (SELECT c_id FROM score WHERE s_id='04'))) AND score.s_id!='04'思路:

通常思路,我们先获取04号同学的课程,再遍历其他同学,以此筛选。这种方式适用于编程,单纯的sql实现不了,我们应该从下面这个思路去考虑------>我和04号同学学习的课程数目一样多,且04号同学没学过的我也没学过,那么我不就是和04号同学学习的课程一样吗?

4、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECT a.s_id,b.s_name, MAX(CASE a.c_id WHEN '01' THEN a.score END ) 内功, MAX(CASE a.c_id WHEN '02' THEN a.score END ) 剑法, MAX(CASE a.c_id WHEN '03' THEN a.score END ) 拳法, AVG(a.score) FROM score a JOIN student b ON a.s_id=b.s_id GROUP BY a.s_id ORDER BY AVG(a.score) DESC思路不难,关键在于理解透彻case when语法。

SELECT a.c_id,b.c_name,MAX(score),MIN(score),ROUND(AVG(score),2), ROUND(100*(SUM(case when a.score>=60 then 1 else 0 end)/SUM