题目快速查找索引

阅读指南

上篇

  • 【第一部分】聚合函数(sum/avg/count/min/max)
  • 【第二部分】表连接(inner join/left join/right join/full join/exclude join)

逐帆:【SQL】SQL面试50题思路解答与分类整理(上)聚合函数与表连接​zhuanlan.zhihu.com

中篇

  • 【第三部分】窗口函数+Limit+变量(rank/dense rank/row number)
  • 【第四部分】子查询

逐帆:【SQL】SQL面试50题思路解答与分类整理(中)窗口函数与子查询​zhuanlan.zhihu.com

下篇

  • 【第五部分】CASE
  • 【第六部分】日期函数

【第五部分】CASE

知识要点与易错点总结

Case本质上就是IF逻辑判断,可以对多种条件进行控制,有两种写法:

第一种简单Case:CASE后面不带表达式。

CASE 

第二种Case搜索函数:CASE 后面带表达式,此时WHEN 后面的则是该表达式可能的值。

CASE 

注意:case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。

CASE题目整理(完整题目列表见文章最后)

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

***第17题和第14题都需要计算百分比,这里主要解释统计各分数段的逻辑,计算百分比的内容请参见第14题

select 

  • 要统计各分数段人数,产生多个分数段新列,要用case+sum来完成
  • 首先用case语句来创建分数段。例如第一个case语句,代表逐行扫描score表每一行数据,找到cscore>=85就加1,最后用sum函数统计这个分数段有多少个人。以此类推
  • 为了显示课程名称,还要join成绩表和课程表
  • 最后用cid分组,返回三行结果,显示三门课程的各分数段人数

【14. 查询各科成绩最高分、最低分和平均分,以如下形式显示(题目略作修改):

  • 课程 ID,课程 name,最高分,最低分,平均分
  • 成绩分段如下:A为优秀>=90,B为良好80-90,C为中等70-80,D为及格>=60,Fail为不及格<60
  • 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列】

解法1:CASE

select 

  • 要统计各分数段人数,产生多个分数段新列,要用case来完成,原理与上一题一致
  • 计算百分比,例如及格率,就是用case的结果/成绩表学生总人数
  • 最后进行排序,先用选修人数降序排列,然后用课程编号cid升序排列

解法2:IF

select 

  • IF的语法规则是:IF(A,B,C),如果A条件为True,那么执行B,否则执行C
  • MySQL中,使用between运算符会选取包含头尾两个数值的范围,例如between 90 and 100,就是选取90分到100分的数据
  • 例如第一个IF语句,当分数cscore在90-100分(包含头尾)时,返回值为学生编号sid,否则返回null,所以使用count就可以得到总共有多少个符合条件的sid

补充内容:在查询结果中返回百分比并保留小数点后两位

这部分算是自己加的内容吧,主要觉得上面查询出来的百分比返回的0.3333之类的数值可读性不好,所以想要转换成33.33%这样的形式,具体方法就是先用cast函数取小数点后两位,然后用concat函数拼接数值和百分号,代码修改如下,供参考:

#修改第14题解法1的代码:

  • cast函数的语法为:cast(expr AS data_type),上述代码第二行的expr就是100*sum(case when a.cscore>=90 then 1 else 0 end) / count(*),先计算出百分比的数值。data_type就是decimal(18,2),两个参数代表最大18位数,小数点后保留2位
  • 然后用concat函数拼接cast函数转换出来的数字与百分号%

【第六部分】日期函数

知识要点与易错点总结

MySQL数据库的日期函数有很多,参见:https://www.w3cschool.cn/sql/82rg1ozi.html

