Bootstrap

SQL经典50题

目录

建库建表

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

第2题:查询"01"课程比"02"课程成绩低的学生的信息及课程分数

第3题:查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

第4题:查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

第5题:查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

第6题:查询"李"姓老师的数量

第7题:查询学过"张三"老师授课的同学的信息

第8题:查询没学过"张三"老师授课的同学的信息

第9题:查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

第10题:查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

第11题:查询没有学全所有课程的同学的信息

第12题:查询至少有一门课与学号为"01"的同学所学相同的同学的信息

第13题:查询和"01"号的同学学习的课程完全相同的其他同学的信息(重难点!!!)

第14题:查询没学过"张三"老师讲授的任一门课程的学生姓名

第15题:查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

第16题:检索"01"课程分数小于60,按分数降序排列的学生信息

第17题:按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩——流程控制函数

第18题:查询各科成绩最高分、最低分和平均分

第19题:按各科成绩进行排序,并显示排名——开窗函数

1.无论分数是否相同,都延后排序 

2.分数相同时,排名跳跃 

3.分数相同时,排名不跳跃 

第20题:查询学生的总成绩并进行排名

1.无论分数是否相同,都延后排序 

2.分数相同时,排名跳跃 

3.分数相同时,排名不跳跃

第21题:查询不同老师所教不同课程平均分从高到低显示

1.无论分数是否相同,都延后排序  

2.分数相同时,排名跳跃  

3.分数相同时,排名不跳跃 

第22题:查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

第23题:统计各科成绩各分数段人数

第24题:查询学生平均成绩及其名次

1.平均分相同时,名次顺延

2.平均分相同时,名次跳跃

3.平均分相同时,名次不跳跃

第25题:查询各科成绩前三名的记录

1.无论分数是否相同,都延后排序   

2.分数相同,排名跳跃

3.分数相同,排名不跳跃

第26题:查询每门课程被选修的学生数

第27题:查询出只有两门课程的全部学生的学号和姓名

第28题:查询男生、女生人数

第29题:查询名字中含有"风"字的学生信息

第30题:查询同名同性学生名单,并统计同名人数

第31题:查询1990年出生的学生名单

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

第33题:查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

第34题:查询课程名称为"数学",且分数低于60的学生姓名和分数

第35题:查询所有学生的课程及分数情况

第36题:查询任何一门课程成绩在70分以上的姓名、课程名称和分数

第37题:查询不及格的课程

第38题:查询课程编号为01且课程成绩在80分以上的学生的学号和姓名

第39题:求每门课程的学生人数

第40题:查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩

第41题:查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

第42题:查询每门功课成绩最好的前两名

第43题:统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

第44题:检索至少选修两门课程的学生学号

第45题:查询选修了全部课程的学生信息

第46题:查询各学生的年龄

第47题:查询本周过生日的学生

第48题:查询下周过生日的学生

第49题:查询本月过生日的学生

第50题:查询下月过生日的学生


建库建表

CREATE DATABASE students;
USE students;
/*
创建表
--1.学生表
Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
--2.课程表
Course(CID,Cname,TID) --CID --课程编号,Cname 课程名称,TID 教师编号
--3.教师表
Teacher(TID,Tname) --TID 教师编号,Tname 教师姓名
--4.成绩表
SC(SID,CID,score) --SID 学生编号,CID 课程编号,score 分数
*/

ALTER DATABASE students CHARACTER SET utf8;

CREATE TABLE student
(
    SID   VARCHAR(10),
    Sname VARCHAR(20),
    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', '女');

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');

CREATE TABLE Teacher
(
    TID   VARCHAR(10),
    Tname VARCHAR(10)
);
INSERT INTO Teacher
VALUES ('01', '张三');
INSERT INTO Teacher
VALUES ('02', '李四');
INSERT INTO Teacher
VALUES ('03', '王五');

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);

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

#方法一:推荐
SELECT STU.*,
       S.CID,
       S.score,
       S1.CID,
       S1.score
FROM SC S
         LEFT JOIN SC S1 ON S.SID = S1.SID
    AND S.CID = '01' AND S1.CID = '02'
         LEFT JOIN student STU ON STU.SID = S.SID
WHERE S.score > S1.score;


#方法二:
SELECT STU.*,
       SC1.CID,
       SC1.score,
       SC2.CID,
       SC2.score
FROM SC SC1
         JOIN SC SC2 ON SC1.SId = SC2.SId
    AND SC1.CId = '01' AND SC2.CId = '02'
LEFT JOIN student STU ON STU.SID=SC1.SID
HAVING SC1.score > SC2.score;

# 方法三:(推荐)
select *
from sc s1
         join sc s2 on s1.SID = s2.SID
    and s1.CID = '01' and s2.CID = '02'
    and s1.score > s2.score
         join student s on s1.SID = s.SID;

第2题:查询"01"课程比"02"课程成绩低的学生的信息及课程分数

这里我们要考虑某些学生未修“01”课程,但是修了“02”课程的情况,使用ifnull函数将null记为0

select stu.*,
       s.score
from student stu
left join SC S on stu.SID = S.SID and s.CID='01'
left join sc s1 on stu.SID=s1.SID and s1.CID='02'
where ifnull(s.score,0)<ifnull(s1.score,0);

第3题:查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

# 先查询平均成绩大于等于60分的同学的学生编号
SELECT S.SID, STU.Sname, AVG(S.score) avg_score
FROM SC S
         LEFT JOIN student STU ON STU.SID = S.SID
GROUP BY S.SID, STU.Sname
HAVING avg_score >= 60;

SELECT S.SID, STU.Sname, AVG(S.score) avg_score
FROM student STU
         LEFT JOIN SC S on STU.SID = S.SID
group by S.SID, STU.Sname
HAVING avg_score >= 60;

第4题:查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

SELECT S.SID, STU.Sname, AVG(S.score) avg_score
FROM SC S
         LEFT JOIN student STU ON STU.SID = S.SID
