数据库-mysql练习题目2

问题及描述:
–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 分数
/
–创建测试数据
create table Student(SID varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(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 nvarchar(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 nvarchar(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);
CREATE DATABASE A;
use A;
create table Student(SID varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(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 nvarchar(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 nvarchar(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 * FROM student RIGHT JOIN
(SELECT a.sid,a.score c1,b.score c2
FROM(SELECT * FROM sc WHERE sc.cid=‘01’) as a,(SELECT * FROM sc WHERE sc.cid=‘02’)as b
WHERE a.sid=b.sid and a.score>b.score) AS r
ON student.SID=r.sid;
– –1.1、查询同时存在"01"课程和"02"课程的情况
SELECT a.sid,a.score,b.score
FROM(SELECT * from sc where sc.CID=‘01’)as a,
(SELECT * from sc where sc.CID=‘02’)as b WHERE a.sid=b.sid;
– –1.2、查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)
SELECT *
FROM(SELECT * from sc where sc.CID=‘01’)as a
LEFT JOIN(SELECT * from sc where sc.CID=‘02’)as b
ON a.sid=b.sid
– –2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数
SELECT *
FROM student
RIGHT JOIN (
SELECT a.SID,a.score class1,b.score class2
FROM( SELECT * FROM sc
WHERE sc.CID = ‘01’
) AS a,
(
SELECT *
FROM sc
WHERE sc.CID = ‘02’
) AS b
WHERE a.SID = b.SID
AND a.score < b.score
) r ON student.SID = r.SID
– –2.1、查询同时存在"01"课程和"02"课程的情况
SELECT a.sid,a.score,b.score
FROM(SELECT * from sc where sc.CID=‘01’)as a,(SELECT * from sc where sc.CID=‘02’)as b
WHERE a.sid=b.sid;
– –3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
SELECT b.sid, b.sname,a FROM student AS b JOIN
(SELECT sid,AVG(score) AS a FROM sc GROUP BY sid HAVING a>60)c
ON b.sid = c.sid
– –4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
SELECT b.sid, b.sname,a FROM student AS b JOIN
(SELECT sid,AVG(score) AS a FROM sc GROUP BY sid HAVING a<60)c
ON b.sid = c.sid
– –5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
SELECT b.sid,b.a,c,student.sname FROM student join
(SELECT SID,COUNT(cid) c,SUM(score) AS a FROM sc GROUP BY sid )as b
on student.sid=b.sid ;
– –5.2、查询所有(包括有成绩和无成绩)的SQL。
select a.sid, a.sname, count(b.cid), sum(b.score)
from student a left join sc b
on a.sid = b.sid
group by a.sid, a.sname
order by a.sid;
– –6、查询"李"姓老师的数量
SELECT COUNT(
) FROM teacher WHERE tname LIKE ‘李%’;
– –7、查询学过"张三"老师授课的同学的信息
select sid,sname,ssex from student
where sid
in(select sid from sc where cid=02);
– –8、查询没学过"张三"老师授课的同学的信息
SELECT student.* FROM student WHERE student.sid NOT IN
(SELECT sc.sid FROM sc
WHERE sc.cid IN
(SELECT course.cid FROM course,teacher
WHERE course.tid = teacher.tid AND teacher.tname = ‘张三’));
– –9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
SELECT st.SId,st.SName FROM
(SELECT t1.SId AS SId
FROM
(SELECT s1.SId FROM sc s1 WHERE s1.CId = ‘01’)t1,
(SELECT s2.SId FROM sc s2 WHERE s2.CId = ‘02’)t2
WHERE t1.SId = t2.SId
)stu, student st
WHERE stu.SId = st.Sid
– –10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
select s.,sc1.score,sc2.score from student s
left join (select * from sc where cid = ‘01’) sc1 on s.sid = sc1.sid
left join (select * from sc where cid = ‘02’) sc2 on s.sid = sc2.sid
where sc1.cid = ‘01’ and sc2.cid is null;
– –11、查询没有学全所有课程的同学的信息
select s.
, count(cid)
from student s left join sc on s.sid = sc.sid
group by sc.sid having count(cid)<>(select count() from course);
或者
SELECT student.
FROM student WHERE student.sid NOT IN
(SELECT sid FROM sc GROUP BY sid
HAVING COUNT(cid) = (SELECT COUNT() FROM course))
– –12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
SELECT a.sid,a.sname FROM student as a
INNER JOIN
(
SELECT distinct sid FROM sc
WHERE cid in
(
SELECT cid FROM sc
WHERE sid=‘01’
) AND sid!=‘01’
) AS b
on a.sid=b.sid
– –13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
select * from student where sid in
(select sid from sc where sid not in
(select sid from sc where cid not in (select cid from sc where sid=‘01’))
group by sid
having count(
)=(select count() from sc where sid=‘01’) and sid != ‘01’);
– –14、查询没学过"张三"老师讲授的任一门课程的学生姓名
select sname from student where sid not in (
select distinct sid from sc where cid in (
select t2.cid from teacher t1, course t2 where t1.tid = t2.tid and t1.tname = ‘张三’))
– –15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
select
t1.sid,
t1.sname,
t3.avg_score
from
student t1,
(
select t2.sid,
round(avg(score)) as avg_score
from
(
select
*
from
sc
where
score < ‘60’) t2
group by
t2.sid
having
count(t2.sid) >= 2) t3
where
t1.sid = t3.sid
– –16、检索"01"课程分数小于60,按分数降序排列的学生信息
select
t2.

from
sc t1,
student t2
where
t2.sid = t1.sid
and t1.score < ‘60’
and t1.cid = ‘01’
order by
t1.score;
– –17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT sc.*, a FROM sc LEFT JOIN
( SELECT sid, AVG(score)AS a FROM sc GROUP BY sid )r
ON sc.sid = r.sid ORDER BY a DESC
– –18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率,及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
select
a.cid,
b.cname,
max(score),
min(score),
round(avg(score), 2),
round(100 *(sum(case when a.score >= 60 then 1 else 0 end)/ sum(case when a.score then 1 else 0 end)), 2) as 及格率,
round(100 *(sum(case when a.score >= 70 and a.score <= 80 then 1 else 0 end)/ sum(case when a.score then 1 else 0 end)), 2) as 中等率,
round(100 *(sum(case when a.score >= 80 and a.score <= 90 then 1 else 0 end)/ sum(case when a.score then 1 else 0 end)), 2) as 优良率,
round(100 (sum(case when a.score >= 90 then 1 else 0 end)/ sum(case when a.score then 1 else 0 end)), 2) as 优秀率
from
sc a
left join course b on
a.cid = b.cid
group by a.cid, b.cname
– –19、按各科成绩进行排序,并显示排名
select a.sid ,a.cid, a.score, count(a.score<b.score)+1 as rank
from sc a left join sc b on a.cid=b.cid and a.score<b.score
group by a.cid, a.sid order by a.cid, a.score desc;
– –20、查询学生的总成绩并进行排名
select a.
,count(a.cj<b.cj)+1 as rank from
(select sid , sum(score) as cj from sc group by sid) a
left join
( select sid, sum(score) as cj from sc group by sid) b
on a.cj<b.cj group by a.sid order by a.cj desc;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<千繁/>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值