这里讲一些经常用到的日期函数:

  • CURDATE() = CURRENT_DATE():返回当前日期年月日,例如2020-04-28
  • CURTIME() = CURRENT_TIME():返回当前时间时分秒,例如22:10:51
  • DATEDIFF():计算两个日期相差多少天,有两个参数:
    • 第一参数begin date
    • 第二参数end date
  • TIMESTAMPDIFF():在 datetime 表达式上减去一段时间,允许其参数具有混合类型(date或者datetime都可以),有三个参数:
    • 第一参数unit,是确定end-begin结果的单位,可以是year,month,week,day等
    • 第二参数begin date
    • 第三参数end date
  • DATE():从 date 或者 datetime 表达式中提取出日期部分
  • WEEK():返回日期参数是一年中的第几周,有两个参数:
    • 第一参数date,即需要查询星期数的日期
    • 第二参数mode是可选参数,用于指定一周起始于周日还是周一,以及返回值的范围应该是 0 到 53,还是 1 到 53
  • MONTH():返回日期参数的月份
  • YEAR():返回日期参数中的年份
  • STR_TO_DATE():将字符串转换为日期数据

日期函数题目整理(完整题目列表见文章最后)

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

select 

  • year() 函数返回年份,curdate() 函数返回当前日期
  • (year(curdate()) - year(sage)) 这个表达式最外面的括号可以不写

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

select 

  • 按出生日期来算,可以用更精确的timestampdiff函数求时间差,第一参数设定为year

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

***经朋友提醒,发现本题网上一些答案的写法是使用weekofyear()函数来解,给出一个日期参数,返回结果为该日期是那一年的第几周。但在这里其实不能用,例如sid=03号同学,生日是1990-05-20,使用weekofyear得出1990年的5月20号是当年的第20周。但是weekofyear计算出2020年5月20日是今年的第21周,并没有完成题目要求。

***注意:本来应该写now() 或curdate() 函数返回当前时间,但为了验证题目,下面的解法都用字符串日期'2020-05-20'代替

#weekofyear函数查找03号学生的生日所在周

  • 可以看到,如果用weekofyear(student.sage) = weekofyear('2020-05-20') 的写法,并没有返回03号同学的数据

正确的方法是,提取学生表中sage的出生日期数据的“月”和“日”,删掉“年”,而是把当前年份的“年”与sage的“月”和“日”拼接,然后再用week() 函数确定该日期是一年中的第几周。week() 函数有一个可选参数mode,用来确定计算周数的逻辑,如果不写则默认值为0,代表“一周的第一天是星期日,且周数范围为0-53”。mode参数可以根据实际需要进行调整,这里就使用默认值。

#最终代码

  • 这段代码的重点在于拼接日期,使用第四部分【子查询】里提到过的知识点CONCAT_WS函数将当前日期的年份Year(now()),sage的月,sage的日,拼接成一个YYYY-MM-DD的字符串,命名为新字段“拼接日期”

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

select 

  • 基于上一题,下周过生日就是当前日期的周数+1

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

select 

  • month() 函数返回日期参数的月份

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

select 

  • 基于上一题,下月过生日就是当前日期的月份+1

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

select 

  • 用year() 函数确定日期参数的年份

其他

剩下几道题的知识点比较散,放在一起说:

LIKE 运算符

  • 常与通配符 % 和 _ 配合使用
  • % 代表任意个字符,可以是0个,1个,或多个
  • _ 代表1个字符,可以把 _ 当成占位符
  • 注意:Access使用 ? 而不是 _

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

select 

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

select 


附录

题目列表:

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

1.2 查询同时上过"01"课程和"02"课程的学生

1.3 查询上过"01"课程但可能没上过"02"课程的学生 (这种情况显示为 null)

1.4 查询没上过"01"课程,只上过"02"课程的学生

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

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

4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null)

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

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

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

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

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

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

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

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

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

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

课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

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

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

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

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

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

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

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

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

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

21. 查询男生、女生人数

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

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

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

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

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

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

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

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

30. 查询不及格的课程

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

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

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

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

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

36. 查询所有课程成绩第二名到第三名的学生信息及课程成绩

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

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

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

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

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

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

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

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

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

