虽然网上已经有很多相关资源,但是正确解答的优质资源并不太多,因此本篇文章将这50道题重新整理了一下,希望能给刚学习sql的童鞋一点帮助。

Student(S,Sname,Sage,Ssex) 学生表

Course(C,Cname,T) 课程表

SC(S,C,score) 成绩表

Teacher(T,Tname) 教师

1.1 创建学生表

CREATE TABLE `student` (`S` varchar(10) NOT NULL,`Sname` varchar(10) DEFAULT NULL,`Sage` varchar(10) DEFAULT NULL,`Ssex` varchar(15) DEFAULT NULL,PRIMARY KEY (`S`)
);

1.2 创建课程表

CREATE TABLE `course` (`C` varchar(20) NOT NULL,`Cname` varchar(20) DEFAULT NULL,`T` varchar(10) DEFAULT NULL,PRIMARY KEY (`C`)
);

1.3 创建教师表

CREATE TABLE `teacher` (`T` varchar(10) NOT NULL,`Tname` varchar(20) DEFAULT NULL,PRIMARY KEY (`T`)
);

1.4 创建成绩表

CREATE TABLE `sc` (`s` int NOT NULL,`C` varchar(10) NOT NULL,`score` varchar(10) DEFAULT NULL,PRIMARY KEY (`s`,`C`)
);

2.1 向学生表中添加数据

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

2.2 向课程表中添加数据

insert into Course values('01','CHINESE','02');
insert into Course values('02','MATH','01');
insert into Course values('03','ENGLISH','03'); 

2.3 向教师表中添加数据

insert into Teacher values('01','Li Pengfei');
insert into Teacher values('02','Wang Wen');
insert into Teacher values('03','Zhang Zhichao');

2.4 向课程表中添加数据

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

3.1 查询'01'课程比'02'课程成绩高的所有学生的学号

SELECT a.s
FROM ( SELECT s,score FROM sc WHERE c='01') AS a,( SELECT s,score FROM sc WHERE c='02') AS b
WHERE a.score>b.score AND a.s=b.s;

3.2 查询平均成绩大于60分的同学的学号和平均成绩

SELECT s,ROUND(AVG(score)) avg_score
FROM sc
GROUP BY s
HAVING avg_score>60;

3.3 查询平均成绩大于60分的同学的学号和平均成绩、课程总数和总分

SELECT s '学号',ROUND(AVG(score),2) '平均成绩',COUNT(c) '课程总数',SUM(score) '总分'
FROM SC
GROUP BY s
HAVING 平均成绩>60;

3.4 查询姓“李”的老师的个数

SELECT count(Tname)
FROM teacher
WHERE Tname like '%li%';

3.5 查询没学过“Li Pengfei”老师课的同学的学号、姓名

SELECT s,sname
FROM student
WHERE sname NOT IN (SELECT DISTINCT(sname)  FROM student AS stINNER JOIN scON st.s=sc.sINNER JOIN course AS coON sc.C=co.CINNER JOIN teacher AS teON co.T=te.TWHERE tname = 'Li Pengfei');

3.6 查询学过“01”并且也学过编号“02”课程的同学的学号、姓名

SELECT student.s,Sname
FROM sc,student
WHERE sc.s=student.s AND c='01'AND Sname IN(
SELECT sname
FROM sc,student
WHERE sc.s=student.s AND c='02');

3.7 查询学过“Li Pengfei”老师所教的所有课的同学的学号、姓名

SELECT s,sname
FROM student
WHERE s in (
SELECT sc.s
FROM sc
INNER JOIN course AS co
ON sc.C=co.C
INNER JOIN teacher AS te
ON co.T=te.T
WHERE tname = 'Li Pengfei'
GROUP BY sc.s
HAVING COUNT(1)= (SELECT COUNT(1) FROM course,teacher WHERE course.t=teacher.t AND Tname='Li Pengfei'));

3.8 查询课程编号“02”的成绩比课程编号“01”课程低的所有同学的学号、姓名

SELECT student.s,Sname
FROM student, (SELECT s,score FROM sc WHERE c='01') AS t1,(SELECT s,score FROM sc WHERE c='02') AS  t2
WHERE student.s=t1.S AND t1.s=t2.s AND t1.score>t2.score; 

3.9 查询所有课程成绩小于80分的同学的学号、姓名

