当前位置: 首页 > news >正文

MySQL 50 道经典练习题及答案

目录

一、数据表设计与初始化

1. 数据表结构说明

2. 建表语句

3. 插入测试数据

二、练习题及答案

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

2. 查询同时存在 "01" 课程和 "02" 课程的情况

3. 查询存在 "01" 课程但可能不存在 "02" 课程的情况 (不存在时显示为 null)

4. 查询不存在 "01" 课程但存在 "02" 课程的情况

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

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

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

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

9. 查询学过「张三」老师授课的同学的信息

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

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

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

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

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

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

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

17. 查询各科成绩最高分、最低分、平均分、及格率等统计信息

18. 按各科平均成绩排序,显示排名(Score 重复时保留名次空缺)

19. 按各科平均成绩排序,显示排名(Score 重复时不保留名次空缺)

20. 查询学生的总成绩并排名(总分重复时保留名次空缺)

21. 查询学生的总成绩并排名(总分重复时不保留名次空缺)

22. 统计各科成绩各分数段人数及百分比

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

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

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

26. 查询男生、女生人数

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

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

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

30. 查询每门课程的平均成绩,按平均成绩降序、课程编号升序排列

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

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

33. 查询所有学生的课程及分数情况(含没成绩、没选课的学生)

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

35. 查询不及格的课程

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

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

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

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

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

41. 查询每门课程成绩最好的前两名

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

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

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

45. 查询各学生的年龄(只按年份计算)

46. 按出生日期计算年龄(当前月日 < 出生月日则年龄减一)

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

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

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

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


一、数据表设计与初始化

1. 数据表结构说明

本次练习涉及 4 张核心表,分别用于存储学生、课程、教师及成绩信息,表结构如下:

  • 学生表(Student):包含学生编号(SId)、姓名(Sname)、出生年月(Sage)、性别(Ssex)
  • 课程表(Course):包含课程编号(CId)、名称(Cname)、教师编号(TId)
  • 教师表(Teacher):包含教师编号(TId)、姓名(Tname)
  • 成绩表(SC):包含学生编号(SId)、课程编号(CId)、分数(score)

2. 建表语句

-- 学生表
create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)
); -- 课程表
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10)
);-- 教师表
create table Teacher(TId varchar(10),Tname varchar(10)
);-- 成绩表
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1)
);

3. 插入测试数据

-- 学生表数据
insert into Student values('01' , '赵雷' , '1990-01-01' , '男'); 
insert into Student values('02' , '钱电' , '1990-12-21' , '男'); 
insert into Student values('03' , '孙风' , '1990-12-20' , '男'); 
insert into Student values('04' , '李云' , '1990-12-06' , '男'); 
insert into Student values('05' , '周梅' , '1991-12-01' , '女'); 
insert into Student values('06' , '吴兰' , '1992-01-01' , '女'); 
insert into Student values('07' , '郑竹' , '1989-01-01' , '女'); 
insert into Student values('09' , '张三' , '2017-12-20' , '女'); 
insert into Student values('10' , '李四' , '2017-12-25' , '女'); 
insert into Student values('11' , '李四' , '2012-06-06' , '女'); 
insert into Student values('12' , '赵六' , '2013-06-13' , '女'); 
insert into Student values('13' , '孙七' , '2014-06-01' , '女'); -- 课程表数据
insert into Course values('01' , '语文' , '02'); 
insert into Course values('02' , '数学' , '01'); 
insert into Course values('03' , '英语' , '03');-- 教师表数据
insert into Teacher values('01' , '张三'); 
insert into Teacher values('02' , '李四'); 
insert into Teacher values('03' , '王五'); -- 成绩表数据
insert into SC values('01' , '01' , 80); 
insert into SC values('01' , '02' , 90); 
insert into SC values('01' , '03' , 99); 
insert into SC values('02' , '01' , 70); 
insert into SC values('02' , '02' , 60); 
insert into SC values('02' , '03' , 80); 
insert into SC values('03' , '01' , 80); 
insert into SC values('03' , '02' , 80); 
insert into SC values('03' , '03' , 80); 
insert into SC values('04' , '01' , 50); 
insert into SC values('04' , '02' , 30); 
insert into SC values('04' , '03' , 20); 
insert into SC values('05' , '01' , 76); 
insert into SC values('05' , '02' , 87); 
insert into SC values('06' , '01' , 31); 
insert into SC values('06' , '03' , 34); 
insert into SC values('07' , '02' , 89); 
insert into SC values('07' , '03' , 98);

二、练习题及答案

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