GROUP BY S.SID, STU.Sname
HAVING avg_score < 60;

SELECT S.SID, STU.Sname, AVG(S.score) avg_score
FROM student STU
         LEFT JOIN SC S on STU.SID = S.SID
GROUP BY S.SID, STU.Sname
HAVING avg_score < 60;

第5题:查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

这里注意要以student为主表,左外连接,因为有的学生可能没有选课

SELECT STU.SID,
       STU.Sname,
       COUNT(S.CID) 选课总数,
       SUM(S.score) 总成绩
FROM student STU
         LEFT JOIN SC S on STU.SID = S.SID
GROUP BY STU.SID, STU.Sname;

或者,也可以将一门课未选的学生成绩设为0

select stu.SID                 学生编号,
       stu.Sname               学生姓名,
       ifnull(count(s.CID), 0) 选课总数,
       ifnull(sum(s.score), 0) 总成绩
from student stu
         left join SC S on stu.SID = S.SID
group by stu.SID, stu.Sname;

第6题:查询"李"姓老师的数量

select count(t.TID) 李姓老师的数量
from Teacher t
where t.Tname like '李%';

第7题:查询学过"张三"老师授课的同学的信息

# 方法一:
select stu.*,t.Tname
from student stu
left join SC S on stu.SID = S.SID
left join Course C on S.CID = C.CID
left join Teacher T on C.TID = T.TID
where t.Tname='张三';

# 方法二:
SELECT STU.*
FROM teacher T
         INNER JOIN Course C on T.TID = C.TID AND T.Tname='张三'
LEFT JOIN SC S on C.CID = S.CID
LEFT JOIN student STU ON STU.SID=S.SID;

# 方法三:不推荐!!!效率低
SELECT TID
FROM teacher
WHERE Tname = '张三';

SELECT CID
FROM Course
WHERE TID IN (SELECT TID
              FROM teacher
              WHERE Tname = '张三');

SELECT SID
FROM SC
WHERE CID IN (SELECT CID
              FROM Course
              WHERE TID IN (SELECT TID
                            FROM teacher
                            WHERE Tname = '张三'));

SELECT *
FROM student
WHERE SID IN (SELECT SID
              FROM SC
              WHERE CID IN (SELECT CID
                            FROM Course
                            WHERE TID IN (SELECT TID
                                          FROM teacher
                                          WHERE Tname = '张三')));

第8题:查询没学过"张三"老师授课的同学的信息

# 方法一:
SELECT *
FROM (SELECT STU.*
      FROM teacher T
               JOIN Course C on T.TID = C.TID
          AND T.Tname = '张三'
               LEFT JOIN SC S on C.CID = S.CID
               LEFT JOIN student STU ON STU.SID = S.SID
      ORDER BY STU.SID) T
         RIGHT JOIN student ST ON ST.SID = T.SID
WHERE T.SID IS NULL;

# 方法二:
SELECT st.*
FROM student ST
         LEFT JOIN (SELECT STU.*
                    FROM teacher T
                             JOIN Course C on T.TID = C.TID
                        AND T.Tname = '张三'
                             LEFT JOIN SC S on C.CID = S.CID
                             LEFT JOIN student STU ON STU.SID = S.SID
                    ORDER BY STU.SID) T ON ST.SID = T.SID
WHERE T.SID IS NULL;

第9题:查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

# 方法一:
SELECT STU.*
FROM SC S1
         INNER JOIN SC S2 ON S1.SID = S2.SID AND S1.CID = '01' AND S2.CID = '02'
         LEFT JOIN student STU on S1.SID = STU.SID;

# 方法二:
SELECT STU.*
FROM student STU
         INNER JOIN SC S1 ON STU.SID = S1.SID AND S1.CID = '01'
         INNER JOIN SC S2 ON STU.SID = S2.SID AND S2.CID = '02' AND S1.SID = S2.SID;

# 方法三:
select stu.*
from student stu
left join SC s1 on stu.SID = s1.SID and s1.CID='01'
left join sc s2 on s1.SID=s2.SID and s2.CID='02'
where s1.CID != s2.CID;

第10题:查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

# 方法一:
SELECT S.*
FROM SC S1
         LEFT JOIN SC S2 ON S1.SID = S2.SID
    AND S1.CID = '01' AND S2.CID = '02'
         LEFT JOIN student s on S1.SID = s.SID
WHERE S1.CID = '01'
  AND S2.CID IS NULL;


# 方法二:
SELECT S.*
FROM SC S1
         LEFT JOIN student s on S1.SID = s.SID
WHERE S1.CID = '01'
  AND S1.SID NOT IN (SELECT SID
                     FROM SC
                     WHERE CID = '02');

# 方法三:
SELECT s.*
FROM SC
         LEFT JOIN student s on SC.SID = s.SID
WHERE CID = '01'
HAVING SID NOT IN (SELECT SID
                   FROM SC
                   WHERE CID = '02');

# 方法四:
/* 代码思路:这里利用了行转列的方法
*  如果不止这3门课程,
*  第三个case when后面的值可以写除课程'01'和课程'02'的任意其他课程,
*  只要case when的个数超过2门课程数即可*/
select stu.*
from (select t.SID,
             max(t.`01`) cid_01,
             max(t.`02`) cid_02,
             max(t.`06`) cid_06
      from (
               select sid,
                      case when CID = '01' then CID else 0 end as '01',
                      case when CID = '02' then CID else 0 end as '02',
                      case when CID = '06' then CID else 0 end as '06'
               from SC) t
      group by t.SID
      having cid_01 = '01'
         and cid_02 != '02') t2
         left join student stu on stu.SID = t2.SID;

第11题:查询没有学全所有课程的同学的信息

# 课程总数
SELECT COUNT(CID)
FROM Course;

# 小于课程总数的学生信息
select stu.sid,
       stu.Sname,
       stu.Sage,
       stu.Ssex,
       count(s.CID)  每名学生选课总数,
       (select count(CID)
        from course) 选课总数
