MySQL15道经典练习题

前言:本期博客就不标明目录了,我们直接上题目,这一期内容主要是唤醒哪些沉睡在大家心中的之前的SqlServer与oralc的知识点,以及巩固我们的MySQL,其中较难的知识点可能就是联表了,什么内联,外联,左联右联让人头皮发麻,但是不要慌,跟着小刘的步伐慢慢理清思路

首先是我们的建表,这里已经把需要的表的代码都交代上了

一共四张表,学生,教师,成绩,课程

CREATE TABLE t_student(
sid VARCHAR(10),
sname varchar(10),
sage date,
ssex CHAR
)

create table t_teacher(
tid VARCHAR(10),
tname VARCHAR(10)
)

create table t_course(
cid VARCHAR(10),
cname varchar(10),
tid VARCHAR(10)
)

create table t_score(
sid varchar(10),
cid varchar(10),
score float
)
select * from t_student
select * from t_teacher
select * from t_course
select * from t_score


-- 学生表
insert into t_student values('01' , '赵雷' , '1990-01-01' , '男');
insert into t_student values('02' , '钱电' , '1990-12-21' , '男');
insert into t_student values('03' , '孙风' , '1990-12-20' , '男');
insert into t_student values('04' , '李云' , '1990-12-06' , '男');
insert into t_student values('05' , '周梅' , '1991-12-01' , '女');
insert into t_student values('06' , '吴兰' , '1992-01-01' , '女');
insert into t_student values('07' , '郑竹' , '1989-01-01' , '女');
insert into t_student values('09' , '张三' , '2017-12-20' , '女');
insert into t_student values('10' , '李四' , '2017-12-25' , '女');
insert into t_student values('11' , '李四' , '2012-06-06' , '女');
insert into t_student values('12' , '赵六' , '2013-06-13' , '女');
insert into t_student values('13' , '孙七' , '2014-06-01' , '女');

-- 教师表
insert into t_teacher values('01' , '张三');
insert into t_teacher values('02' , '李四');
insert into t_teacher values('03' , '王五');

-- 课程表
insert into t_course values('01' , '语文' , '02');
insert into t_course values('02' , '数学' , '01');
insert into t_course values('03' , '英语' , '03');

-- 成绩表
insert into t_score values('01' , '01' , 80);
insert into t_score values('01' , '02' , 90);
insert into t_score values('01' , '03' , 99);
insert into t_score values('02' , '01' , 70);
insert into t_score values('02' , '02' , 60);
insert into t_score values('02' , '03' , 80);
insert into t_score values('03' , '01' , 80);
insert into t_score values('03' , '02' , 80);
insert into t_score values('03' , '03' , 80);
insert into t_score values('04' , '01' , 50);
insert into t_score values('04' , '02' , 30);
insert into t_score values('04' , '03' , 20);
insert into t_score values('05' , '01' , 76);
insert into t_score values('05' , '02' , 87);
insert into t_score values('06' , '01' , 31);
insert into t_score values('06' , '03' , 34);
insert into t_score values('07' , '02' , 89);
insert into t_score values('07' , '03' , 98);

 然后来看看我们的题目:

01)查询" 01 "课程比" 02 "成绩高的学生的信息及课程分数
02)查询同时存在" 01 "课程和" 02 "课程的情况
03)查询存在" 01 "课程但可能不存在" 02 "课程的情况不存在时显示为 null )
04)查询不存在" 01 "课程但存在" 02 "课程的情况
05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
06)查询在t_score表存在成绩的学生信息
07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
08)查询「李」姓老师的数量

09)查询学过「张三」老师授课的同学的信息
10)查询没有学全所有课程的同学的信息
11)查询没学过"张三"老师讲授的任一门课程的学生姓名
12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息
14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
15)查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

 接下来就是我们的解题部分

01)查询" 01 "课程比" 02 "成绩高的学生的信息及课程分数
语句:

select a.*,b.score 语文,c.score 数学 from t_student as a
inner JOIN t_score as b
on a.sid = b.sid
inner join t_score as c
on a.sid=c.sid and b.cid='01' and c.cid='02'
where b.score>c.score

