MySQL 经典案例个人答题思想


注:网页版右上方的悬浮框有目录索引
答题网址:https://blog.csdn.net/paul0127/article/details/82529216?tdsourcetag=s_pctim_aiomsg

一、表图片,创建表语句,解题思路

1、用一条SQL 语句 查询出每门课都大于80 分的学生姓名

1-1. 表图片
在这里插入图片描述
1-2. 创建表语句

CREATE TABLE `b` (
  `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `course` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `grade` int(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert  into `b`(`name`,`course`,`grade`) values 
('张三','语文',81),
('张三','数学',75),
('李四','语文',76),
('李四','数学',90),
('王五','语文',81),
('王五','数学',100),
('王五','英语',90);

1-3. SQL语句

SELECT NAME 
FROM b 
GROUP BY `name` 
#至此,按姓名分组。
#此时该同学的所有成绩都处于一个集合中
HAVING MIN(grade)>80;
#对集合中的数据的最小值进行判断
#若大于80,则该学生全部成绩都大于80。

2、删除除了自动编号不同, 其他都相同的学生冗余信息

2-1. 表图片
第二题
2-2. 创建表语句

CREATE TABLE `a` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `stu_id` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `stu_name` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `course_id` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `course_name` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `score` int(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert  into `a`(`id`,`stu_id`,`stu_name`,`course_id`,`course_name`,`score`) values 
(1,'2020002','张三','0001','数学',69),
(2,'2020001','李四','0002','语言',89),
(3,'2020002','张三','0001','数学',69);

2-3. SQL语句

DELETE FROM a
WHERE id NOT IN(
	SELECT MIN(id) 
	FROM (SELECT id,stu_id,stu_name,course_id,course_name,score FROM a) b 
	#在此如果直接写表名,则会报错,错误如下
	#You can't specify target table 'a' for update in FROM clause
	#因此在此查询出表 a 的所有数据并用 b 作为别名
	GROUP BY b.stu_id,b.stu_name,b.course_id,b.course_name,b.score
)
#对 id 之外的列进行分组查询。得到相同的数据对应的 id 集合的最小的那个 id
#此时,若一个集合中有多个id,则非最小的 id 即为多余的
#在此,即可使用 not in,不在最小 id 集合中的 id 给删除掉

3、一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球队,现在四个球队进行比赛,用一条sql 语句显示所有可能的比赛组合

3-1. 表图片
在这里插入图片描述
3-2. 创建表语句

CREATE TABLE `team` (
  `name` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert  into `team`(`name`) values ('a'),('b'),('c'),('d');

3-3. SQL语句

SELECT t1.name '球队一',t2.name '球队二'
FROM team t1,team t2
#自连接查询,查两个表,不加条件:
#第一个表每条数据均要与第二个表的每条数据相对应,此时出现数据重复
WHERE t1.name<t2.name
#加上条件,此时思想为每个球队与后面球队逐一对局,且无法与自己比赛

4、请用SQL 语句实现:从 a 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。

请注意:a 中有很多科目,都有1~12月份的发生额。
AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。

4-1. 表图片
在这里插入图片描述
4-2. 创建表语句

CREATE TABLE `a` (
  `AccID` int(11) NOT NULL,
  `Occmonth` int(11) DEFAULT NULL,
  `DeitOccur` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert  into `a`(`AccID`,`Occmonth`,`DeitOccur`) values (101,1,99),(102,3,22),(103,1,133),(101,2,99),(102,2,155),(103,2,133),(101,3,99),(102,1,155),(103,3,123),(101,7,99),(102,7,285),(103,7,120);

4-3. SQL语句

SELECT a2.AccID
FROM a a1,a a2
#连接查询,此时得到 12*12 条数据
WHERE a1.AccID='101' 
#限制表a1,表a1有4条数据。整体有12*4 条数据
AND a1.Occmonth=a2.Occmonth 
AND a1.DeitOccur<a2.DeitOccur 
#限制条件约束,即 表a2的月份与表a1相同 且 表a2的发生额要大于表a1
#此时可得到相应月份发生额大于表a1的所有数据
GROUP BY AccID
#二、根据科目 id 分组
HAVING COUNT(a2.Occmonth)=(SELECT COUNT(Occmonth) FROM a WHERE AccID=101)
#三、使用聚合函数,得到每个id分组后每组所包含的信息条数
#即可得到每个id 符合要求的个数,若与表a1的月份个数相同,则它为有效信息

5、按一定格式查询

5-1. 表图片、结果图
表图片在这里插入图片描述
5-2. 创建表语句

CREATE TABLE `a` (
  `year` int(4) DEFAULT NULL,
  `month` int(4) DEFAULT NULL,
  `amount` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert  into `a`(`year`,`month`,`amount`) values 
(1991,1,1.1),(1991,2,1.2),(1991,3,1.3),(1991,4,1.4),(1992,1,2.1),(1992,2,2.2),(1992,3,2.3),(1992,4,2.4);

5-3. SQL语句

SELECT `year`
,(SELECT CAST(amount AS DECIMAL(5,1)) FROM a a1 WHERE a1.year=a.year AND a1.month=1) AS m1
#CAST(amount AS DECIMAL(5,1))浮点型数值小数点取一位
#当前某列信息来自与表 a 同年,且月份为1的数值
,(SELECT CAST(amount AS DECIMAL(5,1)) FROM a a2 WHERE a2.year=a.year AND a2.month=2) AS m2
,(SELECT CAST(amount AS DECIMAL(5,1)) FROM a a3 WHERE a3.year=a.year AND a3.month=3) AS m3
,(SELECT CAST(amount AS DECIMAL(5,1)) FROM a a4 WHERE a4.year=a.year AND a4.month=4) AS m4
FROM a
GROUP BY `year`

6、将上表中数据合并

6-1. 表图片、效果图
在这里插入图片描述在这里插入图片描述

s1_id为仓库1的库存量,s2_id为仓库2的库存量,s3_id为仓库3的库存量。
如果该产品在某仓库中无库存量,那么就是0代替。

6-2. 创建表语句

CREATE TABLE `a` (
  `p_ID` int(10) DEFAULT NULL,
  `p_Num` int(10) DEFAULT NULL,
  `s_id` int(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert  into `a`(`p_ID`,`p_Num`,`s_id`) values 
(1,10,1),(1,12,2),(2,8,1),(3,11,1),(3,8,3);

6-3. SQL语句

SELECT p_id
,SUM(CASE WHEN s_id=1 THEN p_num ELSE 0 END) AS s1_id
,SUM(CASE WHEN s_id=2 THEN p_num ELSE 0 END) AS s2_id
,SUM(CASE WHEN s_id=3 THEN p_num ELSE 0 END) AS s3_id
#此处使用的聚合函数是对已经分过组的数据进行计算
#即只需算出不同 s_id 对应的 p_Num 的和
FROM a
GROUP BY p_id

二、正题

  • 创建表
#学生表 Student
create table Student(Sid varchar(6), Sname varchar(10), Sage datetime, Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');insert into Student values('02' , '钱电' , '1990-12-21' , '男');insert into Student values('03' , '孙风' , '1990-05-20' , '男');insert into Student values('04' , '李云' , '1990-08-06' , '男');insert into Student values('05' , '周梅' , '1991-12-01' , '女');insert into Student values('06' , '吴兰' , '1992-03-01' , '女');insert into Student values('07' , '郑竹' , '1989-07-01' , '女');insert into Student values('08' , '王菊' , '1990-01-20' , '女')

#成绩表 SC
create table SC(Sid varchar(10), Cid varchar(10), score decimal(18,1));
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)

#课程表 Course
create table Course(Cid varchar(10),Cname varchar(10),Tid varchar(10));
insert into Course values('01' , '语文' , '02');insert into Course values('02' , '数学' , '01');insert into Course values('03' , '英语' , '03')

#教师表 Teacher
create table Teacher(Tid varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');insert into Teacher values('02' , '李四');insert into Teacher values('03' , '王五')

————————————————
版权声明:本文为CSDN博主「廖致君」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/paul0127/article/details/82529216
  • 表结构(外键联系未构造,不影响做题)
    在这里插入图片描述

1、查询” 01 “课程比” 02 “课程成绩高的学生的信息及课程分数

1-1. 效果图
在这里插入图片描述
1-2. SQL语句

SELECT student.Sname,a.score AS '01',b.score AS '02'
FROM sc a,sc b,student
#有比较,即同一个表两个对象
WHERE a.Sid=b.Sid AND a.Cid=1 AND b.Cid=2 AND a.score>b.score AND a.Sid=student.Sid
#表a与表 b 要对应同一个人,且表a指代课程01,表b指代课程02
#此时对课程进行判断,最终数据的最终数据的sid 用来获取对应 student 表中的学生姓名

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

2-1. 效果图
在这里插入图片描述
2-2. SQL语句

SELECT stu.Sid,stu.Sname,AVG(score)
FROM sc,student stu
WHERE sc.Sid=stu.Sid
#sc 表和 student 表进行绑定
GROUP BY sid
#一、按学号分组,得到该生所有成绩的集合,再用聚合函数取平均值
HAVING AVG(score)>=60
#对分组后的数据进行筛选

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

3-1. 效果图
在这里插入图片描述
3-2. SQL语句

SELECT stu.Sname
FROM student stu
WHERE stu.Sid IN(SELECT sid FROM sc WHERE sc.score IS NOT NULL)
#查询出成绩表中成绩列不为空的所有学生 id
#学生表中 id 若在此集合中,则该考试成绩存在

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

这道题得用到left join或者right join,不能用where连接,因为题目说了要求有显示为null的,where是inner join,不会出现null,在这道题里会查不出第08号学生。

4-1. 效果图
在这里插入图片描述
4-2. SQL语句

SELECT stu.Sid,stu.Sname,COUNT(sc.Cid),SUM(sc.score)
FROM student stu
LEFT JOIN sc
ON stu.Sid=sc.Sid
#左连接查询,根据左表的数据来和右表数据进行对应,若右表无数据,则为空
GROUP BY Sid
#按学号分组,使用聚合函数获取总数与总分

5、查有成绩的学生信息

5-1. 效果图
在这里插入图片描述
5-2. SQL语句

SELECT stu.Sname,COUNT(cid),SUM(score)
FROM student stu
RIGHT JOIN sc
ON stu.Sid=sc.Sid
GROUP BY sc.Sid
#与上题类似,即以哪个表为基准,进行数据匹配

6、查询「李」姓老师的数量

6-1. 效果图
在这里插入图片描述
6-2. SQL语句

SELECT COUNT(Tname)
FROM teacher
WHERE Tname LIKE '李%'
# 查询出姓名以'李'开关的数据,再计算总数

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

7-1. 效果图
在这里插入图片描述
7-2. SQL语句

SELECT *
FROM student stu
WHERE stu.Sid IN(
	SELECT sid FROM sc WHERE cid IN(
		SELECT Cid
		FROM course
		WHERE Tid = (SELECT tid FROM teacher WHERE Tname='张三')
	)
)
#从内到外编写,先得到教师id
#通过教师id得到课程 id
#通过课程id得到课程 id 所对应的学生 id 集合

8、查询没有学全所有课程的同学的信息

8-1. 效果图
在这里插入图片描述
8-2. SQL语句

SELECT *
FROM student stu
WHERE stu.Sid NOT IN (SELECT sid FROM sc GROUP BY sid HAVING COUNT(cid)=3)
# 先得到成绩表中单个学生对应课程的总数等于3的id
#再判断学生表中 id 没有存在在此集合中的学生

9、查询和” 01 “号的同学学习的课程完全相同的其他同学的信息

博主号称最难

9-1. 效果图
在这里插入图片描述
9-2. SQL语句

SELECT * FROM Student
WHERE Sid IN(
    SELECT Sid 
    FROM SC
    WHERE Cid IN (SELECT Cid FROM SC WHERE Sid = '01') AND Sid <>'01'
    #得到学号不为01,且所选课程在学生01所选课程列表中的数据
    #<> 等同于 !=
    GROUP BY Sid
    #按 sid 分组,
    HAVING COUNT(Cid)>=(SELECT COUNT(cid) FROM sc WHERE sid=01)
    #对数据进行筛选,与学生01相同课程数量不足学生01选课数量的去掉
)

10、查询至少有一门课与学号为” 01 “的同学所学相同的同学的信息

10-1. 效果图
在这里插入图片描述
10-2. SQL语句

SELECT * FROM Student
WHERE Sid IN(
    SELECT Sid 
    FROM SC
    WHERE Cid IN (SELECT Cid FROM SC WHERE Sid = '01') AND Sid <>'01'
    #筛选选课课程号,在学生01选课的课程号列表中的,数据
    # <> 等同于 !=
)

11、 查询没学过”张三”老师讲授的任一门课程的学生姓名

11-1. 效果图
在这里插入图片描述
11-2. SQL语句

SELECT *
FROM student stu
WHERE stu.Sid NOT IN(
	SELECT sc.sid 
	FROM sc
	WHERE sc.cid IN(
		SELECT cid FROM course WHERE tid =(
			SELECT tid FROM teacher WHERE Tname='张三'
		)
		#得到张三老师授课的课程编号
	)
	#得到成绩表中课程号,在张三老师授课列表中的,对应的学生学号
)
#所需数据即为不在此列表中的学号

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

12-1. 效果图
在这里插入图片描述
12-2. SQL语句

SELECT stu.Sid,stu.Sname,(SELECT AVG(score) FROM sc WHERE sid = stu.Sid) '平均成绩'
# 第二个括号中的 select 语句与下面均无关联
FROM student stu
WHERE stu.sid IN(
	SELECT sid
	FROM sc
	WHERE score<60
	GROUP BY sid
	HAVING COUNT(cid)>=2
	# 在成绩表中查询学号
	#先筛选出成绩小于60的数据
	#再根据学号分组,筛选出成绩集合中数据大于等于两条的数据
)

13、检索” 01 “课程分数小于 60,按分数降序排列的学生信息

13-1. 效果图
在这里插入图片描述
13-2. SQL语句

SELECT stu.*,sc.score
FROM student stu,sc
WHERE stu.Sid=sc.sid
AND sc.Cid=01
AND sc.score<60
#连接查询,先对数据进行绑定,确保在同一个学生信息下进行操作
#即要课程号为01也要该生成绩小于60
ORDER BY sc.score DESC

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

14-1. 效果图
在这里插入图片描述
14-2. SQL语句

SELECT stu.Sname
,(SELECT score FROM sc WHERE Cid=01 AND sc.Sid=stu.Sid) '01'
,(SELECT score FROM sc WHERE Cid=02 AND sc.Sid=stu.Sid) '02'
,(SELECT score FROM sc WHERE Cid=03 AND sc.Sid=stu.Sid) '03'
#上三句 select 与其它仅有一点联系
,AVG(score)
FROM sc,student stu
WHERE sc.Sid=stu.sid
#先绑定数据
GROUP BY sc.sid
ORDER BY AVG(score) DESC
#分组、排序

15、 查询各科成绩最高分、最低分和平均分,以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率(及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)。

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

15-1. 效果图
在这里插入图片描述
15-2. SQL语句

SELECT sc.Cid,c.Cname,AVG(score),MAX(score),MIN(score),AVG(score)
,SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END)/(COUNT(score)) '及格率'
,SUM(CASE WHEN score>=70 AND score<80 THEN 1 ELSE 0 END)/(COUNT(score)) '中等率'
,SUM(CASE WHEN score>=80 AND score<90 THEN 1 ELSE 0 END)/(COUNT(score)) '优良率'
,SUM(CASE WHEN score>=90 THEN 1 ELSE 0 END)/(COUNT(score)) '优秀率'
# 博客代码,
# 根据成绩是否满足条件,给定1或0。最终和除以总长度,即可得到比例
FROM sc,course c
WHERE sc.Cid=c.Cid
GROUP BY c.Cid

16、按平均成绩进行排序,显示总排名和各科排名,Score 重复时保留名次空缺

16-1. 效果图
在这里插入图片描述
16-2. SQL语句

select s.*, rank_01, rank_02, rank_03, rank_total
from student s
left join (select sid, rank() over(partition by cid order by score desc) as rank_01 from sc where cid=01) A on s.sid=A.sid
left join (select sid, rank() over(partition by cid order by score desc) as rank_02 from sc where cid=02) B on s.sid=B.sid
left join (select sid, rank() over(partition by cid order by score desc) as rank_03 from sc where cid=03) C on s.sid=C.sid
left join (select sid, rank() over(order by avg(score) desc) as rank_total from sc group by sid) D on s.sid=D.sid
order by rank_total asc
————————————————
版权声明:本文为CSDN博主「廖致君」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/paul0127/article/details/82529216

17、按平均成绩进行排序,显示总排名和各科排名,Score 重复时合并名次

rank()和dense_rank()的区别

17-1. 效果图
在这里插入图片描述
17-2. SQL语句

select s.*, rank_01, rank_02, rank_03, rank_total
from student s
left join (select sid, dense_rank() over(partition by cid order by score desc) as rank_01 from sc where cid=01) A on s.sid=A.sid
left join (select sid, dense_rank() over(partition by cid order by score desc) as rank_02 from sc where cid=02) B on s.sid=B.sid
left join (select sid, dense_rank() over(partition by cid order by score desc) as rank_03 from sc where cid=03) C on s.sid=C.sid
left join (select sid, dense_rank() over(order by avg(score) desc) as rank_total from sc group by sid) D on s.sid=D.sid
order by rank_total asc
————————————————
版权声明:本文为CSDN博主「廖致君」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/paul0127/article/details/82529216

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

18-1. 效果图
在这里插入图片描述
18-2. SQL语句

SELECT c.Cname
,SUM(CASE WHEN sc.score>=85 THEN 1 ELSE 0 END)/COUNT(sc.score) AS '优秀人数'
,SUM(CASE WHEN sc.score>=70 AND sc.score<85 THEN 1 ELSE 0 END)/COUNT(sc.score) AS '良好人数'
,SUM(CASE WHEN sc.score>=60 AND sc.score<70 THEN 1 ELSE 0 END)/COUNT(sc.score) AS '中等人数'
,SUM(CASE WHEN sc.score<60 THEN 1 ELSE 0 END)/COUNT(sc.score) AS '不及人数'
#根据成绩以0或1计数,来除以信息总条数
FROM course c,sc
WHERE c.Cid=sc.Cid
GROUP BY c.Cid
#先绑定数据,再分组

19、查询各科成绩前三名的记录

19-1. 效果图
在这里插入图片描述
19-2. SQL语句

SELECT * 
FROM (SELECT *,Row_Number() OVER(ORDER BY sc.cid ORDER BY score DESC) AS graderank FROM sc) A 
WHERE A.graderank <= 3

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

20-1. 效果图
在这里插入图片描述
20-2. SQL语句

SELECT stu.Sid,stu.Sname
FROM student stu,sc
WHERE stu.Sid=sc.Sid
#先绑定数据
GROUP BY sid
#根据学号分组
HAVING COUNT(sc.Cid)=2;
#对分组后的数据进行筛选

21、查询名字中含有「风」字的学生信息

21-1. 效果图
在这里插入图片描述
21-2. SQL语句

SELECT * FROM student WHERE sname LIKE '%风%'
#like 语法(%:代表任意个字符)

22、查询 1990 年出生的学生名单

22-1. 效果图
在这里插入图片描述
22-2. SQL语句

SELECT *
FROM student stu
WHERE YEAR(stu.Sage) = 1990;
#year() 函数,得到日期中的年份

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

23-1. 效果图
在这里插入图片描述
23-2. SQL语句

SELECT stu.*,MAX(sc.score)
FROM student stu,sc
WHERE stu.Sid=sc.Sid
AND sc.Cid=(SELECT cid FROM course WHERE tid=(SELECT tid FROM teacher WHERE tname='张三') )
#首先得到张三教师的所授课的课程编号
#再筛选中成绩表中的相应课程。并取最大值
#同时最大值的课程编程所对应的学号与学生表要对应

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

24-1. 效果图
在这里插入图片描述
24-2. SQL语句

select * from (
    select *, DENSE_RANK() over (order by score desc) A
    from SC
    where Cid = (select Cid from Course where Tid=(select Tid from Teacher where Tname='张三'))
) B
where B.A=1
————————————————
版权声明:本文为CSDN博主「廖致君」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/paul0127/article/details/82529216

25、查询各学生的年龄,只按年份来算

25-1. 效果图
在这里插入图片描述
25-2. SQL语句

SELECT stu.Sname,(YEAR(NOW())-YEAR(stu.Sage)) AS '年龄'
FROM student stu
#当前年份,减去学生表中日期列的年份

26、按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一

26-1. 效果图
在这里插入图片描述
26-2. SQL语句

SELECT sname, TIMESTAMPDIFF(YEAR, sage, NOW()) AS age FROM student
#时间差函数TIMESTAMPDIFF
#有参数设置,可以精确到天(DAY)、小时(HOUR),分钟(MINUTE)和秒(SECOND)

27、查询本周过生日的学生

27-1. 效果图
在这里插入图片描述
27-2. SQL语句

SELECT * FROM student WHERE WEEK(NOW()) = WEEK(sage)
#王菊数据被修改为01-22
#SELECT WEEK(NOW()) —— 3

28、查询下周过生日的学生

28-1. 效果图
在这里插入图片描述
28-2. SQL语句

select * from student where (week(now())+1) = week(sage)
#此处王菊信息被修改为 01-30
#SELECT WEEK(NOW()) —— 3

29、 查询本月过生日的学生

29-1. 效果图
在这里插入图片描述
29-2. SQL语句

select * from student where month(now()) = month(sage)
#month函数,获取参数日期中的月份
#SELECT(MONTH(NOW())) —— 1

30、查询下月过生日的学生

30-1. 效果图
在这里插入图片描述
30-2. SQL语句

select * from student where (month(now())+1) = month(sage)
#month函数,获取参数日期中的月份
#SELECT(MONTH(NOW())) —— 1
#此处的王菊信息被修改为 02-01

猜你喜欢

转载自blog.csdn.net/ice_debj/article/details/103960555
今日推荐