SQL经典50题题解

本篇文章主要是对SQL经典50题进行详细解析。

解析包含:1、解题思路,2、考核知识点,3、答案;

首先,表结构用脑图输出出来,如下所示:

表结构

先进行数据准备,建表以及插入数据。

建表

1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数

解题思路:

第一步:关键词有“课程编号”、“课程成绩”、“学生信息”,锁定使用表:学生表、成绩表。

第二步:给出学生信息及课程分数,通过主键sid关联学生表和课程表。

第三步:比较同一个学生不同课程的成绩,再关联一次课程表,利用sid、cid进行关联。

第四步:根据题目,用where比较分数筛选结果。

考核知识点:join,where

答案:

题1

1.1 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )

解题思路:

第一步:关键词有“课程编号”、“学生编号”,锁定使用表:成绩表。

第二步:分别查询出存在" 01 "课程的学生和存在" 02 "课程的学生。

第三步:对两个子查询进行关联,用sid进行左联接。

考核知识点:where, 子查询,left join

答案:

题1.1

1.2 查询同时存在01和02课程的情况

解题思路:同1.1,把left join改为join

考核知识点:where, 子查询,join

答案:

题1.2

1.3 查询选择了02课程但没有01课程的情况

解题思路:类似1.1,把left join改为right join

考核知识点:where, 子查询,right join

答案:

题1.3

小结:上面的题主要考察join、left join、right join。

2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

解题思路:

第一步:关键词有“平均成绩”、“学生编号”、“学生姓名”,锁定使用表:成绩表、学生表。

第二步:给出学生信息及课程分数,通过主键sid关联学生表和课程表。。

第三步:根据题目,用group by聚合计算出平均成绩,然后筛选出大于等于60分的学生。

考核知识点:join、group by、avg()

答案:

题2

3.查询在 SC 表存在成绩的学生信息

解题思路:

第一步:关键词有“SC”、“学生信息”,锁定使用表:成绩表、学生表。

第二步:用EXISTS判断在SC表存在成绩的学生信息

考核知识点:EXISTS语句

答案:

题3

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和

解题思路:

第一步:关键词有“学生编号”、“学生姓名”、“选课总数”、“课程成绩”,锁定使用表:成绩表、学生表。

第二步:通过主键sid关联学生表成绩表,得到学生信息、学生成绩的宽表

第三步:根据题目,用group by聚合计算选课总数和总成绩

考核知识点:left join、group by、count()、sum()、ifnull()

答案:

题4

5.查询「李」姓老师的数量

解题思路:

第一步:关键词有“老师的数量”,锁定使用表:教师表。

第二步:先筛选出「李」姓老师,再汇总统计「李」姓老师的数量

考核知识点:like、where、%、count()

答案:

题5

6.查询学过「张三」老师授课的同学的信息

解题思路:

第一步:关键词有“老师”、“学生信息”,锁定使用表:教师表、学生表、成绩表、课程表。

第二步:通过sid关联学生表、成绩表,再通过cid关联课程表,最后通过tid关联教师表。

第三步:用where筛选出「张三」老师授课的同学的信息。

考核知识点:多重连接join

答案:

题6

7.查询没有学全所有课程的同学的信息。

解题思路:

第一步:关键词有“课程”、“学生信息”,锁定使用表:学生表、成绩表、课程表。

第二步:先统计学生的课程数量,再筛选出小于所有课程数量的学生。

考核知识点:left join、group by、count()

答案:

题7

8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息。

解题思路:

第一步:关键词有“课程”、“学生信息”,锁定使用表:学生表、成绩表。

第二步:先查询学号“01”的同学学习的课程。

第三步:通过sid关联学生表和成绩表,获取所有学生信息、课程信息。

第四步:用EXISTS筛选出至少1门课相同的同学信息。

考核知识点:left join、子查询、EXISTS

答案:

题8

9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息

解题思路:

第一步:关键词有“课程”、“学生信息”,锁定使用表:学生表、成绩表。

第二步:用“01”号的同学学习的课程左关联学生课程表,筛选出关链课程数一致的其他同学的sid

第三步:通过sid关联学生表和成绩表,获取完整的学生信息。

考核知识点:left join、子查询、group by

答案:

题9

10.查询没学过"张三"老师讲授的任一门课程的学生姓名

解题思路:

第一步:关键词有“老师”、“学生姓名”,锁定使用表:学生表、成绩表、课程表、教师表。

第二步:反向求解。先查询至少学过“张三”老师讲授的课程的学生sid

第三步:用NOT EXISTS筛选出不在第二步查询结果的学生信息,。

考核知识点:多重连接join、NOT EXISTS、子查询

答案:

题10

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

解题思路:

第一步:关键词有“姓名”、“平均成绩”,锁定使用表:学生表、成绩表。

第二步:通过sid关联学生表和成绩表,得到学生成绩信息宽表

