知己知彼,百战不殆~本篇文章我们总结一下面试中常见的题目,针对性练习一下:
练习1:简单查询
1)查询姓“猴”的学生名单

2) 查询姓名中最后一个字是猴的学生名单

3)查询姓名中带“猴”的学生名单

4) 查询姓“孟”老师的个数

练习2 汇总分析
1)查询课程编号为“0002”的总成绩

2)查询选了课程的学生人数

3)查询各科成绩最高和最低的分

4)查询每门课程被选修的学生数

5)查询男生、女生人数

分组结果的条件
6)查询平均成绩大于60分学生的学号和平均成绩

7)查询至少选修两门课程的学生学号

8)查询同名同姓学生名单并统计同名同姓人数

9)查询不及格的课程并按课程号从大到小排列

查询及格的课程并按课程号从大到小排列

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

11) 查询课程编号为“0004”且分数小于60的学生学号,结果按分数降序排列

查询课程编号为“0003”且分数小于90的学生学号,结果按分数降序排列

12) 统计每门课程的学生选修人数(超过2人的课程才统计)要求输出课程号和选课人数,查询结果按人数降序排列,若人数相同,按课程号升序排序

13) 查询两门以上不及格课程的学生学号,以及不及格课程的平均成绩

查询两门以上成绩大于等于80的课程的学生学号,及其平均成绩

练习3 复杂查询
1)查询所有课程成绩小于60分学生的学号、姓名

查询所有课程成绩小于等于80分学生的学号、姓名

2)查询没有学全所有课程的学生的学号、姓名
这里需要用到三张表course和student,score

3)查询出只选修了两门课程的全部学生的学号和姓名

4)1990年出生的学生名单
这里需要用到日期函数:

试着写一下:

5)topN问题(分组取每组最大值、最小值,每组的topN):
- 按课程号分组取成绩最大值所在行的数据

- 按课程号分组取成绩最小值所在行的数据

- 查询各科成绩前两名的记录

练习4 多表查询
1)不是近视眼的学生都有谁?
“学生表“和”近视学生表“分别如下:


sql语句及运行结果如下:

2)对上一题举一反三,查询从不订购的顾客信息
sql语句如下


运行sql语句:

3)查询所有学生的学号、姓名、选课数、总成绩
4) 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
5)查询学生的选课情况:学号、姓名、课程号、课程名称
6) 查询出每门课程的及格人数和不及格人数
7) 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
1)--7)练习答案可参考前一篇文章
有伊人兮天各一方:SQL--多表查询zhuanlan.zhihu.com8) 查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名

9) 如何实现表的行列互换

TIPS : 如何提高sql查询效率
数据量大时,不同的sql语句消耗的时间相差很大,写SQL语句时需要注意以下几点以提高查询效率:
- select子句中尽量避免使用*。因为*是返回全部数据的意思,当数据量大时非常消耗时间
- where子句比较符号的左侧避免使用函数。因为这会导致数据库引擎进行全表扫描,从而增加运行时间。为了提高效率,where子句中遇到函数或者运算,将其移到比较符号的右侧。
- 避免使用in和not in。这也会导致数据库引擎进行全表扫描,增加运行时间。此类情况可以考虑用between函数
- 尽量避免使用or。这也会导致数据库引擎进行全表扫描。可以考虑用联结优化,子句有些长,但是运行起来却会很节省时间
- 尽量用limit子句限制返回的数据行数,因为返回行数多也会导致运行时间长。