在软件开发中,我们将输入交给用户,而输出则是我们对数据汇总统计分析呈现给用户,这些题考察SQL的编写能力。对于这类型的题目,更多是需要对这些题考察对SQL的编写能力,对于这类型的题目,需要先把4张表之间的关联关系搞清楚了,最好的办法是自己在草稿纸上画出关联图,然后再编写对应的SQL语句就比较容易了。下图是这4张表对应的关系图,可以看出它们之间是通过哪些外键关联起来的:
简单查询
考察知识点
- SQL 的书写规则是什么?
- 如何指定查询条件?
- SQL 是如何运行的?
练习题
-查询姓“猴”的学生名单
-查询姓“孟”老师的个数
汇总分析
-查询课程编号为“0002”的总成绩
-查询选了课程的学生人数
分组
-查询各科成绩最高和最低的分, 以如下的形式显示:课程号,最高分,最低分
-查询每门课程被选修的学生数
-查询男生、女生人数
分组结果的条件
-查询平均成绩大于60分学生的学号和平均成绩
-查询至少选修两门课程的学生学号
-查询同名同姓学生名单并统计同名人数
-查询不及格的课程并按课程号从大到小排列
-查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
-检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列
-统计每门课程的学生选修人数(超过2人的课程才统计)
-查询两门以上不及格课程的同学的学号及其平均成绩
汇总分析: 查询结构排序 分组的条件指定
-查询学生的总成绩并进行排名(知识点: 分组查询)
-查询平均成绩大于60分的学生的学号和平均成绩(知识点: 分组+条件)
复杂查询
考察知识点
- 分组汇总
- 子查询
- 标量子查询
- 关联子查询
练习题
-查询所有课程成绩小于60分学生的学号、姓名(知识点: 子查询)
-查询没有学全所有课的学生的学号、姓名(知识点: in,子查询)
-查询出只选修了两门课程的全部学生的学号和姓名
-1990年出生的学生名单(X)
-查询各科成绩前两名的记录 (TOPN)
-表结构的转换
多表查询
考察知识点
- 什么是交叉联结?
- 什么是交叉联结?
- 什么是左联结?
- 什么是右联结?
- 什么是全联结?
练习
-查询所有学生的学号、姓名、选课数、总成绩
-查询平均成绩大于85的所有学生的学号、姓名和平均成绩
-查询学生的选课情况:学号,姓名,课程号,课程名称
-查询出每门课程的及格人数和不及格人数(case)
-使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称(case)
-查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名|
多表连接
-检索"0001"课程分数小于60,按分数降序排列的学生信息
-查询不同老师所教不同课程平均分从高到低显示
-查询课程名称为"数学",且分数低于60的学生姓名和分数
-查询任何一门课程成绩在70分以上的姓名、课程名称和分数(与上题类似)
-查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩(知识点: 分组+条件+多表连接)
-查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
-查询课程编号为“0001”的课程比“0002”的课程成绩高的所有学生的学号
-查询学过编号为“0001”的课程并且也学过编号为“0002”的课程的学生的学号、姓名
-查询学过“孟扎扎”老师所教的所有课的同学的学号、姓名
-查询没学过"孟扎扎"老师讲授的任一门课程的学生姓名(与上题类似,"没学过"用not in来实现)
-查询没学过“孟扎扎”老师课的学生的学号、姓名(与上题类似)
-查询选修“孟扎扎”老师所授课程的学生中成绩最高的学生姓名及其成绩(与上题类似,用成绩排名,用 limit 1得出最高一个)
-查询至少有一门课与学号为“0001”的学生所学课程相同的学生的学号和姓名
-按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
原文地址:[图解SQL面试题:经典50题]