from student stu
         left join SC S on stu.SID = S.SID
         left join Course C on S.CID = C.CID
group by stu.sid, stu.Sname, stu.Sage, stu.Ssex
having count(s.CID) < (select count(CID)
                       from course);

第12题:查询至少有一门课与学号为"01"的同学所学相同的同学的信息

# 其他学生所学的课程CID中,只要有一个在'01'同学的CID中就符合条件
# 先查询'01'同学学了哪些课程
select CID
from sc
where SID = '01';
# 以sc表为基准,这样可以迅速排除一门课程为选修的学生

# 方法一:
SELECT DISTINCT STU.*
FROM SC S
LEFT JOIN student STU on S.SID = STU.SID
WHERE STU.SID != '01' AND S.CID IN(SELECT S.CID
    FROM SC WHERE SID = '01');

# 方法二:
SELECT STU.SID, STU.Sname,STU.Sage,STU.Ssex
FROM SC S
         LEFT JOIN student STU on S.SID = STU.SID
WHERE STU.SID != '01'
  AND S.CID IN (SELECT CID
                FROM SC
                WHERE SID = '01')
GROUP BY STU.SID, STU.Sname,STU.Sage,STU.Ssex;

第13题:查询和"01"号的同学学习的课程完全相同的其他同学的信息(重难点!!!)

# 查询01同学学习的课程CID
SELECT CID
FROM SC
WHERE SID = '01';

SELECT S1.*, S2.*
FROM SC S1
         LEFT JOIN SC S2 ON S1.CID = S2.CID
    AND S1.SID != '01' AND S2.SID = '01';
# 可能会出现某个学生所学课程中,虽然有三门课程与01学生所学的一样,但是比01多学的课程也不符合条件
# 求出非01学生学习的课程数
SELECT S1.SID, COUNT(S1.CID)
FROM SC S1
         LEFT JOIN SC S2 ON S1.CID = S2.CID
    AND S1.SID != '01' AND S2.SID = '01'
WHERE S1.SID != '01'
GROUP BY S1.SID;


# 下条语句查询出所学课程比01学生多的情况
# 我们可以加一条数据,方便查看
insert into sc
values ('02', '04', 100);

SELECT S1.SID
FROM SC S1
         LEFT JOIN SC S2 ON S1.CID = S2.CID
    AND S1.SID != '01' AND S2.SID = '01'
WHERE S1.SID != '01'
  AND S2.SID IS NULL;

# 下条语句查询出所学课程数量比01学生少的情况,也是不符合条件的
SELECT S1.SID,
       COUNT(S1.CID) SNUM # 除了01学的数量
FROM SC S1
         LEFT JOIN SC S2 ON S1.CID = S2.CID
    AND S1.SID != '01' AND S2.SID = '01'
WHERE S1.SID != '01'
  AND S2.SID IS NOT NULL
GROUP BY S1.SID
HAVING SNUM != (SELECT COUNT(CID)
                FROM SC
                WHERE SID = '01');

第14题:查询没学过"张三"老师讲授的任一门课程的学生姓名

反向查找:找出学过张三老师所有课程的学生的SID,把他排除掉,剩下的就是符合条件的

select t2.Sname
from (
         select stu.SID stu_sid,
                stu.Sname,
                stu.Sage,
                stu.Ssex,
                t1.SID  t1_sid
             /*t1.CID,
             t1.score*/
         from student stu
                  left join (
             select *
             from sc s
             where s.CID in (select c.CID
                             from teacher t
                                      left join Course C on t.TID = C.TID
                             where t.Tname = '张三')) t1
                            on stu.SID = t1.SID
         having t1_sid is null
         ORDER BY t1_sid) t2;

# 以下代码可以忽略!!!
# 考虑张三老师可能教多门学科的情况,只要有没学过张三老师的任意一门课程就符合条件,完全没学过也符合条件
SELECT DISTINCT S1.SID
FROM SC S1
         INNER JOIN SC S2 ON S1.SID = S2.SID AND S1.CID != S2.CID
WHERE S1.CID IN (SELECT C.CID
                 FROM Teacher T
                          LEFT JOIN Course C on T.TID = C.TID
                 WHERE T.Tname = '张三')
  AND S2.CID IN (SELECT C.CID
                 FROM Teacher T
                          LEFT JOIN Course C on T.TID = C.TID
                 WHERE T.Tname = '张三');


# 方法一:
SELECT STU.Sname
FROM student STU
         LEFT JOIN (SELECT DISTINCT S1.SID
                    FROM SC S1
                             INNER JOIN SC S2 ON S1.SID = S2.SID AND S1.CID != S2.CID
                    WHERE S1.CID IN (SELECT C.CID
                                     FROM Teacher T
                                              LEFT JOIN Course C on T.TID = C.TID
                                     WHERE T.Tname = '张三')
                      AND S2.CID IN (SELECT C.CID
                                     FROM Teacher T
                                              LEFT JOIN Course C on T.TID = C.TID
                                     WHERE T.Tname = '张三')) T ON T.SID = STU.SID
WHERE T.SID IS NULL;

# 方法二:
SELECT STU.Sname
FROM student STU
WHERE STU.SID NOT IN (SELECT DISTINCT S1.SID
                      FROM SC S1
                               INNER JOIN SC S2 ON S1.SID = S2.SID AND S1.CID != S2.CID
                      WHERE S1.CID IN (SELECT C.CID
                                       FROM Teacher T
                                                LEFT JOIN Course C on T.TID = C.TID
                                       WHERE T.Tname = '张三')
                        AND S2.CID IN (SELECT C.CID
                                       FROM Teacher T
                                                LEFT JOIN Course C on T.TID = C.TID
                                       WHERE T.Tname = '张三'));

第15题:查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