SELECT student.s,sname
FROM student,sc
WHERE student.s=sc.s
GROUP BY student.s
HAVING SUM(CASE WHEN IFNULL(score,0)<80 THEN 1 ELSE 0 END)=COUNT(C);

3.10 查询没有学全所有课的同学的学号、姓名

SELECT student.s,Sname
FROM sc,student
WHERE sc.s=student.s
GROUP BY s
HAVING COUNT(c)!=(SELECT COUNT(c) FROM course );

3.11 查询至少有一门课与学号为“01”的同学所学相同的同学的学号和姓名

SELECT DISTINCT student.s,sname
FROM student
INNER JOIN sc
ON student.s=sc.s
WHERE c in (SELECT c FROM scWHERE s='01') AND SC.S!='01' 

3.12 查询学过学号为“07”同学所有门课的其他同学学号和姓名

SELECT s,Sname
FROM student
WHERE s IN (SELECT DISTINCT sFROM scWHERE c in (SELECT DISTINCT c FROM sc WHERE s='07') AND s!='07'GROUP BY sHAVING count(*)=(SELECT count(1) FROM sc WHERE s='07'));

3.13 把“sc”表中“Li Pengfei”老师教的课的成绩都更改为此课程的平均成绩

UPDATE sc a JOIN
(SELECT ROUND(AVG(score)) t , sc.c from sc
JOIN course ON sc.c=course.c
JOIN teacher ON course.T = teacher.t
WHERE Tname='Li Pengfei'
GROUP BY c ) b
ON a.c=b.c
SET a.score= b.t;

3.14 查询和“07”号的同学学习的课程完全相同的其他同学学号和姓名

 SELECT student.s, SnameFROM sc,student WHERE sc.s=student.s AND sc.s!='07' AND  sc.s  NOT IN ( SELECT s FROM sc WHERE c  NOT IN  (SELECT c FROM sc WHERE s='07'))GROUP BY sc.sHAVING COUNT(*) = (SELECT COUNT(*) FROM SC WHERE s='07');

3.15 删除学习“Li Pengfei”老师课的SC表记录

DELETE FROM sc WHERE c IN (
SELECT course.c FROM course,teacher
WHERE course.t=teacher.t AND Tname='Li Pengfei');

3.16 向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“03”课程的同学学号,’02‘,插入“02”课的平均成绩

INSERT INTO sc
(SELECT  s,02,(SELECT ROUNd(AVG(score),2) FROM sc WHERE c='02' )
FROM student
WHERE  s NOT IN (SELECT s FROM sc WHERE c='03' ));

3.17 按平均成绩从高到低显示所有学生的“数学”、“语文”、“英语”三门的课程成绩,所学课程数量,按平均成绩降序排列

SELECT s,
IFNULL ((SELECT score FROM sc,course WHERE t.s=sc.s AND  sc.C=course.C AND cNAME='MATH'),0) "数学",
IFNULL ((SELECT score FROM sc,course WHERE t.s=sc.s AND sc.C=course.C AND cNAME='CHINESE'),0) "语文",
IFNULL ((SELECT score FROM sc,course WHERE t.s=sc.s AND sc.C=course.C AND cNAME='ENGLISH'),0) "英语" ,
COUNT(c),
ROUND(AVG(score),2) avg_score
FROM sc t
GROUP BY S
ORDER BY avg_score DESC;

3.18 查询各科成绩最高和最低的分

SELECT c course_id,
max(score) max,
min(score) min
FROM sc
GROUP BY c;

3.19 按各科平均成绩从低到高和及格率的百分数从高到低顺序

