之前几篇文章我们已经完成了对SQL数据库基本概念和基础操作的学习,这一次我们回头汇总复习一下SQL数据库在实际应用甚至找工作面试时会出现的题目。
1.简单查询:通常作为更复杂查询的子查询,是SQL查询语言的基础。
2汇总查询:在简单查询的基础上出现汇总函数(sum,count等)
2.1查询课程编号为“0002”的总成绩
2.2查询选了课程的学生人数
3.分组查询:引入group by子句实现按照字段对数据进行分组汇总
3.1查询各科成绩最高和最低的分, 以如下的形式显示:课程号,最高分,最低分
3.2查询每门课程被选修的学生数
3.3男女生人数
3.4查询平均成绩大于60分学生的学号和平均成绩(引入分组查询后条件子句having)
3.5查询至少选修两门课程的学生学号
3.6同名同姓之人数量
3.7查询成绩不及格的课程并按课程号从大到小排列(排列子句order by,降序desc,升序asc默认升序)
3.8查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
3.9检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列
3.10统计每门课程的学生选修人数(超过2人的课程才统计)
要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序
3.11查询两门以上不及格课程的同学的学号,以及不及格课程及的平均成绩
4.复杂查询:开始引入子句嵌套SQL语句进行更加复杂跨表格查询
4.1查询所有课程成绩小于60分学生的学号、姓名(跨STUDENT和SCORE表)
4.2查询没有学全所有课的学生的学号、姓名
4.3查询出只选修了两门课程的全部学生的学号和姓名
4.41990出生的学生姓名,学号(日期函数year)
5.【面试题类型】topN问题
工作中会经常遇到这样的业务问题:
如何找到每个类别下用户最喜欢的产品是哪个?
如果找到每个类别下用户点击最多的5个商品是什么?
这类问题其实就是常见的:分组取每组最大值、最小值,每组最大的N条(top N)记录。
5.1按课程号分组取成绩最大值所在行的数据
5.2按课程号分组取成绩最小值所在行的数据
5.3查询各科成绩前两名的记录
6.多表查询:union子句
6.1查询所有学生的学号、姓名、选课数、总成绩
6.2查询平均成绩大于85的所有学生的学号、姓名和平均成绩
6.3三表联结:查询学生的选课情况:学号,姓名,课程号,课程名称
7.条件语句case...when...end
7.1查询出每门课程的及格人数和不及格人数
7.2使用分段[100-85],[85-70],[70-60],[‹60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
7.3查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名
8.实际业务操作中为提高SQL数据库运行效率应注意以下习惯:
8.1 select子句中尽量避免使用*。在我们平常的练习中,就要养成好的习惯,最后需要哪些列的数据,就提取哪些列的数据。尽量少用*来获取数据。另外,如果select * 用于多表联结,会造成更大的成本开销。
8.2where子句比较符号左侧避免函数
尽量避免在where条件子句中,比较符号的左侧出现表达式、函数等操作。因为这会导致数据库引擎进行全表扫描,从而增加运行时间。
8.3尽量避免使用in和not in
in和not in也会导致数据库进行全表搜索,增加运行时间
8.4尽量避免使用or
or同样会导致数据库进项全表搜索。在工作中,如果你只想用or从几十万语句中取几条出来,是非常划不来的,怎么办呢?下面的方法可替代or。
select 学号
from 成绩表
where 成绩 = 88 or 成绩 = 89
优化后:
select 学号 from 成绩表 where 成绩 = 88
union
select 学号 from 成绩表 where 成绩 = 89
语句虽然变长了一点,但处理大量数据时,可以省下很多时间,是非常值得的。
8.55.使用limit子句限制返回的数据行数
如果前台只需要显示15行数据,而你的查询结果集返回了1万行,那么这适合最好使用limt子句来限制查询返回的数据行数。