# 查询所有不及格的SID,不及格数课程数量>=2
SELECT S.SID, STU.Sname, AVG(S.score) avg_score
FROM SC S
         LEFT JOIN student STU on S.SID = STU.SID
WHERE S.score < 60
GROUP BY S.SID, STU.Sname
HAVING COUNT(S.score) >= 2;

第16题:检索"01"课程分数小于60,按分数降序排列的学生信息

# 注意:1.未参加01科目的考试的学生
#     2.01考试成绩为NULL
#     3.01成绩中有不及格的 
select t.sid,
       t.sname,
       t.Sage,
       t.Ssex
from (
         select stu.*,
                ifnull(s.CID, '01') c_cid,
                ifnull(s.score, 0)  c_score
         from student stu
                  left join SC S on stu.SID = S.SID
         having c_cid = '01'
            and c_score < 60
         order by c_score desc) t;

第17题:按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩——流程控制函数

select stu.SID,
       stu.Sname,
       round(avg(ifnull(s.score, 0)), 1) 平均分,
       ifnull(t_语文, 0)                   语文,
       ifnull(t_数学, 0)                   数学,
       ifnull(t_英语, 0)                   英语

from student stu
         left join SC S on stu.SID = S.SID
         left join (select t.SID,
                           max(t.`01`) t_语文,
                           max(t.`02`) t_数学,
                           max(t.`03`) t_英语
                    from (select sc.SID,
                                 case when sc.CID = '01' then sc.score else 0 end as '01',
                                 case when sc.CID = '02' then sc.score else 0 end as '02',
                                 case when sc.CID = '03' then sc.score else 0 end as '03'
                          from sc
                                   left join course c on SC.CID = c.CID) t
                    group by t.SID) t2 on t2.SID = stu.SID
group by stu.SID, stu.Sname, t2.t_语文, t2.t_数学, t2.t_英语;

第18题:查询各科成绩最高分、最低分和平均分

以如下形式显示:

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

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

SELECT S.CID,
       C.Cname,
       MAX(score)                                                                                              最高分,
       MIN(score)                                                                                              最低分,
       AVG(score)                                                                                              平均分,
       CONCAT(ROUND(100 * SUM(CASE WHEN score >= 60 and score < 70 then 1 else 0 end) / COUNT(score), 2), '%') 及格率,
       CONCAT(ROUND(100 * SUM(CASE WHEN score >= 70 and score < 80 then 1 else 0 end) / COUNT(score), 2), '%') 中等率,
       CONCAT(ROUND(100 * SUM(CASE WHEN score >= 80 and score < 90 then 1 else 0 end) / COUNT(score), 2), '%') 优良率,
       CONCAT(ROUND(100 * SUM(CASE WHEN score >= 90 then 1 else 0 end) / COUNT(score), 2), '%')                优秀率
FROM SC S
         LEFT JOIN Course C on S.CID = C.CID
GROUP BY S.CID, C.Cname;

第19题:按各科成绩进行排序,并显示排名——开窗函数

1.无论分数是否相同,都延后排序 

select c.Cname, s.score, row_number() over (order by s.score desc ) as 语文排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '语文';
select c.Cname, s.score, row_number() over (order by s.score desc ) as 数学排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '数学';
select c.Cname, s.score, row_number() over (order by s.score desc ) as 英语排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '英语';

select ifnull(t1.score,0) 语文,
       ifnull(t2.score,0) 数学,
       ifnull(t3.score,0) 英语,
       t1.语文排名  成绩排名
from (select c.Cname, s.score, row_number() over (order by s.score desc ) as 语文排名
      from sc s
               left join course c on s.CID = c.CID
      where c.Cname = '语文') t1
         left join (select c.Cname, s.score, row_number() over (order by s.score desc ) as 数学排名
                    from sc s
                             left join course c on s.CID = c.CID
                    where c.Cname = '数学') t2 on t1.语文排名 = t2.数学排名
         left join (select c.Cname, s.score, row_number() over (order by s.score desc ) as 英语排名
                    from sc s
                             left join course c on s.CID = c.CID
                    where c.Cname = '英语') t3 on t1.语文排名 = t3.英语排名;

2.分数相同时,排名跳跃 

select c.Cname, s.score, rank() over (order by s.score desc) as 语文排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '语文';
select c.Cname, s.score, rank() over (order by s.score desc) as 数学排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '数学';
select c.Cname, s.score, rank() over (order by s.score desc) as 英语排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '英语';

select ifnull(t1.score,0) 语文,
       ifnull(t2.score,0) 数学,
       ifnull(t3.score,0) 英语,
       t1.语文排名 排名
from (select c.Cname, s.score, rank() over (order by s.score desc) as 语文排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '语文') t1
left join (select c.Cname, s.score, rank() over (order by s.score desc) as 数学排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '数学') t2 on t1.语文排名=t2.数学排名
left join (select c.Cname, s.score, rank() over (order by s.score desc) as 英语排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '英语') t3 on t1.语文排名=t3.英语排名;

3.分数相同时,排名不跳跃 

select C.Cname, S.score, dense_rank() over (order by s.score desc) as 语文排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '语文';
select C.Cname, S.score, dense_rank() over (order by s.score desc) as 数学排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '数学';
select C.Cname, S.score, dense_rank() over (order by s.score desc) as 英语排名
from sc s
         left join course c on s.CID = c.CID
where c.Cname = '英语';

select ifnull(t1.score,0) 语文,
       ifnull(t2.score,0) 数学,
       ifnull(t3.score,0) 英语,
       t1.语文排名  排名
from (select C.Cname, S.score, dense_rank() over (order by s.score desc) as 语文排名
      from sc s
               left join course c on s.CID = c.CID
      where c.Cname = '语文') t1
         left join (select C.Cname, S.score, dense_rank() over (order by s.score desc) as 数学排名
                    from sc s
                             left join course c on s.CID = c.CID
                    where c.Cname = '数学') t2 on t1.语文排名 = t2.数学排名
         left join (select C.Cname, S.score, dense_rank() over (order by s.score desc) as 英语排名
                    from sc s
                             left join course c on s.CID = c.CID
                    where c.Cname = '英语') t3 on t3.英语排名 = t1.语文排名;