SELECT c course_id,
ROUND(AVG(score)) avg_score,
ROUND(SUM(CASE WHEN IFNULL(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(c)*100,2) "RATE(%)"
FROM sc
GROUP BY c
ORDER BY avg_score ,"RATE(%)" DESC;

3.20 查询如下课程平均成绩和及格率的百分数(用"1行"显示):math、chinese、english

SELECT
round(sum(CASE WHEN Cname='MATH' THEN score ELSE 0 END)/sum(CASE WHEN Cname='MATH' THEN 1 ELSE 0 END),2 ) avg_score_math,
round(sum(CASE WHEN Cname='MATH' AND ifnull(score,0)>=60 THEN 1 ELSE 0 END)/sum(CASE WHEN Cname='MATH' THEN 1 ELSE 0 END)*100,2 ) 'math(%)',
round(sum(CASE WHEN Cname='chinese' THEN score ELSE 0 END)/sum(CASE WHEN Cname='chinese' THEN 1 ELSE 0 END),2 ) avg_score_chinese,
round(sum(CASE WHEN Cname='chinese' AND ifnull(score,0)>=60 THEN 1 ELSE 0 END)/sum(CASE WHEN Cname='chinese' THEN 1 ELSE 0 END)*100,2 ) 'chinese(%)',
round(sum(CASE WHEN Cname='english' THEN score ELSE 0 END)/sum(CASE WHEN Cname='english' THEN 1 ELSE 0 END),2 ) avg_score_english,
round(sum(CASE WHEN Cname='english' AND ifnull(score,0)>=60 THEN 1 ELSE 0 END)/sum(CASE WHEN Cname='english' THEN 1 ELSE 0 END)*100,2 ) 'english(%)'
FROM sc,course
WHERE sc.c=course.c;

3.21 查询不同老师所教不同课程平均分从高到低显示

SELECT teacher.t,Tname,course.cname,ROUND(AVG(score),2) avg_score
FROM sc,teacher,course
WHERE sc.c=course.c AND course.t=teacher.t
GROUP BY t,course.c
ORDER BY avg_score DESC;

3.22 查询如下课程成绩第 3 名到第 6 名的学生成绩单:math、chinese、english

SELECT * FROM
(SELECT c.*,ROW_NUMBER() OVER(ORDER BY c.avg_score DESC) AS rn
FROM (SELECT student.s,sname,SUM(CASE WHEN cname='math' then score ELSE 0 END) 'math',SUM(CASE WHEN cname='chinese' then score ELSE 0 END) 'chinese',SUM(CASE WHEN cname='english' then score ELSE 0 END) 'english',ROUND(AVG(sc.score),2) avg_scoreFROM student ,sc ,courseWHERE student.s=sc.s AND sc.c=course.cGROUP BY student.s) c
)d
LIMIT 2,4;

3.23 统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[-60]

SELECT course.c,cname,SUM( CASE WHEN score<=100 AND score>85 THEN 1 ELSE 0 END)  AS "100-85",SUM(CASE WHEN score<=85 AND score>70 THEN 1 ELSE 0 END) AS "85-70",SUM(CASE WHEN score<=70 AND score>60 THEN 1 ELSE 0 END) AS  "70-60",SUM(CASE WHEN score<=60 THEN 1  ELSE 0 END) AS  "-60"
FROM sc,course
WHERE sc.c=course.c
GROUP BY course.c,cname;

3.24 查询学生平均成绩及其名次

SELECT s,Sname,平均成绩, (SELECT 1+COUNT(平均成绩)FROM (SELECT sc.s,Sname,ROUND(AVG(score),2) "平均成绩"FROM sc,studentWHERE sc.s=student.sGROUP BY sc.s) AS t1WHERE t1.平均成绩 > t2.平均成绩) AS "名次"
FROM (SELECT sc.s,Sname,ROUND(AVG(score),2) "平均成绩"FROM sc,studentWHERE sc.s=student.sGROUP BY sc.s) AS t2
order by 平均成绩 DESC; 

3.25 查询各科成绩前三名的记录:(不考虑成绩并列情况)

SELECT s,c,Sname,score,排名
FROM(SELECT sc.s,c,Sname,score,ROW_NUMBER() over (PARTITION BY c order by score DESC) as "排名"FROM sc,studentWHERE sc.s=student.s) t1
WHERE 排名<=3;

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

SELECT c,COUNT(s)
FROM sc
GROUP BY c;

3.27 查询出只选修了2门课程的全部学生的学号和姓名

SELECT sc.s,Sname,COUNT(c)
FROM sc
INNER JOIN student
ON sc.s=student.s
GROUP BY sc.s
HAVING COUNT(c)=2;

3.28 查询男生、女生人数

SELECT Ssex,COUNT(Ssex)
FROM student
GROUP BY Ssex;

3.29 查询姓“张”的学生名单

SELECT Sname
FROM student
WHERE Sname like "张%";

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

SELECT Sname,Ssex,COUNT(*)
FROM student
GROUP BY Sname,Ssex
HAVING COUNT(*)>1;

3.31 1990年出生的学生名单(注:Student表中Sage列的类型是datetime)

SELECT Sname,Sage
FROM student
WHERE YEAR(Sage)='1990';

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

SELECT s,ROUND(AVG(score),2) avg_score
FROM sc
GROUP BY s
ORDER BY avg_score,C DESC;

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

SELECT sc.s,Sname,ROUND(AVG(score),2) avg_score
FROM SC
INNER JOIN student
ON sc.s=student.s
GROUP BY sc.s
HAVING avg_score>85;

3.34 查询课程名称为“MATH”,且分数低于60的学生姓名和分数

SELECT student.s,Sname,score
FROM sc,student,course
WHERE sc.s=student.s AND course.c=sc.c AND Cname='MATH' AND score<60;

3.35 查询所有学生的选课情况

SELECT sc.s,sname,course.c,cname
FROM sc,student,course
WHERE sc.s=student.s AND sc.c=course.c;

3.36 查询每门课程成绩在70分以上的姓名、课程名称和分数

SELECT sc.s,Sname,Cname,score
FROM sc
INNER JOIN student st
ON sc.s=st.s
INNER JOIN course co
ON sc.c=co.c
WHERE sc.s NOT IN (SELECT sc.s FROM sc WHERE  score<70 )
ORDER BY sc.s;

3.37 查询不及格的课程,显示学号、姓名、课程号、成绩

SELECT sc.s,Sname,Cname,score
FROM sc
INNER JOIN student st
ON sc.s=st.s
INNER JOIN course co
ON sc.c=co.c
WHERE score<60;

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

SELECT sc.s,Sname,Cname,score
FROM sc
INNER JOIN student st
ON sc.s=st.s
INNER JOIN course co
ON sc.c=co.c
WHERE  co.c='03' AND score>80;

3.39 求选了课程的学生人数

SELECT count(DISTINCT s)
FROM sc;

3.40 查询选修“Li Pengfei”老师所授课程的学生中,成绩最高的学生姓名及其成绩

SELECT sname,sc.c,score
FROM sc
INNER JOIN student
ON sc.s=student.s
INNER JOIN course
ON course.c=sc.c
INNER JOIN teacher
ON teacher.t=course.t
WHERE Tname="Li Pengfei"
LIMIT 1;

3.41 查询各个课程及相应的选修人数

SELECT cname,count(DISTINCT(s))
FROM sc,course
GROUP BY Cname;

3.42 查询不同课程成绩相同的学生的学号、课程号、学生成绩

SELECT DISTINCT t1.s,t1.c,t1.score
FROM sc t1,sc t2
WHERE t1.s!=t2.s AND t1.score=t2.score
ORDER BY t1.s;

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

SELECT s,c,rn
FROM (SELECT s,c,ROW_NUMBER() over(PARTITION BY c order by score DESC) as rnFROM sc) AS t1
WHERE rn<3;

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

SELECT c,count(DISTINCT s)
FROM sc
GROUP BY C
HAVING count(DISTINCT s)>5
ORDER BY count(DISTINCT s) DESC,c;

3.45 检索至少选修3门课程的学生学号

SELECT s, count(c)
FROM sc
GROUP BY s
HAVING COUNT(c)>=3;

3.46 查询全部学生都选修的课程的课程号和课程名

select course.c,Cname
from SC,course
WHERE sc.c=course.c
group by sc.c
having count(*) = (select count(DISTINCT s) from sc);

3.47 查询没学过“叶平”老师讲授的任一门课程的学生姓名

SELECT sname
FROM student
WHERE s NOT IN (SELECT s FROM course,teacher,scWHERE course.T=teacher.T AND sc.c=course.C AND Tname="Li Pengfei");

3.48 查询两门以上不及格课程的同学的学号及其平均成绩

SELECT s,ROUND(AVG(score),2)
FROM sc
WHERE score<60
GROUP BY S
HAVING SUM(CASE WHEN IFNULL(score,0)<60 THEN 1 ELSE 0 END)>2;

3.49 检索“03”课程分数小于60,按分数降序排列的同学学号

SELECT s,c,score
FROM sc
WHERE c='03' AND score<60
order by score desc;

3.50 删除“02”同学的“01”课程的成绩

DELETE FROM sc WHERE s="02" AND c="01";

MySQL经典50题相关推荐

  1. [Mysql] 经典 50 题

    50道MySql练习题(本文档只有45道)流传自远古,相当经典.这套练习在多样性和难度上平衡的比较好,换句话说,基础sql查询练习有这套就够了. 这套练习在互联网上存在时间悠久,有很多版本,本文档力图 ...

  2. mysql经典50题(练习)

    1.5号oracle50题链接在此 创建数据库和表 数据库 drop database if exists mysql_test cascade; create database mysql_test ...

  3. mysql6.10,MySQL经典50题-第6-10题

    MySQL50-4-第6-10题 本文中介绍的是第6-10题,涉及到的主要知识点: 模糊匹配和通配符使用 表的自连接 in/not in 连接查询的条件筛选 image 题目6 题目需求 查询&quo ...

  4. mysql 插入学生信息_MySQL经典50题-1-创建数据表和插入数据

    MySQL经典50题-1-创建数据表和插入数据 本文的整理和学习来自CSDN的一位博主,接下来的一个系列将是自己的学习和整理内容,提升MySQL. 同时解法会对网上的版本进行整理和综合,尽可能有多种答 ...

  5. Mysql 学生信息经典50题

    Mysql 学生信息经典50题 练习数据 数据表 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...

  6. 【SQL】经典50题 [ 3 ]:Q31-Q50

    [SQL]经典50题 [ 3 ]:Q31-Q50 准备:表的建立 Q31. 查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime) 1. 代码 2. 运行结果 3. ...

  7. 【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】

    查询所用的表结构见https://blog.csdn.net/zjhbeautiful/article/details/108065336 SQL经典50题第9题正解 题目:查询和" 01 ...

  8. SQL练习——经典50题

    1. 经典50题 原博客链接 1.1 简介 表格 学生表(Student) 课程表(Course) 教师表(Teacher) 成绩表(Score) 数据插入 # Student 学生表 CREATE ...

  9. SQL语句经典50题

    Sql语句经典50题 注:数据库版本为mysql 8.0 #学生表 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) N ...

  10. 图解SQL面试题:经典50题

    图解SQL面试题:经典50题 已知有如下4张表: 学生表:student(学号,学生姓名,出生年月,性别) 成绩表:score(学号,课程号,成绩) 课程表:course(课程号,课程名称,教师号) ...

最新文章

  1. 伪语言PHP,PHP语言之伪静态几种做法
  2. linux下qt检查进程是否存在,Linux下C语言实现查看进程是否存在
  3. IdentityServer4 第三方快速入门和示例
  4. android studio闪退代码不报错_代码不报错,不代表真的没错
  5. windows 2012 AD域报错ladp非法绑定
  6. 推荐LaTeX在线编辑器
  7. MAC操作之Finder显示、隐藏 文件或文件夹
  8. flowable-6.7(一)从工作流与BPMN到flowable
  9. 我的Python心路历程 第十期 (10.5 股票实战之数据可视化曲线)
  10. Eclipse所有快捷键
  11. VMware教程(一):设置 CentOS 7 共享文件夹
  12. USBCAN-I使用说明书(入门指引)
  13. 【已解决】Spring容器中找不到ServletWebServerFactory类出现的异常
  14. RT-Thread的线程-rt_thread_init
  15. 可以挂机赚钱的游戏有哪些?
  16. 牛客网 HJ42 学英语
  17. 用matlab实现运筹学最短路问题,运筹学最短路问题实验报告
  18. Linux系统中内核态、用户态和零拷贝技术解析
  19. 英语单词:profile
  20. castor 创建javabean

热门文章

  1. 如何基于 Spark Streaming 构建实时计算平台
  2. Gliffy Diagrams 好用的流程图工具
  3. 安卓psp模拟器联机教程_安卓PSP模拟器评测:蜘蛛侠2
  4. matlab在xrd中的应用,XRD物相分析(Jade软件的应用).pdf
  5. c语言中的符号总结,C语言中的符号总结
  6. 计算机ip 地址异常,电脑显示IP地址错误怎么办|电脑无法上网提示IP地址错误的解决方法...
  7. springboot框架(2):整合junit4
  8. 【一文讲通】BLDC的六步法PMSM的FOC法综合
  9. 支付宝和微信的支付功能如何进行测试?
  10. android蓝牙协议栈bluedroid分析,安卓系统蓝牙协议栈 bluedroid 的使能