第三步:用group by聚合统计,having对聚合的结果进行筛选。

考核知识点:join、group by、having、case when语句、avg()

答案:

题11

12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息

解题思路:

第一步:关键词有“课程分数”、“学生信息”,锁定使用表:学生表、成绩表。

第二步:通过sid关联学生表和成绩表,得到学生成绩信息宽表

第三步:用where筛选" 01 "课程分数小于 60的记录,并按照分数降序排列。

考核知识点:join、where、order by

答案:

题12

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

解题思路:

第一步:关键词有“平均成绩”,锁定使用表:成绩表。

第二步:用group by将学生课程的成绩由行转换为列并计算平均成绩。

第三步:按照平均成绩降序显示学生的所有课程的成绩以及平均成绩。

考核知识点:join

答案:

题13

14.查询各科成绩最高分、最低分和平均分,以如下形式显示:

以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,

优良率,优秀率

及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

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

解题思路:

第一步:关键词有“课程name”、“最高分”,锁定使用表:课程表、成绩表。

第二步:用group by聚合计算课程最高分、最低分、平均分。

第三步:用case语句判断及格、中等、优良、优秀,并结合group by计算。

考核知识点:join、group by、max()、min()、avg()、sum()、case when语句

答案:

题14

15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺

解题思路:

第一步:关键词有“各科成绩”,锁定使用表:成绩表。

第二步:用rank()排名。

考核知识点:rank() over(partition by)

答案:

题15

15.1 按各科成绩进行行排序,并显示排名, Score 重复时合并名次

解题思路:

第一步:关键词有“各科成绩”,锁定使用表:成绩表。

第二步:用dense_rank()排名。

考核知识点:dense_rank() over(partition by)

答案:

题15.1

16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺

解题思路:

第一步:关键词有“总成绩”,锁定使用表:成绩表。

第二步:用group by统计学生的总成绩。

第三步:用left join自关联进行排名。

考核知识点:group by、 left join

答案:

题16

16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺

解题思路:

第一步:关键词有“总成绩”,锁定使用表:成绩表。

第二步:用group by统计学生的总成绩。

第三步:用变量进行排名。

考核知识点:group by、变量

答案:

题16.1

17. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比

解题思路:

第一步:关键词有“各科成绩”、“课程名称”,锁定使用表:成绩表、课程表。

第二步:通过cid关联课程表和成绩表,得到课程、成绩信息宽表。

第三步:用group by聚合统计各分段的人数及百分比。

考核知识点:join、group by、case when条件语句

答案:

题17

18.查询各科成绩前三名的记录

解题思路:

第一步:关键词有“各科成绩”,锁定使用表:成绩表。

第二步:筛选出各科比当前成绩高的人数小于3的学生记为各科的前三名。

考核知识点:子查询

答案:

题18

19.查询每门课程被选修的学生数

解题思路:

第一步:关键词有“每门课程”、“学生数”,锁定使用表:课程表、成绩表。

第二步:用left join关联课程表和成绩表,再用group by分组汇总各科的学生数。

考核知识点:left join、group by

答案:

题19

20.查询出只选修两门课程的学生学号和姓名

解题思路:

第一步:关键词有“选修课程”、“学生姓名”,锁定使用表:学生表、成绩表。

第二步:用join关联学生表和成绩表,再用group by分组汇总每个学生的选修课程数,最后用having对分组汇总结果筛选出选修两门课程的学生。

考核知识点:join、group by、having

答案:

题20

21. 查询男生、女生人数

解题思路:

第一步:关键词有“男生、女生”,锁定使用表:学生表。

第二步:通过ssex学生表用group by分组汇总男生、女生人数。

考核知识点:group by

答案:

题21

22. 查询名字中含有「风」字的学生信息

解题思路:

第一步:关键词有“学生信息”,锁定使用表:学生表。

第二步:用like匹配姓名中含有风」字的学生。

考核知识点:like、%

答案:

题22

23查询同名同性学生名单,并统计同名人数

解题思路:

第一步:关键词有“学生名单”,锁定使用表:学生表。

第二步:使用group by,汇总同名同性人数,再用having筛选出大于1的记录

考核知识点:group by、having

答案:

题23

24.查询 1990 年出生的学生名单

解题思路:

第一步:关键词有“学生名单”,锁定使用表:学生表。

第二步:用where筛选出1990年出生的学生名单

考核知识点:where、year

答案:

题24

25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编

号升序排列。

解题思路:

第一步:关键词有“平均成绩”,锁定使用表:成绩表。

第二步:用group by分组计算各科平均成绩,再用order by完成多列排序

考核知识点:group by、order by

答案:

题25

26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

解题思路:

第一步:关键词有“平均成绩”、“学生姓名”,锁定使用表:成绩表、学生表。

第二步:用join关联学生表和成绩表

第三步:用group by分组汇总计算每个学生的平均成绩,再用having筛选平均成绩>=85的记录