第20题:查询学生的总成绩并进行排名

1.无论分数是否相同,都延后排序 

select stu.SID,
       stu.Sname,
       stu.Sage,
       stu.Ssex,
       sum(ifnull(s.score, 0)) 总成绩,
       row_number() over (order by sum(ifnull(s.score, 0)) desc ) 总成绩排名
from student stu
         left join SC S on stu.SID = S.SID
group by stu.SID, stu.Sname, stu.Sage, stu.Ssex;

2.分数相同时,排名跳跃 

select stu.SID,
       stu.Sname,
       stu.Sage,
       stu.Ssex,
       sum(ifnull(s.score, 0)) 总成绩,
       rank() over (order by sum(ifnull(s.score, 0)) desc ) 总成绩排名
from student stu
         left join SC S on stu.SID = S.SID
group by stu.SID, stu.Sname, stu.Sage, stu.Ssex;

3.分数相同时,排名不跳跃

select stu.SID,
       stu.Sname,
       stu.Sage,
       stu.Ssex,
       sum(ifnull(s.score, 0)) 总成绩,
       dense_rank() over (order by sum(ifnull(s.score, 0)) desc ) 总成绩排名
from student stu
         left join SC S on stu.SID = S.SID
group by stu.SID, stu.Sname, stu.Sage, stu.Ssex;

此题目的运行结果都一样:

第21题:查询不同老师所教不同课程平均分从高到低显示

1.无论分数是否相同,都延后排序  

select t.Tname,
       c.CID,
       round(avg(ifnull(s.score,0)),2) avg_score,
       row_number() over (order by avg(ifnull(s.score,0)) desc) 平均分排名
from teacher t
         left join Course C on t.TID = C.TID
         left join SC S on C.CID = S.CID
group by t.Tname, c.CID,t.TID;

2.分数相同时,排名跳跃  

select t.Tname,
       c.CID,
       round(avg(ifnull(s.score,0)),2) avg_score,
       rank() over (order by avg(ifnull(s.score,0)) desc) 平均分排名
from teacher t
         left join Course C on t.TID = C.TID
         left join SC S on C.CID = S.CID
group by t.Tname, c.CID,t.TID;

3.分数相同时,排名不跳跃 

select t.Tname,
       c.CID,
       round(avg(ifnull(s.score,0)),2) avg_score,
       dense_rank() over (order by avg(ifnull(s.score,0)) desc) 平均分排名
from teacher t
         left join Course C on t.TID = C.TID
         left join SC S on C.CID = S.CID
group by t.Tname, c.CID,t.TID;

此题目运行结果一样:

第22题:查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

# 方法一的三种情况
SELECT *
FROM (
         SELECT STU.*,
                C.Cname,
                S.score,
                ROW_NUMBER() over (PARTITION BY S.CID ORDER BY S.score DESC) 排名
         FROM SC S
                  LEFT JOIN Course C on S.CID = C.CID
                  LEFT JOIN student STU on S.SID = STU.SID) T
WHERE T.排名 in (2, 3);

SELECT *
FROM (
         SELECT STU.*,
                C.Cname,
                S.score,
                RANK() over (PARTITION BY S.CID ORDER BY S.score DESC) 排名
         FROM SC S
                  LEFT JOIN Course C on S.CID = C.CID
                  LEFT JOIN student STU on S.SID = STU.SID) T
WHERE T.排名 in (2, 3);

SELECT *
FROM (
         SELECT STU.*,
                C.Cname,
                S.score,
                DENSE_RANK() over (PARTITION BY S.CID ORDER BY S.score DESC) 排名
         FROM SC S
                  LEFT JOIN Course C on S.CID = C.CID
                  LEFT JOIN student STU on S.SID = STU.SID) T
WHERE T.排名 in (2, 3);

# 方法二:
select *
from (
         select c.Cname,
                stu.SID,
                stu.Sname,
                stu.Sage,
                stu.Ssex,
                s.score,
                row_number() over (partition by c.CID order by s.score desc ) 排名
         from course c
                  left join SC S on c.CID = S.CID
                  left join student stu on S.SID = stu.SID) t
where t.排名 between 2 and 3;

# 方法三:
SELECT STU.*, C.CID, C.Cname
FROM student STU
         LEFT JOIN(
    (SELECT SID, CID, score
     FROM SC
     WHERE CID = '01'
     ORDER BY score DESC
     LIMIT 1,2)
    UNION
    (SELECT SID, CID, score
     FROM SC
     WHERE CID = '02'
     ORDER BY score DESC
     LIMIT 1,2)
    UNION
    (SELECT SID, CID, score
     FROM SC
     WHERE CID = '03'
     ORDER BY score DESC
     LIMIT 1,2)) T ON T.SID = STU.SID
         INNER JOIN Course C ON C.CID = T.CID;

根据不同的排名方式有不同的答案

另一种写法:

select t1.语文排名             成绩排名,
       ifnull(t1.score, 0) 语文,
       t1.SID              语文考生ID,
       t1.Sname            语文考生姓名,
       t1.Sage             语文考生出生年月日,
       t1.Ssex             性别,
       ifnull(t2.score, 0) 数学,
       t2.SID              数学考生ID,
       t2.Sname            数学考生姓名,
       t2.Sage             数学考生出生年月日,
       t2.Ssex             数学考生性别,
       ifnull(t3.score, 0) 英语,
       t3.SID              英语考生ID,
       t3.Sname            英语考生姓名,
       t3.Sage             英语考生出生年月日,
       t3.Ssex             英语考生性别