-- 思路:将SC表按课程号01和02分别查询后连接,筛选01成绩>02成绩的记录
SELECT s.*, sc1.score AS '01课程分数', sc2.score AS '02课程分数'
FROM Student s
JOIN SC sc1 ON s.SId = sc1.SId AND sc1.CId = '01'
JOIN SC sc2 ON s.SId = sc2.SId AND sc2.CId = '02'
WHERE sc1.score > sc2.score;

2. 查询同时存在 "01" 课程和 "02" 课程的情况

-- 思路:通过子查询筛选同时选修01和02课程的学生ID,再关联查询
SELECT *
FROM SC sc1
WHERE sc1.CId = '01' 
AND EXISTS (SELECT 1 FROM SC sc2 WHERE sc2.SId = sc1.SId AND sc2.CId = '02'
);

3. 查询存在 "01" 课程但可能不存在 "02" 课程的情况 (不存在时显示为 null)

-- 思路:左连接01课程和02课程的成绩,保留01存在的所有记录
SELECT sc1.SId, sc1.CId AS '01课程', sc1.score AS '01分数', sc2.CId AS '02课程', sc2.score AS '02分数'
FROM SC sc1
LEFT JOIN SC sc2 ON sc1.SId = sc2.SId AND sc2.CId = '02'
WHERE sc1.CId = '01';

4. 查询不存在 "01" 课程但存在 "02" 课程的情况

-- 思路:筛选选修02课程的学生,且排除同时选修01课程的学生
SELECT *
FROM SC sc
WHERE sc.CId = '02'
AND sc.SId NOT IN (SELECT SId FROM SC WHERE CId = '01');

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

-- 思路:按学生分组计算平均分,筛选平均分>=60的记录
SELECT s.SId, s.Sname, AVG(sc.score) AS 平均成绩
FROM Student s
JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname
HAVING AVG(sc.score) >= 60;

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

-- 思路:查询SC表中存在的学生ID对应的学生信息(去重)
SELECT DISTINCT s.*
FROM Student s
JOIN SC sc ON s.SId = sc.SId;

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

-- 思路:左连接学生表和成绩表,按学生分组统计(没选课的学生也保留)
SELECT s.SId, s.Sname, COUNT(sc.CId) AS 选课总数, SUM(sc.score) AS 总成绩
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname;

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

-- 思路:筛选姓名以"李"开头的教师,统计数量
SELECT COUNT(*) AS 李姓老师数量
FROM Teacher
WHERE Tname LIKE '李%';

9. 查询学过「张三」老师授课的同学的信息

-- 思路:关联教师、课程、成绩表,筛选张三老师的课程对应的学生
SELECT DISTINCT s.*
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
JOIN Teacher t ON c.TId = t.TId
WHERE t.Tname = '张三';

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

-- 思路:先获取总课程数,再统计学生选课数,筛选小于总课程数的学生
SELECT s.*
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname, s.Sage, s.Ssex
HAVING COUNT(DISTINCT sc.CId) < (SELECT COUNT(*) FROM Course);

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

-- 思路:先获取01号学生的课程,再筛选选修了这些课程的其他学生
SELECT DISTINCT s.*
FROM Student s
JOIN SC sc ON s.SId = sc.SId
WHERE sc.CId IN (SELECT CId FROM SC WHERE SId = '01')
AND s.SId != '01';

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

-- 思路:对比学生选课数和01号相同,且所有课程都在01号的课程列表中
SELECT s.*
FROM Student s
WHERE s.SId != '01'
AND (SELECT COUNT(*) FROM SC WHERE SId = s.SId) = (SELECT COUNT(*) FROM SC WHERE SId = '01')
AND NOT EXISTS (SELECT 1 FROM SC sc1 WHERE sc1.SId = s.SId AND sc1.CId NOT IN (SELECT CId FROM SC WHERE SId = '01')
);

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

-- 思路:排除学过张三老师课程的学生
SELECT Sname
FROM Student
WHERE SId NOT IN (SELECT DISTINCT sc.SIdFROM SC scJOIN Course c ON sc.CId = c.CIdJOIN Teacher t ON c.TId = t.TIdWHERE t.Tname = '张三'
);

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

-- 思路:筛选不及格(<60)的课程,按学生分组统计数量>=2,计算平均分
SELECT s.SId, s.Sname, AVG(sc.score) AS 平均成绩
FROM Student s
JOIN SC sc ON s.SId = sc.SId
WHERE sc.score < 60
GROUP BY s.SId, s.Sname
HAVING COUNT(sc.CId) >= 2;

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

-- 思路:筛选01课程且分数<60的记录,关联学生信息并排序
SELECT s.*, sc.score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
WHERE sc.CId = '01' AND sc.score < 60
ORDER BY sc.score DESC;

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