结果:


02)查询同时存在" 01 "课程和" 02 "课程的情况
语句:

select * from t_score as a inner join t_score as b on a.sid=b.sid where a.cid='01' and b.cid='02'

结果:

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

语句:

select * from t_score as a inner join t_score as b on a.sid=b.sid and b.cid='02' where a.cid='01'

结果:

 04)查询不存在" 01 "课程但存在" 02 "课程的情况
语句:

select * from t_score where sid not in (select sid from t_score  where cid ='01' ) and cid ='02'

 结果:

05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
语句:

select a.sid,a.sname,avg_cj from t_student as a 
inner join(
select sid, AVG(score) As avg_cj
from t_score
group by sid
having AVG(score) >=60) as b on a.sid=b.sid;

结果:

06)查询在t_score表存在成绩的学生信息

语句:

select  a.sid,a.sname,b.ct,b.sum_score
from t_student as a
left join (select sid,count(cid) as ct,sum(score) as sum_score
from t_score
group by sid)as b on a.sid = b.sid;
)

结果:


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

select  a.sid,a.sname,b.ct,b.sum_score
from t_student as a
left join (select sid,count(cid) as ct,sum(score) as sum_score
from t_score
group by sid)as b on a.sid = b.sid;
)

结果:


08)查询「李」姓老师的数量
语句:

select count(*) from t_teacher where tname like'李%';

结果:


09)查询学过「张三」老师授课的同学的信息
语句: 

select a.*,c.tname  from t_student a , t_score b ,t_teacher c ,t_course d where a.sid=b.sid and b.cid = d.cid and d.tid = c.tid and b.cid='01'

结果:


10)查询没有学全所有课程的同学的信息
语句:

select  a.*,ct
from t_student as a
inner join (select sid,count(cid) as ct
                        from t_score
                        group by sid
                        having ct <(select count(cid) from t_course))as b on a.sid = b.sid
)

结果:


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

语句:


SELECT Sname
FROM t_student AS a
WHERE SId NOT IN (SELECT SId
                  FROM t_score AS a
                  LEFT JOIN t_course AS b
                  ON a.CId = b.CId
                  INNER JOIN t_teacher AS c
                  ON b.TId = c.TId
                  WHERE Tname = '张三');

结果:


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

语句:

SELECT a.Sid,a.Sname,AVG(c.score) AS avg_score 
FROM t_student AS a 
INNER JOIN (SELECT Sid,COUNT(Cid)AS num 
	        FROM t_score
	        WHERE score < 60 
	        GROUP BY Sid 
	        HAVING num >= 2)AS b 
ON a.Sid = b.Sid 
INNER JOIN t_score AS c 
ON b.Sid = c.Sid 
GROUP BY a.Sid;

结果:


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

语句:

SELECT b.*,a.score
FROM(SELECT SId,score
     FROM t_score
     WHERE CId = '01' AND score < 60) AS a
LEFT JOIN t_student AS b
ON a.SId = b.SId
ORDER BY a.score DESC;

结果:


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

语句:


SELECT b.*,a.score
FROM(SELECT SId,score
     FROM t_score
     WHERE CId = '01' AND score < 60) AS a
LEFT JOIN t_student AS b
ON a.SId = b.SId
ORDER BY a.score DESC;

结果:


15)查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

语句:

SELECT a.*,b.Cname
FROM(SELECT 
     CId,
     COUNT(*)   AS 选修人数,
     MAX(score) AS 最高分,
     MIN(score) AS 最低分,
     AVG(score) AS 平均分,
     SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*) AS 及格率,
     SUM(CASE WHEN score >= 70 AND score < 80 THEN 1 ELSE 0 END) / COUNT(*) AS 中等率,
     SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优良率,
     SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优秀率
     FROM t_score
     GROUP BY CId
     ORDER BY COUNT(*) DESC,CId ASC) AS a
LEFT JOIN t_course AS b
ON a.CId = b.CId;

结果:

 ok,今日的练习就到此结束了,明天也要继续加油哦!

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值