from (select stu.SID,
             stu.Sname,
             stu.Sage,
             stu.Ssex,
             c.Cname,
             s.score,
             row_number() over (order by s.score desc ) as 语文排名
      from sc s
               left join course c on s.CID = c.CID
               left join student stu on s.SID = stu.SID
      where c.Cname = '语文') t1
         left join (select stu.SID,
                           stu.Sname,
                           stu.Sage,
                           stu.Ssex,
                           c.Cname,
                           s.score,
                           row_number() over (order by s.score desc ) as 数学排名
                    from sc s
                             left join course c on s.CID = c.CID
                             left join student stu on s.SID = stu.SID
                    where c.Cname = '数学') t2 on t1.语文排名 = t2.数学排名
         left join (select stu.SID,
                           stu.Sname,
                           stu.Sage,
                           stu.Ssex,
                           c.Cname,
                           s.score,
                           row_number() over (order by s.score desc ) as 英语排名
                    from sc s
                             left join course c on s.CID = c.CID
                             left join student stu on s.SID = stu.SID
                    where c.Cname = '英语') t3 on t1.语文排名 = t3.英语排名
limit 1,2;

第23题:统计各科成绩各分数段人数

课程编号,课程名称, [100-85] , [85-70] , [70-60] , [0-60] 及所占百分比,参加考试的总人数

select c.CID        课程编号,
       c.Cname      课程名称,
       count(s.SID) 参考总人数,
       concat(round(100 * sum(case when s.score between 0 and 60 then 1 else 0 end) / count(s.score), 2),
              '%')  '[0,60]占比',
       concat(round(100 * sum(case when s.score between 0 and 60 then 1 else 0 end) / count(s.score), 2),
              '%')  '[0,60]占比',
       concat(round(100 * sum(case when s.score between 61 and 70 then 1 else 0 end) / count(s.score), 2),
              '%')  '[70-60]占比',
       concat(round(100 * sum(case when s.score between 71 and 85 then 1 else 0 end) / count(s.score), 2),
              '%')  '[85-70]占比',
       concat(round(100 * sum(case when s.score between 86 and 100 then 1 else 0 end) / count(s.score), 2),
              '%')  '[100-85]占比'
from course c
         left join SC S on c.CID = S.CID
group by c.CID, c.Cname;

第24题:查询学生平均成绩及其名次

1.平均分相同时,名次顺延

select stu.Sname,
       round(avg(ifnull(s.score,0)),2) avg_score,
       row_number() over (order by round(avg(ifnull(s.score,0)),2) desc ) 排名
from student stu
         left join SC S on stu.SID = S.SID
group by stu.Sname;

2.平均分相同时,名次跳跃

select stu.Sname,
       round(avg(ifnull(s.score,0)),2) avg_score,
       rank() over (order by round(avg(ifnull(s.score,0)),2) desc ) 排名
from student stu
         left join SC S on stu.SID = S.SID
group by stu.Sname;

3.平均分相同时,名次不跳跃

select stu.Sname,
       round(avg(ifnull(s.score,0)),2) avg_score,
       dense_rank() over (order by round(avg(ifnull(s.score,0)),2) desc ) 排名
from student stu
         left join SC S on stu.SID = S.SID
group by stu.Sname;

本题目三种排序方法运行结果一样:

第25题:查询各科成绩前三名的记录

1.无论分数是否相同,都延后排序   

select max(t2.语文) 语文成绩,
       max(t2.数学) 数学成绩,
       max(t2.英语) 英语成绩,
       t2.排名
from (
         select case when t.CID = '01' then t.score else 0 end as '语文',
                case when t.CID = '02' then t.score else 0 end as '数学',
                case when t.CID = '03' then t.score else 0 end as '英语',
                t.排名
         from (
                  select c.CID,
                         s.score,
                         row_number() over (partition by c.CID order by s.score desc ) 排名
                  from course c
                           left join SC S on c.CID = S.CID) t
     ) t2
group by t2.排名
limit 3;

2.分数相同,排名跳跃

select max(t2.语文) 语文成绩,
       max(t2.数学) 数学成绩,
       max(t2.英语) 英语成绩,
       t2.排名
from (
         select case when t.CID = '01' then t.score else 0 end as '语文',
                case when t.CID = '02' then t.score else 0 end as '数学',
                case when t.CID = '03' then t.score else 0 end as '英语',
                t.排名
         from (
                  select c.CID,
                         s.score,
                        rank() over (partition by c.CID order by s.score desc ) 排名
                  from course c
                           left join SC S on c.CID = S.CID) t
     ) t2
group by t2.排名
limit 3;

3.分数相同,排名不跳跃

select max(t2.语文) 语文成绩,
       max(t2.数学) 数学成绩,
       max(t2.英语) 英语成绩,
       t2.排名
from (
         select case when t.CID = '01' then t.score else 0 end as '语文',
                case when t.CID = '02' then t.score else 0 end as '数学',
                case when t.CID = '03' then t.score else 0 end as '英语',
                t.排名
         from (
                  select c.CID,
                         s.score,
                         dense_rank() over (partition by c.CID order by s.score desc ) 排名
                  from course c
                           left join SC S on c.CID = S.CID) t
     ) t2
group by t2.排名
limit 3;

扩展

# 每个学生的成绩从高到低
select s.*,
       row_number() over (partition by sid order by score desc) as rank2
from sc s;


# 每一科目成绩的前三名
select DISTINCT T.CID, score, 排名
from (
         select sid,
                cid,
                score,
                row_number() over (partition by cid order by sc.score desc) 排名
         from sc) t
where t.排名 <= 3;

# 每个科目的前三名,不区分SID
SELECT DISTINCT T.CID, T.score, T.排名
FROM (
         select *, dense_rank() over (PARTITION BY CID ORDER BY score DESC ) 排名
         from sc) T
WHERE T.排名 <= 3;

# 学生的平均分,找出平均分最高的前三名
SELECT s.SID,
       avg(s.score) avgscore,
       DENSE_RANK() over (ORDER BY AVG(S.score) DESC) 排名
FROM SC S
group by s.SID
limit 3;