考核知识点:join、group by、having

答案:

题26

27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

解题思路:

第一步:关键词有“课程名称”、“分数”、“学生姓名”,锁定使用表:课程表、成绩表、学生表。

第二步:用join关联学生表、成绩表、课程表,再用where筛选

考核知识点:多重join、where

答案:

题27

28. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)

解题思路:

第一步:关键词有“所有学生”、“分数”,锁定使用表:学生表、成绩表

第二步:用left join关联学生表、成绩表

考核知识点:left join

答案:

题28

29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数

解题思路:

第一步:关键词有“课程成绩”、“姓名”、“课程名称”,锁定使用表:学生表、成绩表、课程表

第二步:用join关联学生表、成绩表、课程表,再筛选出课程成绩在70分以上的。

考核知识点:多重join

答案:

题29

30.查询不及格的课程

解题思路:

第一步:关键词有“不及格的课程”,锁定使用表:成绩表、课程表

第二步:关联课程表和成绩表,再条件筛选出不及格的课程信息。

考核知识点:join、where、去重

答案:

题30

31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名

解题思路:

第一步:关键词有“课程编号”、“课程成绩”、“姓名”,锁定使用表:成绩表、学生表

第二步:关联成绩表和学生表,再条件筛选出结果。

考核知识点:join、where

答案:

题31

32.求每门课程的学生人数

解题思路:

第一步:关键词有“课程”、“学生人数”,锁定使用表:成绩表

第二步:用group by分组汇总各科的学生人数。

考核知识点:group by

答案:

题32

33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

解题思路:

第一步:关键词有“成绩”、“「张三」老师”、“学生信息”,锁定使用表:成绩表、课程表、学生表、教师表

第二步:关联所有表,筛选出选修「张三」老师所授课程的学生。

第三步:因为成绩不重复,对学生成绩由高到低排序,筛选出第一行记录。

考核知识点:多重join、order by、limit

答案:

题33

34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生

信息及其成绩

解题思路:

第一步:关键词有“成绩”、“「张三」老师”、“学生信息”,锁定使用表:成绩表、课程表、学生表、教师表

第二步:关联所有表,筛选出选修「张三」老师所授课程的学生。

第三步:因为成绩有重复,先求出最高成绩,再匹配最高成绩对应的学生信息。

考核知识点:多重join、max()

答案:

题34

35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

解题思路:

第一步:关键词有“成绩”,锁定使用表:成绩表

第二步:自联接,筛选出不同课程成绩相同的记录

考核知识点:自联接join

答案:

题35

36. 查询每门成绩最好的前两名

解题思路:

第一步:关键词有“成绩”,锁定使用表:成绩表

第二步:自联接,筛选出各科低于自身成绩的人数为2的。

考核知识点:left join

答案:

题36

37. 统计每门课程的学生选修人数(超过 5 人的课程才统计)。

解题思路:

第一步:关键词有“选修人数”,锁定使用表:成绩表

第二步:先用group by分组汇总各科的选修人数,再条件筛选出超过5人的课程。

考核知识点:group by、having

答案:

题37

38.检索至少选修两门课程的学生学号

解题思路:

第一步:关键词有“两门课程”,锁定使用表:成绩表

第二步:先用group by分组汇总每个学生的选修课程数,再用having筛选出至少2门课程的学生学号

考核知识点:group by、having

答案:

题38

39.查询选修了全部课程的学生信息

解题思路:

第一步:关键词有“全部课程”、“学生信息”,锁定使用表:成绩表、课程表、学生表

第二步:关联学生表和成绩表,再用group by分组统计每个学生的选修课程数

第三步:最后用having筛选出等于全部课程数的学生信息。

考核知识点:join、 group by、having、子查询

答案:

题39

40.查询各学生的年龄,只按年份来算

解题思路:

第一步:关键词有“学生的年龄”,锁定使用表:学生表

第二步:用year和now来统计

考核知识点:year、now

答案:

题40

41. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一

解题思路:

第一步:关键词有“出生日期”,锁定使用表:学生表

第二步:用timestampdiff()统计年龄

考核知识点:timestampdiff()

答案:

题41

42.查询本周过生日的学生

解题思路:

第一步:关键词有“过生日”,锁定使用表:学生表

第二步:用week函数

考核知识点:week()

答案:

题42

43. 查询下周过生日的学生

解题思路:

第一步:关键词有“过生日”,锁定使用表:学生表

第二步:用week函数

考核知识点:week()

答案:

题43

44.查询本月过生日的学生

解题思路:

第一步:关键词有“过生日”,锁定使用表:学生表

第二步:用month函数

考核知识点:month()

答案:

题44

45.查询下月过生日的学生

解题思路:

第一步:关键词有“过生日”,锁定使用表:学生表

第二步:用month函数

考核知识点:month()

答案:

题45

你可能感兴趣的:(SQL经典50题题解)