【面试题】

有三张表:“学生表”、“期末成绩表”、“违纪表”。

查询半年内没有违纪记录,并且期末考试总分为每个班级前10名的学生名单。

【解题思路】

可以把这个复杂业务问题,使用多维度拆解分析方法,拆解为以下3个子问题:

1)从“违纪表”中查询半年内有违纪记录的学生名单,这部分最终要过滤掉

2)每个班级每个学生的期末考试总分

3)每个班级期末考试总分排名前10名的学生名单

1. 没有违纪记录的学生

查询半年内有违纪记录的学生名单,涉及到对时间的筛选。

问题中没有对“半年内”进行定义,这里我们可以自己定义下业务含义为“当前日期前半年(182天)之后”。

1)curdate()函数:获取当前日期;

2)date_sub(指定日期,interval … day):获取指定日期…天之前的日期。

“当前日期前182天”,也就是:


date_sub(curdate(),interval 182 day)

从“违纪表”中查询半年内有违纪记录的学生名单:


select distinct 学生id
from 违纪表
where 违纪时间 >= date_sub(curdate(),interval 182 day);

把这条查询结果记为表t1。

2.每个班级每个学生的期末考试总分

这里涉及到“期末成绩表”和“学生表”两张表,要用到多表查询。

把“期末成绩表”当作左表,使用左联结,给左表中补充班级id信息


select a1.*,a2.班级id
from 期末成绩表 as a1
left join
学生表 as a2
on a1.学生id = a2.学生id;

把上面的查询结果记录为表a3,然后,计算每个班级每个学生的期末考试总分。涉及到“每个”,要想到《猴子 从零学会SQL》里讲过的用“分组汇总”,按班级、学生分组(group by),汇总(分数求和sum)


select 班级id,学生id,
sum(分数) as 总分
from a3
group by 班级id,学生id;

3.每个班级期末考试总分排名前 10 名的学生名单

涉及到排名问题,要想到《猴子从零学会SQL》里讲过的用窗口函数。把上一步查询结果记录为表a4,用窗口函数row_number()


select *,row_number() over(partition by 班级id order by 总分 desc) as 班级排名
from a4;

把这条查询结果记为表a5。

4. 条件筛选

题目中设定了两个查询条件:

条件一:班级排名 <= 10;

条件二:要求“半年内没有违纪记录的学生”-->通过排除“半年内有违纪记录的学生”进行过滤。


select 学生id,总分,班级排名,班级id
from a5
where 班级排名 <= 10
and 学生id not in t1;

将子查询代入:

select 学生id,总分,班级排名,班级id
from (
select *,row_number() over(partition by 班级id order by 总分 desc) as 班级排名
from (
select 班级id,学生id,
sum(分数) as 总分
from (
select a1.*,a2.班级id
from 期末成绩表 as a1
left join
学生表 as a2
on a1.学生id = a2.学生id
) as a3
group by 班级id,学生id
) as a4
) as a5
where 班级排名 <= 10
and 学生id not in (
select distinct 学生id
from 违纪表
where 违纪时间 >= date_sub(curdate(),interval 182 day)
);

【本题考点】

1)考查对日期函数的了解;

2)考查对分组函数group by的灵活使用;

3)考查对多表联结的了解,特别是灵活使用where条件进行数据过滤。