第26题:查询每门课程被选修的学生数

SELECT C.Cname, COUNT(S.SID)
FROM SC S
         LEFT JOIN Course C on S.CID = C.CID
GROUP BY S.CID, C.Cname;

 

第27题:查询出只有两门课程的全部学生的学号和姓名

select stu.SID,
       stu.Sname,
       count(s.CID) 选修课程人数
from student stu
         left join SC S on stu.SID = S.SID
group by stu.SID,
         stu.Sname
having count(s.CID) = 2;

第28题:查询男生、女生人数

select Ssex, count(Ssex) 人数
from student
group by Ssex;

select sum(case when Ssex = '男' then 1 else 0 end) as '男生人数',
       sum(case when Ssex = '女' then 1 else 0 end) as '女生人数'
from student;

第29题:查询名字中含有"风"字的学生信息

SELECT *
FROM student
WHERE Sname LIKE '%风%';

第30题:查询同名同性学生名单,并统计同名人数

SELECT STU1.Sname,
       COUNT(STU1.Sname) 同名人数
FROM student STU1
         INNER JOIN student STU2
             ON STU1.Sname = STU2.Sname
            AND STU1.SID != STU2.SID
            AND STU1.Ssex = STU2.Ssex
GROUP BY STU1.Sname;

本表中没有符合条件的

# 由于原表中没有同名的数据,这里我们可以添加一条
insert into student
values ('09', '王菊', now(), '男'),
       ('10', '王菊', now(), '女');


select count(stu1.SID) 同名人数
from student stu1
         left join student stu2 on stu1.SID = stu2.SID
where stu1.Sname = stu2.Sname
  and stu1.Ssex = stu2.Ssex
group by stu1.Sname
having 同名人数 > 1;



# 这个题目还可以变化一下,
# 1、查询同名同姓的学生名单
# 2、统计同名的人数
# 3、两个结果显示在一张表中

第31题:查询1990年出生的学生名单

SELECT *
FROM student
WHERE Sage LIKE '1990%';

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

select c.CID,
       c.Cname,
       round(avg(ifnull(s.score, 0)), 2) avg_score
from course c
         left join SC S on c.CID = S.CID
group by c.CID, c.Cname
order by round(avg(ifnull(s.score, 0)), 2) desc,
         c.CID asc;

第33题:查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

select s2.SID,
       s2.Sname,
       round(avg(ifnull(s.score, 0)), 2) 平均成绩
from SC S
         left join student s2 on S.SID = s2.SID
group by s.SID, s2.Sname
having 平均成绩 >= 85;

 

第34题:查询课程名称为"数学",且分数低于60的学生姓名和分数

SELECT S2.Sname, S.score
FROM Course C
         LEFT JOIN SC S on C.CID = S.CID
         LEFT JOIN student s2 on S.SID = s2.SID
WHERE C.Cname = '数学'
  AND S.score < 60;

 

第35题:查询所有学生的课程及分数情况

SELECT STU.Sname, C.Cname, S.score
FROM student STU
         LEFT JOIN SC S on STU.SID = S.SID
         LEFT JOIN Course C on S.CID = C.CID;

另一种写法:

select stu.*,
       ifnull(t2.语文, 0) 语文成绩,
       ifnull(t2.数学, 0) 数学成绩,
       ifnull(t2.英语, 0) 英语成绩
from student stu
         left join (
    select t1.SID,
           max(t1.`01`) 语文,
           max(t1.`02`) 数学,
           max(t1.`03`) 英语
    from (
             select SID,
                    case when CID = '01' then score else 0 end as '01',
                    case when CID = '02' then score else 0 end as '02',
                    case when CID = '03' then score else 0 end as '03'
             from sc) t1
    group by t1.SID) t2 on stu.SID = t2.SID;

第36题:查询任何一门课程成绩在70分以上的姓名、课程名称和分数

# 每个学生的每门课程成绩>70
# 方法一:
SELECT STU.Sname,
       sum(case when s.CID = '01' then s.score else 0 end) as 语文,
       sum(case when s.CID = '02' then s.score else 0 end) as 数学,
       sum(case when s.CID = '03' then s.score else 0 end) as 英语
FROM student STU
         LEFT JOIN SC S on STU.SID = S.SID
         LEFT JOIN Course C on S.CID = C.CID
GROUP BY STU.Sname
HAVING 语文 > 70
   and 数学 > 70
   and 英语 > 70;

# 方法二:
select stu.Sname,
       ifnull(t2.语文, 0) 语文成绩,
       ifnull(t2.数学, 0) 数学成绩,
       ifnull(t2.英语, 0) 英语成绩
from student stu
         right join (
    select t1.SID,
           max(t1.`01`) 语文,
           max(t1.`02`) 数学,
           max(t1.`03`) 英语
    from (
             select SID,
                    case when CID = '01' then score else 0 end as '01',
                    case when CID = '02' then score else 0 end as '02',
                    case when CID = '03' then score else 0 end as '03'
             from sc
             where score > 70) t1
    group by t1.SID) t2 on stu.SID = t2.SID
having 语文成绩 > 70
   and 数学成绩 > 70
   and 英语成绩 > 70;

 

# 只要有一个学生的成绩>70就符合条件
select student.sname,course.cname,sc.score
from course
inner join sc ON course.cid = sc.cid
inner join student on sc.sid = student.sid
where sc.score > 70;

第37题:查询不及格的课程

# 方法一:
SELECT S.*, C.Cname,SC.score
FROM SC
         LEFT JOIN Course C on SC.CID = C.CID
         LEFT JOIN student s on SC.SID = s.SID
WHERE score < 60;

# 方法二:
select stu.Sname,
       ifnull(t2.语文, 0) 语文成绩,
       ifnull(t2.数学, 0) 数学成绩,
       ifnull(t2.英语, 0) 英语成绩