-- 思路:用窗口函数计算每个学生的平均分,关联所有课程成绩
SELECT s.SId, s.Sname, MAX(CASE WHEN sc.CId = '01' THEN sc.score END) AS 语文,MAX(CASE WHEN sc.CId = '02' THEN sc.score END) AS 数学,MAX(CASE WHEN sc.CId = '03' THEN sc.score END) AS 英语,AVG(sc.score) OVER (PARTITION BY s.SId) AS 平均成绩
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname
ORDER BY 平均成绩 DESC;

17. 查询各科成绩最高分、最低分、平均分、及格率等统计信息

-- 思路:按课程分组,用CASE统计各分数段人数,计算百分比
SELECT c.CId, c.Cname,COUNT(sc.SId) AS 选修人数,MAX(sc.score) AS 最高分,MIN(sc.score) AS 最低分,AVG(sc.score) AS 平均分,-- 及格率(>=60)SUM(CASE WHEN sc.score >= 60 THEN 1 ELSE 0 END)/COUNT(sc.SId) AS 及格率,-- 中等率(70-80)SUM(CASE WHEN sc.score BETWEEN 70 AND 80 THEN 1 ELSE 0 END)/COUNT(sc.SId) AS 中等率,-- 优良率(80-90)SUM(CASE WHEN sc.score BETWEEN 80 AND 90 THEN 1 ELSE 0 END)/COUNT(sc.SId) AS 优良率,-- 优秀率(>=90)SUM(CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END)/COUNT(sc.SId) AS 优秀率
FROM Course c
JOIN SC sc ON c.CId = sc.CId
GROUP BY c.CId, c.Cname
ORDER BY 选修人数 DESC, c.CId ASC;

18. 按各科平均成绩排序,显示排名(Score 重复时保留名次空缺)

-- 思路:用RANK()窗口函数(重复排名后有空缺)
SELECT CId, 平均成绩,RANK() OVER (ORDER BY 平均成绩 DESC) AS 排名
FROM (SELECT CId, AVG(score) AS 平均成绩FROM SCGROUP BY CId
) AS 科平均;

19. 按各科平均成绩排序,显示排名(Score 重复时不保留名次空缺)

-- 思路:用DENSE_RANK()窗口函数(重复排名后无空缺)
SELECT CId, 平均成绩,DENSE_RANK() OVER (ORDER BY 平均成绩 DESC) AS 排名
FROM (SELECT CId, AVG(score) AS 平均成绩FROM SCGROUP BY CId
) AS 科平均;

20. 查询学生的总成绩并排名(总分重复时保留名次空缺)

-- 思路:计算学生总分,用RANK()排名
SELECT SId, 总成绩,RANK() OVER (ORDER BY 总成绩 DESC) AS 排名
FROM (SELECT SId, SUM(score) AS 总成绩FROM SCGROUP BY SId
) AS 总分数;

21. 查询学生的总成绩并排名(总分重复时不保留名次空缺)

-- 思路:计算学生总分,用DENSE_RANK()排名
SELECT SId, 总成绩,DENSE_RANK() OVER (ORDER BY 总成绩 DESC) AS 排名
FROM (SELECT SId, SUM(score) AS 总成绩FROM SCGROUP BY SId
) AS 总分数;

22. 统计各科成绩各分数段人数及百分比