SQL查询半年内没有违纪记录,并且期末考试总分为每个班级前10名的学生名单。(日期函数、where、group by)相关推荐

  1. C语言查询成绩前三名的女生,如何查找每个班级总成绩前3名的学生?

    #7 kai2006-02-19 19:13 这个在标准SQL 里是支持的,在MS-SQL我刚才查了以下,没查到.你自己试试不就知道了.我用的是MySql,是可以的. 我学SQL 也不久,没什么经验. ...

  2. ElasticSearch根据坐标点和半径查询范围内的所有记录,并按距离排序

    一.场景 es版本号5.3.0,查询es索引里距离某点位(例:113.93900469,22.56172077)两百米内的所有记录,并按距离排序 二.操作步骤 1.语法 坐标字段类型是geo_poin ...

  3. mysql查询某个字段数量最多_查询一个表某个字段中出现次数最多的那个数据的前30名...

    MySQL查询重复出现次数最多的记录 chengxuyonghu关注0人评论3400人阅读2014-09-22 16:57:06 MySQL查询的方法很多,下面为您介绍的MySQL查询语句用于实现查询 ...

  4. Sql - 查询工资第二高的记录.

    题目要求: 给定一个表employee, 有两个字段id, salary,要求显示表中薪水第二的数据.如果没有第二高, 显示为null Mysql: select IFNULL( ( select d ...

  5. 陇西一中2021年高考成绩查询,最新喜报!陇西2020年高考理科、文科第一名公布!(附文、理科前10名)...

    原标题:最新喜报!陇西2020年高考理科.文科第一名公布!(附文.理科前10名) 为进一步激励广大学子奋发向上.刻苦学习,共青团定西市委联合深圳市文和至雅公益基金会(以下简称"基金会&quo ...

  6. mysql查询各科成绩前三名的记录,sql查询各科成绩前三名----详述过程,思路清晰不烧脑...

    使用mysql.hive查询各科成绩前三名 一.建表造数据 建表: create table scores( name varchar(100), subject varchar(100), scor ...

  7. MySQL数据库基础(五)——SQL查询

    MySQL数据库基础(五)--SQL查询 一.单表查询 1.查询所有字段 在SELECT语句中使用星号""通配符查询所有字段 在SELECT语句中指定所有字段 select fro ...

  8. SQL考点之SQL查询、SQL支持数据类型(设计大题)

    如题:2019年10月 除前两问是涉及关系代数的内容外,其他都是SQL的查询的考察,足见这部分的重要性. 其实是完成了下面的复习后,再来填的答案: 26.看到"女"这个条件,应该想 ...

  9. MySQL数据库基础—SQL查询

    一.单表查询 1.查询所有字段 在SELECT语句中使用星号""通配符查询所有字段 在SELECT语句中指定所有字段 select from TStudent; 2.查询指定字段 ...

最新文章

  1. Python中__str__和__repr__
  2. [集合]线程安全的HashMap
  3. java 将一串字符串 转换成_简单几步,教你如何轻松的将Java中的字符串转换为Integer,你学会了吗?...
  4. json_decode用法
  5. Shell脚本基础语法
  6. 拼多多回应“轩尼诗假酒”案:实际售出3单 9月已关闭店铺
  7. 二十三种设计模式[6] - 适配器模式(Adapter Pattern)
  8. 蓝桥杯基础练习十六进制转十进制
  9. linux系统各种日志存储路径和详细介绍
  10. 【算法理解】从头开始理解梯度提升算法
  11. Baidu 人脸识别FireFly 与PC连接调试
  12. idea中XML注释与取消注释快捷键
  13. Foreign Language_english_补语
  14. 火狐浏览器打印网页不全_win7系统打印网页显示不全的解决方法
  15. could not find function 函数名
  16. java 循环依赖_Java详解之Spring Bean的循环依赖解决方案
  17. POJ 3422 Kaka's Matrix Travels(拆点+最大费用流)题解
  18. 【自然语言处理】【聚类】DCSC:利用基于对比学习的半监督聚类算法进行意图挖掘
  19. java convexhull_android java opencv 2.4 convexhull convexdefect
  20. 手把手教你DIY一款属于自己的万能红外遥控器!

热门文章

  1. 神经网络预测模型优缺点,神经网络预测模型实例
  2. 苏格拉底 麦穗问题?
  3. 卷积操作中的same padding与valid padding
  4. 计算机错误代码0X000000be,Win7系统出现蓝屏代码0x000000BE的解决方法
  5. HTML5一阶段学习总结
  6. 不打不相识,苹果偷学微信代码
  7. 一篇精彩的创业励志演讲稿
  8. 利用浏览器console控制台实现JS网页点击
  9. Word 中设置图、表、公式、代码要与正文之间行间距
  10. HTTPS是什么? What is HTTPS?