from student stu
         right join (
    select t1.SID,
           max(t1.`01`) 语文,
           max(t1.`02`) 数学,
           max(t1.`03`) 英语
    from (
             select SID,
                    case when CID = '01' then score else 0 end as '01',
                    case when CID = '02' then score else 0 end as '02',
                    case when CID = '03' then score else 0 end as '03'
             from sc
             where score <60) t1
    group by t1.SID) t2 on stu.SID = t2.SID;

第38题:查询课程编号为01且课程成绩在80分以上的学生的学号和姓名

SELECT S2.SID, s2.Sname
FROM SC S
         LEFT JOIN student s2 on S.SID = s2.SID
WHERE S.CID = '01'
  AND S.score > 80;

本题没有符合题意的结果:

第39题:求每门课程的学生人数

select c.Cname       课程名称,
       count(s2.SID) 学生人数
from course c
         left join SC S on c.CID = S.CID
         left join student s2 on S.SID = s2.SID
group by c.Cname;

第40题:查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩

select s2.*, s.score
from teacher t
         left join Course C on t.TID = C.TID
         left join SC S on C.CID = S.CID
         left join student s2 on S.SID = s2.SID
where t.Tname = '张三'
order by s.score desc
limit 1;

第41题:查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

select distinct s2.SID, s2.CID, s2.score
from sc s1
         left join sc s2 on s1.SID = s2.SID
where s1.CID != s2.CID
  and s1.score = s2.score;

第42题:查询每门功课成绩最好的前两名

方法一:

# 先用窗口函数将所有学生各科的成绩进行排名
SELECT STU.*,
       S.score,
       C.Cname,
       ROW_NUMBER() over (PARTITION BY S.CID ORDER BY S.score DESC) 排名
FROM student STU
         INNER JOIN SC S on STU.SID = S.SID
         INNER JOIN Course C on S.CID = C.CID;

SELECT *
FROM (SELECT STU.*,
             S.score,
             C.Cname,
             ROW_NUMBER() over (PARTITION BY S.CID ORDER BY S.score DESC) 排名
      FROM student STU
               INNER JOIN SC S on STU.SID = S.SID
               INNER JOIN Course C on S.CID = C.CID) T
WHERE T.排名 <= 2;

方法二:

select t1.SID,
       t1.Sname,
       t1.score 语文成绩,
       t2.SID,
       t2.Sname,
       t2.score 数学成绩,
       t3.SID,
       t3.Sname,
       t3.score 英语成绩,
       t1.排名    成绩排名
from (select s.SID,
             s.Sname,
             score,
             row_number() over (order by score desc ) '排名'
      from sc
               left join student s on SC.SID = s.SID
      where CID = '01') t1
         left join (select s.SID,
                           s.Sname,
                           score,
                           row_number() over (order by score desc ) '排名'
                    from sc
                             left join student s on SC.SID = s.SID
                    where CID = '02') t2 on t1.排名 = t2.排名
         left join (select s.SID,
                           s.Sname,
                           score,
                           row_number() over (order by score desc ) '排名'
                    from sc
                             left join student s on SC.SID = s.SID
                    where CID = '03') t3 on t1.排名 = t3.排名
limit 2;

第43题:统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

select CID        课程号,
       count(SID) 选修人数
from SC
group by CID
having 选修人数 > 5
order by 选修人数 desc,
         CID asc;

第44题:检索至少选修两门课程的学生学号

select SID,count(CID) 选修课程数
from sc
group by SID
having 选修课程数 >= 2;

第45题:查询选修了全部课程的学生信息

# 课程总数
SELECT COUNT(CID)
from Course c;

# 每个学生选修的课程数总和=课程总数
SELECT stu.sid, STU.Sname, STU.Sage, STU.Ssex
FROM student stu
         left join SC S on stu.SID = S.SID
group by stu.SID, STU.Sname, STU.Sage, STU.Ssex
HAVING count(s.CID) = (SELECT COUNT(CID)
                       from Course c);

第46题:查询各学生的年龄

假设计算虚岁——年份直接相减

select Sname, (YEAR(now()) - YEAR(Sage)) 年龄
from student;

假设计算周岁——按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一

SELECT STU.*,
       IF(MONTH(CURRENT_DATE) > MONTH(STU.Sage), YEAR(CURRENT_DATE) - YEAR(STU.Sage),
          YEAR(CURRENT_DATE) - YEAR(STU.Sage) - 1) 周岁
FROM student STU;

第47题:查询本周过生日的学生

查询今年和表中的Sage列的月、日相连,是否等于本周

SELECT *
FROM student
WHERE WEEK(CONCAT(YEAR(NOW()), '-', MID(Sage, 6, 5))) = WEEK(NOW());

select Sname
from student
where week(date_format(now(),'%Y-%m-%d'))=week(Sage);

select Sname
from student
where week(now())=week(Sage);

没有符合题意的答案

第48题:查询下周过生日的学生

# 写法一:
SELECT *
FROM student
WHERE (WEEK(DATE_FORMAT(NOW(), '%Y-%m-%d')) + 1) = week(Sage);

# 写法二:
select Sname
from student
where (week(now())+1)=week(Sage);

第49题:查询本月过生日的学生

SELECT *
FROM student
WHERE MONTH(NOW()) = MONTH(Sage);

SELECT *
FROM student
WHERE DATE_FORMAT(NOW(), '%m') = MONTH(Sage);

SELECT *
FROM student
WHERE MONTH(DATE_FORMAT(NOW(), '%Y%m%d')) = MONTH(Sage);

第50题:查询下月过生日的学生

select *
from student
where IF(DATE_FORMAT(NOW(), '%m') + 1 = 13, 1, DATE_FORMAT(NOW(), '%m') + 1) = MONTH(Sage);

SELECT *
FROM student
WHERE if(MONTH(DATE_FORMAT(NOW(), '%Y%m%d')) + 1 = 13, 1, MONTH(DATE_FORMAT(NOW(), '%Y%m%d')) + 1) = month(Sage);

;