max日期最大值为0_【SQL】SQL面试50题思路解答与分类整理(下)CASE与日期函数...相关推荐

  1. abap 取日期最大_Pointer干货分享:SQL面试50题思路解答与分类整理(下)CASE与日期函数...

    这是POINT小数点的第 368篇文章点点写在前面:SQL技能是数据分析师面试中必不可少的环节,小数点数据社区也给大家提供了练习SQL题目的地方,以下是pointer Yongfan整理的SQL50题 ...

  2. sql查询三级菜单分类_SQL面试50题——思路解答与分类整理(中)窗口函数与子查询...

    让我们每天都进步一点点 题目快速查找索引 阅读指南 上篇:SQL面试50题--思路解答与分类整理(上)聚合函数与表连接 [第一部分]聚合函数(sum/avg/count/min/max) [第二部分] ...

  3. 练习总结sql面试50题(2021-12-27完结)

    参考 [数据分析]- SQL面试50题 - 跟我一起打怪升级 一起成为数据科学家_哔哩哔哩_bilibili 图解SQL面试题:经典50题 - 知乎 sql面试题:topN问题 sql 分组查询 分组 ...

  4. SQL笔试经典50题及答案解析(题目1-10)

    前言 最近博主在准备数据分析岗位的笔试和面试,其中的考察重点就是SQL.听说练了这50道题目(题目和数据来源参考:互联网校招SQL笔试经典50题及答案解析),什么现场手撕SQL统统都不怕,我就赶紧来练 ...

  5. sql语句练习50题(Mysql版-详加注释)

    表名和字段 1.学生表       Student(s_id,s_name,s_birth,s_sex) --学生编号,学生姓名, 出生年月,学生性别 2.课程表       Course(c_id, ...

  6. SQL语句经典50题

    Sql语句经典50题 注:数据库版本为mysql 8.0 #学生表 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) N ...

  7. mysql求女生人数_Mysql版sql语句练习50题(小结)

    写完后一年没有看过,没想到这篇文章有这么多人点击.博主工作到一半去考研了,目前已上岸某中部985,也算是比较幸运.非常感谢大家在评论里的留言,留言太多不能一一回复,希望大家见谅.这两天根据评论把文章中 ...

  8. SQL笔试经典50题及答案解析

    [转]SQL笔试经典50题及答案解析 建表语句 create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nv ...

  9. SQL笔试经典50题及答案解析(题目21-30)

    前言 最近博主在准备数据分析岗位的笔试和面试,其中的考察重点就是SQL.听说练了这50道题目(题目和数据来源参考:互联网校招SQL笔试经典50题及答案解析),什么现场手撕SQL统统都不怕,我就赶紧来练 ...

最新文章

  1. 魅族 虚拟位置服务状态:未运行_神车道具送不停 魅族17x跑跑卡丁车礼盒开启预约...
  2. python资料库-Python对接六大主流数据库,只需三步
  3. 运行iis提示服务没有及时响应启动或控制请求的解决方法
  4. 分布式配置管理平台Disconf--转
  5. FaceBook机器学习开源DL模块
  6. JAVA将list2合并到list1_java如何将两个list合并的问题
  7. python月球地球质量计算_我们如何计算一个行星的质量?
  8. java中如何播放背景mp3音乐_java播放背景音乐
  9. manjaro 亮度调节
  10. nRF52832-Beacons测距离
  11. Datagrid striped 不工作?
  12. 模拟器+Appium+Python抓取App内容
  13. Java核心编程(22)
  14. 深入理解JVM(十五)垃圾回收相关概念
  15. android下面res目录
  16. C#程序探测未知网络环境的神操作
  17. Docker 学习随笔
  18. 保姆级教程!将 Vim 打造一个 IDE (Python 篇)
  19. Java开发者跳槽指南面试篇
  20. 《暗时间》 读书感悟

热门文章

  1. Eva.js 渲染Web页面动画
  2. Qt 发布 Android 自动驾驶技术预览
  3. unity 引用prefab_Unity基础教程-对象管理(二)——对象多样化(Fabricating Shapes)...
  4. java string 对象地址_Java中String对象的存储位置(学习笔记)
  5. 输出nc数据_NetCDF(NC)数据的使用、转换和分析
  6. 静态方法多次调用内存_JVM内存结构图(1.8之后发生了什么)
  7. ubuntu16.04 安装python3.6
  8. 线段树 HDU 3397
  9. 关于oracle数据库的导出导出
  10. 2013校队选拔——最短路——二分最大边的最小值