面试题首页 > SQL语句面试题

SQL汇总查询面试题

001经典SQL笔试题题干

学生表:student(学号sno,学生姓名sname,出生年月sbirth,性别ssex)
成绩表:score(学号sno,课程号cno,成绩score)
课程表:course(课程号cno,课程名称cname,教师号ctno)
教师表:teacher(教师号tno,教师姓名tname)
注意:下面SQL的实现以MySQL为主

002查询各科成绩最高和最低的分, 以如下的形式显示:课程号,最高分,最低分

/*
分析思路
select 查询结果 [课程ID:是课程号的别名,最高分:max(成绩) ,最低分:min(成绩)]
from 从哪张表中查找数据 [成绩表score]
where 查询条件 [没有]
group by 分组 [各科成绩:也就是每门课程的成绩,需要按课程号分组];
*/
select 课程号,max(成绩) as 最高分,min(成绩) as 最低分from score
group by 课程号;

003查询平均成绩大于60分学生的学号和平均成绩。

/* 
题目翻译成大白话:
平均成绩:展开来说就是计算每个学生的平均成绩
这里涉及到“每个”就是要分组了
平均成绩大于60分,就是对分组结果指定条件
*/
select 学号, avg(成绩)from score group by 学号having avg(成绩)>60;

004查询至少选修两门课程的学生学号。

/* 
翻译成大白话:
第1步,需要先计算出每个学生选修的课程数据,需要按学号分组
第2步,至少选修两门课程:也就是每个学生选修课程数目>=2,对分组结果指定条件
*/
select 学号, count(课程号) as 选修课程数目from score group by 学号 having count(课程号)>=2;

005查询同名同性学生名单并统计同名人数。

/* 
翻译成大白话,问题解析:
1)查找出姓名相同的学生有谁,每个姓名相同学生的人数
查询结果:姓名,人数
条件:怎么算姓名相同?按姓名分组后人数大于等于2,因为同名的人数大于等于2
*/
select 姓名,count(*) as 人数 from student group by 姓名
having count(*)>=2;

006查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列。

select 课程号, avg(成绩) as 平均成绩from score
group by 课程号 order by 平均成绩 asc,课程号 desc;

007统计每门课程的学生选修人数(超过2人的课程才统计)。

要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序。

select 课程号, count(学号) as '选修人数'
from score group by 课程号having count(学号)>2
order by count(学号) desc,课程号 asc;

008查询两门以上不及格课程的同学的学号及其平均成绩。

/*第1步:得到每个学生的平均成绩,显示学号,平均成绩*/
select 学号, avg(成绩) as 平均成绩 from score group by 学号;
/* 第2步:再加上限制条件:*/
select 学号, avg(成绩) as 平均成绩from score where 成绩 <60 group by 学号 having count(课程号)>=2;

目录

返回顶部