-- 思路:按课程分组,用CASE统计各分数段人数,计算百分比
SELECT c.CId, c.Cname,-- [100-85]人数及百分比SUM(CASE WHEN sc.score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS '[100-85]',SUM(CASE WHEN sc.score BETWEEN 85 AND 100 THEN 1 ELSE 0 END)/COUNT(sc.SId) AS '[100-85]%',-- [85-70]人数及百分比SUM(CASE WHEN sc.score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS '[85-70]',SUM(CASE WHEN sc.score BETWEEN 70 AND 85 THEN 1 ELSE 0 END)/COUNT(sc.SId) AS '[85-70]%',-- [70-60]人数及百分比SUM(CASE WHEN sc.score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS '[70-60]',SUM(CASE WHEN sc.score BETWEEN 60 AND 70 THEN 1 ELSE 0 END)/COUNT(sc.SId) AS '[70-60]%',-- [60-0]人数及百分比SUM(CASE WHEN sc.score < 60 THEN 1 ELSE 0 END) AS '[60-0]',SUM(CASE WHEN sc.score < 60 THEN 1 ELSE 0 END)/COUNT(sc.SId) AS '[60-0]%'
FROM Course c
JOIN SC sc ON c.CId = sc.CId
GROUP BY c.CId, c.Cname;

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

-- 思路:用ROW_NUMBER()按课程分组排序,取前3名
SELECT *
FROM (SELECT sc.*,ROW_NUMBER() OVER (PARTITION BY CId ORDER BY score DESC) AS 名次FROM SC sc
) AS 排名表
WHERE 名次 <= 3;

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

-- 思路:按课程分组统计学生数
SELECT CId, COUNT(SId) AS 学生数
FROM SC
GROUP BY CId;

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

-- 思路:按学生分组统计选课数=2的记录
SELECT s.SId, s.Sname
FROM Student s
JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname
HAVING COUNT(sc.CId) = 2;

26. 查询男生、女生人数

-- 思路:按性别分组统计人数
SELECT Ssex, COUNT(*) AS 人数
FROM Student
GROUP BY Ssex;

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

-- 思路:用LIKE匹配含"风"的姓名
SELECT *
FROM Student
WHERE Sname LIKE '%风%';

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

-- 思路:按姓名和性别分组,筛选人数>=2的记录
SELECT Sname, Ssex, COUNT(*) AS 同名人数
FROM Student
GROUP BY Sname, Ssex
HAVING COUNT(*) >= 2;

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

-- 思路:提取出生年份=1990的学生(Sage为datetime类型)
SELECT *
FROM Student
WHERE YEAR(Sage) = 1990;

30. 查询每门课程的平均成绩,按平均成绩降序、课程编号升序排列

-- 思路:按课程分组计算平均分,指定排序规则
SELECT CId, AVG(score) AS 平均成绩
FROM SC
GROUP BY CId
ORDER BY 平均成绩 DESC, CId ASC;

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

-- 思路:按学生分组计算平均分,筛选>=85的记录
SELECT s.SId, s.Sname, AVG(sc.score) AS 平均成绩
FROM Student s
JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname
HAVING AVG(sc.score) >= 85;

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

-- 思路:关联课程表筛选"数学",再筛选分数<60的记录
SELECT s.Sname, sc.score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
WHERE c.Cname = '数学' AND sc.score < 60;

33. 查询所有学生的课程及分数情况(含没成绩、没选课的学生)

-- 思路:用左连接保留所有学生,即使没选课/没成绩
SELECT s.SId, s.Sname, c.Cname, sc.score
FROM Student s
LEFT JOIN SC sc ON s.SId = sc.SId
LEFT JOIN Course c ON sc.CId = c.CId
ORDER BY s.SId, c.CId;

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

-- 思路:筛选分数>70的记录,关联学生和课程名称
SELECT s.Sname, c.Cname, sc.score
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
WHERE sc.score > 70;

35. 查询不及格的课程

-- 思路:筛选分数<60的记录,关联课程名称
SELECT sc.SId, c.Cname, sc.score
FROM SC sc
JOIN Course c ON sc.CId = c.CId
WHERE sc.score < 60;

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

-- 思路:筛选01课程且分数>80的记录,关联学生信息
SELECT s.SId, s.Sname
FROM Student s
JOIN SC sc ON s.SId = sc.SId
WHERE sc.CId = '01' AND sc.score > 80;

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

-- 思路:同24题,按课程分组统计学生数
SELECT CId, COUNT(SId) AS 学生人数
FROM SC
GROUP BY CId;

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

-- 思路:先找到张三老师的课程,再筛选这些课程的最高成绩对应的学生
SELECT s.*, sc.score, c.Cname
FROM Student s
JOIN SC sc ON s.SId = sc.SId
JOIN Course c ON sc.CId = c.CId
JOIN Teacher t ON c.TId = t.TId
WHERE t.Tname = '张三'
AND sc.score = (SELECT MAX(score) FROM SC sc2JOIN Course c2 ON sc2.CId = c2.CIdWHERE c2.TId = t.TId
);

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

-- 思路:用窗口函数RANK()取最高成绩(含并列)
SELECT *
FROM (SELECT s.*, sc.score, c.Cname,RANK() OVER (ORDER BY sc.score DESC) AS 排名FROM Student sJOIN SC sc ON s.SId = sc.SIdJOIN Course c ON sc.CId = c.CIdJOIN Teacher t ON c.TId = t.TIdWHERE t.Tname = '张三'
) AS 排名表
WHERE 排名 = 1;

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

-- 思路:自连接SC表,筛选分数相同但课程不同的记录
SELECT DISTINCT sc1.SId, sc1.CId, sc1.score
FROM SC sc1
JOIN SC sc2 ON sc1.score = sc2.score AND sc1.CId != sc2.CId AND sc1.SId = sc2.SId;

41. 查询每门课程成绩最好的前两名

-- 思路:按课程分组排序,取前2名(含并列可能用DENSE_RANK())
SELECT *
FROM (SELECT sc.*,DENSE_RANK() OVER (PARTITION BY CId ORDER BY score DESC) AS 名次FROM SC sc
) AS 排名表
WHERE 名次 <= 2;

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

-- 思路:按课程分组统计人数,筛选人数>5的记录
SELECT CId, COUNT(SId) AS 选修人数
FROM SC
GROUP BY CId
HAVING COUNT(SId) > 5;

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

-- 思路:按学生分组统计选课数>=2的记录
SELECT SId
FROM SC
GROUP BY SId
HAVING COUNT(CId) >= 2;

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

-- 思路:筛选选课数等于总课程数的学生
SELECT s.*
FROM Student s
JOIN SC sc ON s.SId = sc.SId
GROUP BY s.SId, s.Sname, s.Sage, s.Ssex
HAVING COUNT(DISTINCT sc.CId) = (SELECT COUNT(*) FROM Course);

45. 查询各学生的年龄(只按年份计算)

-- 思路:用当前年份减去出生年份(假设当前年份为2023,或用YEAR(CURDATE()))
SELECT SId, Sname, YEAR(CURDATE()) - YEAR(Sage) AS 年龄
FROM Student;

46. 按出生日期计算年龄(当前月日 < 出生月日则年龄减一)

-- 思路:判断当前月日与出生月日,调整年龄计算
SELECT SId, Sname,CASE WHEN DATE_FORMAT(CURDATE(), '%m%d') < DATE_FORMAT(Sage, '%m%d') THEN YEAR(CURDATE()) - YEAR(Sage) - 1ELSE YEAR(CURDATE()) - YEAR(Sage)END AS 年龄
FROM Student;

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

-- 思路:提取生日月日,判断是否在当前周(本周从周一到周日)
SELECT *
FROM Student
WHERE WEEKOFYEAR(DATE_FORMAT(Sage, CONCAT(YEAR(CURDATE()), '-%m-%d'))) = WEEKOFYEAR(CURDATE());

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

-- 思路:判断生日周为当前周+1
SELECT *
FROM Student
WHERE WEEKOFYEAR(DATE_FORMAT(Sage, CONCAT(YEAR(CURDATE()), '-%m-%d'))) = WEEKOFYEAR(CURDATE()) + 1;

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

-- 思路:提取生日月份,与当前月份一致
SELECT *
FROM Student
WHERE MONTH(Sage) = MONTH(CURDATE());

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

-- 思路:提取生日月份,与当前月份+1一致(12月的下月为1月)
SELECT *
FROM Student
WHERE MONTH(Sage) = CASE WHEN MONTH(CURDATE()) = 12 THEN 1 ELSE MONTH(CURDATE()) + 1 END;
http://www.dtcms.com/a/341254.html

相关文章:

  • 使用Jmeter轻松实现AES加密测试
  • 国电南自面试记录
  • 细说数仓中不同类型的维度
  • 实时交互世界模型新标杆! Skywork AI 发布 Matrix-Game 2.0: 攻克实时交互难题,在实时性与视频生成质量上实现跨越式突破!
  • synchronized锁,ReentrantLock 锁
  • 基于隐函数定理的偏导数计算及其C++实现
  • 批处理指令常见问题
  • 基于langchain重现agent调用llm和tools的过程
  • Angular入门教程
  • VG技术下,美术在资源制作时的规范
  • 前端 下载后端返回的二进制excel数据
  • Java集合框架:Set、List、Map及HashMap底层实现详解
  • 在Excel和WPS表格中制作可打印的九九乘法表
  • Flask高效数据库操作指南
  • Qt音乐播放器项目实践:本地持久化与边角问题处理
  • 对象存储 COS 端到端质量系列——终端 COS SDK 网络优化
  • 开发中使用——鸿蒙特有的图片保存到相册的方式
  • 气泡水位计在水库大坝安全监测中的应用
  • 大语言模型研究进展
  • 【MAR】OSCNet+学习笔记
  • 机器学习总复习
  • Redis知识总结
  • IDEA:控制台中文乱码
  • 【JavaEE】多线程 -- 定时器
  • 无人机感知系统详解
  • Excel表格复制到word中格式错乱
  • 【Java】深入浅出Spring中的@Autowired:自动注入的奥秘
  • 机器翻译 (Machine Translation) 经典面试笔试50题(包括详细答案)
  • imx6ull-驱动开发篇29——Linux阻塞IO 实验
  • Java并发容器详解