数据库学习4:数据库学习入门31-40题(基于MySQL)

SQL面试必会50题123

31. 查询1990年出生的学生名单(重点year)

法一

SELECT * FROM Student
WHERE YEAR(s_birth) = '1990'

法二

SELECT * FROM Student
WHERE YEAR(s_birth) = 1990 # 1990既可以写成字符串,也可以写成整数

其他时间函数
返回年份的函数

SELECT YEAR(200308) -- 报错
SELECT YEAR('200308') -- 2020,简写年份时,会首先默认最近年份,例如20会默认2020年而不是1920年
SELECT YEAR('20200308') -- 2020
SELECT YEAR('2020-03-08') -- 2020
SELECT YEAR('2020/03/08') -- 2020

返回月份的函数

SELECT MONTH(20200308) -- 报错
SELECT MONTH('2020\03\08') -- NULL
SELECT MONTH('2020-03-08') -- 3
SELECT MONTH('2020/03/08') -- 3
SELECT MONTH('20200308') -- 3
SELECT MONTH('200308') -- 3

可以用YEAR/MONTH正确返回年/月的时间格式

  • ‘YYYY-MM-DD’
  • ‘YYYY/MM/DD’
  • ‘YYYYMMDD’
  • ‘YYMMDD’

另外一些返回时间的函数

SELECT CURDATE() -- 返回当前日期
SELECT CURTIME() -- 返回当前时间
SELECT NOW() -- 返回当前日期和时间
SELECT WEEK('20200308',0) -- 返回日期为一年中的第几周(以0101作为第0周)
SELECT WEEK('20200308',1) -- 返回日期为一年中的第几周(以0101作为第1周)
SELECT HOUR('16:36') -- 返回时刻的小时16
SELECT HOUR('16:36:36') -- 16
SELECT MINUTE('16:36') -- 返回时刻的分钟36
SELECT MINUTE('16:36:36') -- 36
SELECT MONTHNAME('20200308') -- 返回月份名称
SELECT DATEDIFF(CURDATE(),'20200109') -- 返回起始时间和终止时间之间的天数,前者 - 后者

32. 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩(不重要)

SELECT  a.s_id,a.s_name'name',AVG(s_score)'average'
FROM Student AS a
INNER JOIN
Score AS b ON a.s_id = b.s_id
GROUP BY s_id,s_name HAVING AVG(s_score) >= 85

在这里插入图片描述

33. 查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列(不重要)

SELECT a.c_id,b.c_name'课程名',AVG(a.s_score)'average' 
FROM Score AS a
INNER JOIN
Course AS b ON a.c_id = b.c_id
GROUP BY c_id 
ORDER BY average ASC,a.c_id DESC # ASC升序

在这里插入图片描述

34. 查询课程名称为"数学",且分数低于60的学生姓名和分数(不重点)

SELECT b.s_id,b.s_name'姓名',a.s_score'成绩'
FROM Score AS a
INNER JOIN Student AS b ON a.s_id = b.s_id
INNER JOIN Course AS c ON a.c_id = c.c_id
WHERE c.c_name = '数学' AND a.s_score < 60

在这里插入图片描述

35. 查询所有学生的课程及分数情况(重点)

我们理想的成绩表是这样的:

学号 姓名 数学 语文 英文

难点:如何挑出数学/语文/英语成绩?
以数学为例,GROUP BY s_id后,表格变成如下图所示, CASE WHEN c.c_name = ‘数学’ 后,语文哪栏由于不符合“=‘数学’”的条件,所以是null,数学那栏符合“=‘数学’”的条件,所以是80,语文哪栏由于不符合“=‘英语’”的条件,所以是null,但 CASE WHEN最终只返回第一条信息,也就是1号学生数学成绩:null,语文成绩:90。
解决这个问题,可以通过MAX(CASE WHEN c.c_name = ‘数学’ THEN b.s_score ELSE NULL END),相当于MAX(NULL,80,NULL),这样就能得到80这个成绩。
在这里插入图片描述

SELECT a.s_id,a.s_name'姓名',
MAX(CASE WHEN c.c_name = '语文' THEN b.s_score ELSE NULL END)'语文',
MAX(CASE WHEN c.c_name = '数学' THEN b.s_score ELSE NULL END)'数学',
MAX(CASE WHEN c.c_name = '英语' THEN b.s_score ELSE NULL END)'英语'
FROM Student AS a
LEFT JOIN Score AS b ON a.s_id = b.s_id
LEFT JOIN Course AS c ON b.c_id = c.c_id
GROUP BY s_id,s_name

在这里插入图片描述

36. 查询任何一门课程成绩在70分以上的姓名、课程名称和分数(重点)

SELECT a.s_name'姓名',b.s_score'成绩',c.c_name'课程名称'
FROM Student AS a
INNER JOIN Score AS b ON a.s_id = b.s_id
INNER JOIN Course AS c ON b.c_id = c.c_id
WHERE b.s_score > 70

在这里插入图片描述

37. 查询不及格的课程并按课程号从大到小排列(不重点)

SELECT a.s_id'学号',c.s_name'姓名',a.s_score'成绩',a.c_id'课程编号'
FROM Score AS a
INNER JOIN Course AS b ON a.c_id = b.c_id
INNER JOIN Student AS c ON a.s_id = c.s_id
WHERE a.s_score < 60
ORDER BY a.c_id DESC

在这里插入图片描述

38. 查询课程编号为03且课程成绩在80分以上的学生的学号和姓名(不重要)

SELECT b.s_id'学号',b.s_name'姓名',c.c_name'课程名称',a.s_score'成绩'
FROM Score AS a
INNER JOIN Student AS b ON a.s_id = b.s_id
INNER JOIN Course AS c ON a.c_id = c.c_id
WHERE a.c_id = '03' AND a.s_score > 80

在这里插入图片描述

39. 求每门课程的学生人数(不重要)

SELECT a.c_id,b.c_name'课程名称',COUNT(DISTINCT a.s_id)'选课人数'
FROM Score AS a
INNER JOIN Course AS b ON a.c_id = b.c_id
GROUP BY c_id

在这里插入图片描述

40. 查询选修“张三”老师所授课程的学生中成绩最高的学生姓名及其成绩(重要top)

SELECT a.s_id'学号',b.s_name'姓名',a.s_score'成绩',c.c_name'课程名称'
FROM Score AS a
INNER JOIN Student AS b ON a.s_id = b.s_id
INNER JOIN Course AS c ON a.c_id = c.c_id
INNER JOIN Teacher AS d ON c.t_id= d.t_id
WHERE d.t_name = '张三' 
ORDER BY a.s_score DESC
LIMIT 0,1

在这里插入图片描述

LIMIT函数用法:
LIMIT a,b 表示从a行开始取b条样本,注意:SQL第一个被检索行是第0行而不是第1行


  1. B站视频专栏-up主:陆小亮-【数据分析】- SQL面试50题 - 跟我一起打怪升级 一起成为数据科学家 ↩︎

  2. 知乎-猴子-常见的SQL面试题:经典50题https://zhuanlan.zhihu.com/p/38354000 ↩︎

  3. 知乎-小番茄-SQL面试必会50题https://zhuanlan.zhihu.com/p/43289968 ↩︎

发布了14 篇原创文章 · 获赞 7 · 访问量 3254

猜你喜欢

转载自blog.csdn.net/sunsimiaofromsh/article/details/104731150
今日推荐