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

50道SQL经典练习题

学生表 Student

create table Student(SId varchar(10),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-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' , '女');

科目表 Course

create table Course(CId varchar(10),Cname nvarchar(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' , '王五');

成绩表 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);

练习题目

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

    SELECT s.*, a.score AS score_01, b.score AS score_02
    FROM Student s
    JOIN SC a ON s.SId = a.SId AND a.CId = '01'
    JOIN SC b ON s.SId = b.SId AND b.CId = '02'
    WHERE a.score > b.score;
    
  2. 查询同时存在" 01 “课程和” 02 "课程的情况

    SELECT s.*
    FROM Student s
    JOIN SC a ON s.SId = a.SId AND a.CId = '01'
    JOIN SC b ON s.SId = b.SId AND b.CId = '02';
    
  3. 查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )

    SELECT s.*, a.score AS score_01, b.score AS score_02
    FROM Student s
    JOIN SC a ON s.SId = a.SId AND a.CId = '01'
    LEFT JOIN SC b ON s.SId = b.SId AND b.CId = '02';
    
  4. 查询不存在" 01 “课程但存在” 02 "课程的情况

    SELECT s.*
    FROM Student s
    JOIN SC b ON s.SId = b.SId AND b.CId = '02'
    LEFT JOIN SC a ON s.SId = a.SId AND a.CId = '01'
    WHERE a.SId IS NULL;
    
  5. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

    SELECT s.SId, s.Sname, AVG(sc.score) AS avg_score
    FROM Student s
    JOIN SC sc ON s.SId = sc.SId
    GROUP BY s.SId, s.Sname
    HAVING avg_score >= 60;
    
  6. 查询在 SC 表存在成绩的学生信息

    SELECT DISTINCT s.*
    FROM Student s
    JOIN SC ON s.SId = SC.SId;
    
  7. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

    SELECT s.SId, s.Sname, COUNT(sc.CId) AS total_courses, SUM(sc.score) AS total_score
    FROM Student s
    LEFT JOIN SC sc ON s.SId = sc.SId
    GROUP BY s.SId, s.Sname;
    
  8. 查有成绩的学生信息

    SELECT s.*
    FROM Student s
    WHERE EXISTS (SELECT 1 FROM SC WHERE SC.SId = s.SId);
    
  9. 查询「李」姓老师的数量

    SELECT COUNT(*) FROM Teacher WHERE Tname LIKE '李%';
    
  10. 查询学过「张三」老师授课的同学的信息

    SELECT s.*
    FROM Student s
    JOIN 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 = '张三';
    
  11. 查询没有学全所有课程的同学的信息

    SELECT s.*
    FROM Student s
    WHERE s.SId NOT IN (SELECT SId FROM SC GROUP BY SId HAVING COUNT(DISTINCT CId) = (SELECT COUNT(*) FROM Course)
    );
    
  12. 查询至少有一门课与学号为" 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';
    
  13. 查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息

    SELECT s.*
    FROM Student s
    WHERE s.SId IN (SELECT SId FROM SC WHERE SId != '01'GROUP BY SIdHAVING GROUP_CONCAT(CId ORDER BY CId) = (SELECT GROUP_CONCAT(CId ORDER BY CId) FROM SC WHERE SId = '01')
    );
    
  14. 查询没学过"张三"老师讲授的任一门课程的学生姓名

    SELECT Sname FROM Student
    WHERE SId NOT IN (SELECT DISTINCT SC.SId FROM SC JOIN Course ON SC.CId = Course.CIdJOIN Teacher ON Course.TId = Teacher.TIdWHERE Teacher.Tname = '张三'
    );
    
  15. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

    SELECT s.SId, s.Sname, AVG(sc.score) AS avg_score
    FROM Student s
    JOIN SC sc ON s.SId = sc.SId
    WHERE sc.score < 60
    GROUP BY s.SId, s.Sname
    HAVING COUNT(*) >= 2;
    
  16. 检索" 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;
    
  17. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

    SELECT s.SId, s.Sname, GROUP_CONCAT(sc.CId, ':', sc.score) AS scores,AVG(sc.score) AS avg_score
    FROM Student s
    LEFT JOIN SC sc ON s.SId = sc.SId
    GROUP BY s.SId, s.Sname
    ORDER BY avg_score DESC;
    
  18. 查询各科成绩最高分、最低分和平均分:

    SELECT c.CId, c.Cname,MAX(sc.score) AS max_score,MIN(sc.score) AS min_score,AVG(sc.score) AS avg_score,COUNT(*) AS enroll,CONCAT(ROUND(SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS pass_rate,CONCAT(ROUND(SUM(CASE WHEN score BETWEEN 70 AND 80 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS medium_rate,CONCAT(ROUND(SUM(CASE WHEN score BETWEEN 80 AND 90 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS good_rate,CONCAT(ROUND(SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS excellent_rate
    FROM SC sc
    JOIN Course c ON sc.CId = c.CId
    GROUP BY sc.CId
    ORDER BY enroll DESC, c.CId;
    
  19. 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率,及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90,

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

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

    SELECT SId, CId, score,RANK() OVER (PARTITION BY CId ORDER BY score DESC) AS rank
    FROM SC;
    
  21. 按各科成绩进行排序,并显示排名, Score 重复时合并名次

    SELECT SId, CId, score,DENSE_RANK() OVER (PARTITION BY CId ORDER BY score DESC) AS rank
    FROM SC;
    
  22. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺

    SELECT SId, total_score,RANK() OVER (ORDER BY total_score DESC) AS rank
    FROM (SELECT SId, SUM(score) AS total_score FROM SC GROUP BY SId) t;
    
  23. 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺

    SELECT SId, total_score,DENSE_RANK() OVER (ORDER BY total_score DESC) AS rank
    FROM (SELECT SId, SUM(score) AS total_score FROM SC GROUP BY SId) t;
    
  24. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比

    SELECT c.CId, c.Cname,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS `85-100`,SUM(CASE WHEN score BETWEEN 70 AND 84 THEN 1 ELSE 0 END) AS `70-84`,SUM(CASE WHEN score BETWEEN 60 AND 69 THEN 1 ELSE 0 END) AS `60-69`,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS `<60`,CONCAT(ROUND(SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS `85-100%`,CONCAT(ROUND(SUM(CASE WHEN score BETWEEN 70 AND 84 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS `70-84%`,CONCAT(ROUND(SUM(CASE WHEN score BETWEEN 60 AND 69 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS `60-69%`,CONCAT(ROUND(SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS `<60%`
    FROM SC sc
    JOIN Course c ON sc.CId = c.CId
    GROUP BY sc.CId;
    
  25. 查询各科成绩前三名的记录

    SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY CId ORDER BY score DESC) AS rankFROM SC
    ) t WHERE rank <= 3;
    
  26. 查询每门课程被选修的学生数

    SELECT CId, COUNT(DISTINCT SId) AS num
    FROM SC
    GROUP BY CId;
    
  27. 查询出只选修两门课程的学生学号和姓名

    SELECT s.SId, s.Sname
    FROM Student s
    JOIN SC ON s.SId = SC.SId
    GROUP BY s.SId
    HAVING COUNT(*) = 2;
    
  28. 查询男生、女生人数

    SELECT Ssex, COUNT(*) FROM Student GROUP BY Ssex;
    
  29. 查询名字中含有「风」字的学生信息

    SELECT * FROM Student WHERE Sname LIKE '%风%';
    
  30. 查询同名同性学生名单,并统计同名人数

    SELECT Sname, Ssex, COUNT(*) AS count
    FROM Student
    GROUP BY Sname, Ssex
    HAVING count > 1;
    
  31. 查询 1990 年出生的学生名单

    SELECT * FROM Student WHERE YEAR(Sage) = 1990;
    
  32. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

    SELECT CId, AVG(score) AS avg_score
    FROM SC
    GROUP BY CId
    ORDER BY avg_score DESC, CId;
    
  33. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

    SELECT s.SId, s.Sname, AVG(sc.score) AS avg_score
    FROM Student s
    JOIN SC sc ON s.SId = sc.SId
    GROUP BY s.SId
    HAVING avg_score >= 85;
    
  34. 查询课程名称为「数学」,且分数低于 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;
    
  35. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)

    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;
    
  36. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数

    SELECT DISTINCT s.*
    FROM Student s
    JOIN SC ON s.SId = SC.SId
    WHERE SC.score > 70;
    
  37. 查询不及格的课程

    SELECT * FROM SC WHERE score < 60;
    
  38. 查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名

    SELECT s.SId, s.Sname
    FROM Student s
    JOIN SC ON s.SId = SC.SId
    WHERE SC.CId = '01' AND SC.score >= 80;
    
  39. 求每门课程的学生人数

    SELECT CId, COUNT(DISTINCT SId) FROM SC GROUP BY CId;
    
  40. 成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

    SELECT s.*, sc.score
    FROM SC sc
    JOIN Course c ON sc.CId = c.CId
    JOIN Teacher t ON c.TId = t.TId
    JOIN Student s ON sc.SId = s.SId
    WHERE t.Tname = '张三'
    ORDER BY sc.score DESC
    LIMIT 1;
    
  41. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

    SELECT s.*, sc.score
    FROM SC sc
    JOIN Course c ON sc.CId = c.CId
    JOIN Teacher t ON c.TId = t.TId
    JOIN Student s ON sc.SId = s.SId
    WHERE t.Tname = '张三' AND sc.score = (SELECT MAX(score) FROM SC JOIN Course ON SC.CId = Course.CId JOIN Teacher ON Course.TId = Teacher.TId WHERE Teacher.Tname = '张三'
    );
    
  42. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

    SELECT a.SId, a.CId, a.score
    FROM SC a
    JOIN SC b ON a.SId = b.SId AND a.CId <> b.CId AND a.score = b.score
    GROUP BY a.SId, a.CId, a.score;
    
  43. 查询每门功成绩最好的前两名

    SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY CId ORDER BY score DESC) AS rankFROM SC
    ) t WHERE rank <= 2;
    
  44. 统计每门课程的学生选修人数(超过 5 人的课程才统计)。

    SELECT CId, COUNT(*) AS num
    FROM SC
    GROUP BY CId
    HAVING num > 5;
    
  45. 检索至少选修两门课程的学生学号

    SELECT SId FROM SC GROUP BY SId HAVING COUNT(*) >= 2;
    
  46. 查询选修了全部课程的学生信息

    SELECT s.*
    FROM Student s
    WHERE (SELECT COUNT(DISTINCT CId) FROM SC WHERE SC.SId = s.SId) = (SELECT COUNT(*) FROM Course);
    
  47. 查询各学生的年龄,只按年份来算

    SELECT SId, YEAR(NOW()) - YEAR(Sage) AS age FROM Student;
    
  48. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一

    SELECT SId, TIMESTAMPDIFF(YEAR, Sage, NOW()) - (DATE_FORMAT(NOW(), '%m%d') < DATE_FORMAT(Sage, '%m%d')) AS age
    FROM Student;
    
  49. 查询本周过生日的学生

    SELECT * FROM Student
    WHERE WEEKOFYEAR(Sage) = WEEKOFYEAR(NOW());
    
  50. 查询下周过生日的学生

    SELECT * FROM Student
    WHERE WEEKOFYEAR(Sage) = WEEKOFYEAR(NOW()) + 1;
    
  51. 查询本月过生日的学生

    SELECT * FROM Student WHERE MONTH(Sage) = MONTH(NOW());
    
  52. 查询下月过生日的学生

    SELECT * FROM Student 
    WHERE MONTH(Sage) = MONTH(NOW()) + 1 OR (MONTH(NOW()) = 12 AND MONTH(Sage) = 1);
    

相关文章:

  • 如何通过API获取淘宝评论?实战讲解
  • JVM面试题学习
  • JumpServer多用户VNC桌面配置指南:实现多端口远程访问
  • 互联网大厂Java面试:Spring Cloud与微服务的奇妙之旅
  • Canvas教程002—canvas上下文对象与浏览器支持
  • 字符串拼接问题的最佳解决方案
  • 12.QT-Combo Box|Spin Box|模拟点餐|从文件中加载选项|调整点餐份数(C++)
  • Java学习手册:HTTP 协议基础知识
  • SQL Server基础
  • 240421 leetcode exercises
  • 分数线降低,25西电马克思主义学院(考研录取情况)
  • leetcode day 35 01背包问题 416+1049
  • 智能安全用电系统预防电气线路老化、线路或设备绝缘故障
  • 开箱即用:一款带世界时钟简约好用在线时间戳转换工具源码
  • 【PCB绘制】信号完整性准则
  • 【PCIE730】基于PCIe总线架构的4路10G光纤通道适配器
  • SpringCloud和SpringCloudAlibaba技术栈全面对比
  • 基于STC89C52RC和8X8点阵屏、独立按键的小游戏《打砖块》
  • 海外服务器安装Ubuntu 22.04图形界面并配置VNC远程访问指南
  • 【工具使用-数据库】MySQL数据库创建和使用
  • 世界读书日|全城书香,上海“全民阅读”正在进行时
  • 专访|松重丰:“美食家”不孤独,他在自由地吃饭
  • AI时代教育如何变革?上海首批 “标准化家长学校”出炉
  • 解除近70家煤电厂有毒物质排放限制,特朗普能重振煤炭吗?
  • 四川省委统战部副部长(正厅级)张荣履新峨眉电影集团“一把手”
  • 东航推出“上博号”班机,上博设立“东航特展厅”