创先数据表格
Student表(学生表)
create table Student
(SId varchar(10) comment 学生id
Sname varchar(10) comment 学生姓名,
Sage datetime comment 学生出生日期,
Ssex varchar(10) comment 学生性别);
插入数据:
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’ , ‘⼥’);
查看表格
select * from student;
结果如下:
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);
查看表格:
select * from SC
结果如下:
Course表(课程表)
create table Course
(cid varchar(10) comment ‘课程id’,
cname nvarchar(10) comment ‘课程名称’,
tid varchar(10) comment ‘教师id’);
插入数据
insert into Course values(‘01’ , ‘语⽂’ , ‘02’);
insert into Course values(‘02’ , ‘数学’ , ‘01’);
insert into Course values(‘03’ , ‘英语’ , ‘03’);
查看表格:
select * from course;
结果如下:
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’ , ‘王五’);
查看表:
select * from teacher;
结果如下:
查询
– 1.1 查询同时存在"01"课程和"02"课程的情况
select s.sid,s.sname from student s
join
(select * from sc where cid=01)a
on s.sid=a.sid
join
(select * from sc where cid=02)b
on s.sid=b.sid
结果如下:
– 1.2查询同时存在"01"课程和"02"课程的情况(不存在时显示为 null )
select s.*,a.cid,a.score,b.cid,b.score from student s
join
(select * from sc where cid=01)a
on s.sid=a.sid
left join (select * from sc where cid=02)b
on s.sid=b.sid
– 1.3 查询不存在"01"课程但存在"02"课程的情况
select s.*,a.cid,a.score from student s
join (select * from sc where cid=02)a
on s.sid=a.sid
left join (select * from sc where cid=01)b
on s.sid=b.sid where b.sid is null
– 1.4查询" 01 “课程比” 02 "课程成绩高的学生的信息(仅列出01,02课)
select s.sid,s.sname,a.cid,a.score,b.cid,b.score from student s
join
(select * from sc where cid=01)a
on s.sid=a.sid
join
(select * from sc where cid=02)b
on s.sid=b.sid
where a.score >b.score
– 1.5查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数
select s.sid,s.sname,sc.cid,sc.score from student s
join sc
on s.sid=sc.sid
and s.sid in
(select a.sid from
(select * from sc where cid=01)a
join
(select * from sc where cid=02)b
on a.sid=b.sid
where a.score >b.score
)
– 2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩,平均成绩保存整数。
select s.sid,s.sname,format(a.avg_score,0) as avg_score from student s
join
(select sid,avg(score) as avg_score from sc
group by sid
having avg_score>60)a
on s.sid=a.sid
– 3.查询在 SC 表存在成绩的学生信息
select distinct student.sid from student
join sc
on student.sid=sc.sid
– 4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
select s.sid,
s.sname,
count(distinct sc.cid) as cid_count,
sum(sc.score) as sum_score
from student s
left join sc on s.sid=sc.sid
group by s.sid,s.sname
order by s.sid
– 4.1 查有成绩的学生信息(有成绩不等于学生信息在sc表里,如果表中学生成绩为0呢?逻辑要对,避免逻辑漏洞。而且尽量避免用查询嵌套。)
select s.* from student s
join sc on s.sid=sc.sid
group by s.sid
或
select s.* from student s
left join sc on s.sid=sc.sid
where sc.sid is not null
group by s.sid
– 5.查询「李」姓老师的数量
select count(1) from teacher
where tname like ‘李%’
– 6.查询学过张三老师授课的同学的信息
select distinct 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=‘张三’
– 7.查询没有学全所有课程的同学的信息
select distinct s.* from student s
left join
(
select sc.sid,count(sc.cid) as cid_cnt from sc
group by sc.sid
having cid_cnt=(select count(distinct c.cid) from sc c)
)a
on s.sid=a.sid
where a.sid is null
– 8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
select distinct s.* from student s
join sc on s.sid=sc.sid
where sc.cid in
(select cid from sc where sid=01)
and s.sid!=01
– 9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
select * from student where SId in
(select SId from
(select * from sc a where CId in
(select CId from sc where SId=01)
)b
group by SId
having count(CId) =(select count(CId) from sc c where SId=01))
and SId !=01
– 10.查询没学过"张三"老师讲授的任一门课程的学生姓名
select a.sname from student a
where a.sname not in
(
select distinct s.sname from student s
left 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.sid,s.sname,a.avg_score from student s
join
(select sid,avg(score) as avg_score from sc
where score<60
group by sid
having avg_score>1)a
on s.sid=a.sid
– 12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
select s.* from student s
join sc
on s.sid=sc.sid
where sc.cid=01 and sc.score<60
order by sc.score desc
– 13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select s.*,sc.cid,sc.score,a.avg_score from student s
left join sc on s.sid=sc.sid
left join (select sid,avg(score) as avg_score from sc
group by sid)a
on a.sid=s.sid
order by a.avg_score desc
– 14.查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列列,若人数相同,按课程号升序排
select sc.cid,c.cname,count(sid),max(score),min(score),avg(score) as avg_score,
sum(case when score>=90 then 1 else 0 end)/count(score) as ‘优秀’,
sum(case when score>=80 then 1 else 0 end)/count(score) as ‘优良’,
sum(case when score>=70 then 1 else 0 end)/count(score) as ‘中等’,
sum(case when score>60 then 1 else 0 end)/count(score) as ‘及格’
from sc
join course c
on sc.cid=c.cid
group by cid
order by count(sid) desc,cid asc
– 15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
select sc.*,
rank()over(partition by cid order by score desc) label
from sc
– 16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺
select a.*,rank()over(order by a.x desc) as label
from
(select sid,
sum(score) as x
from sc
group by sid)a
– 17统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
select sc.cid,
c.cname,
sum(case when score>85 and score<=100 then 1 else 0 end) as ‘[100-85]’,
concat(format(sum(case when score>85 and score<=100 then 1 else 0 end)/count(score),2)*100,’%’) as ‘[100-85]%’,
sum(case when score>70 and score<=85 then 1 else 0 end) as ‘[85-70]’,
concat(format(sum(case when score>70 and score<=85 then 1 else 0 end)/count(score),2)*100,’%’) as ‘[85-70]%’,
sum(case when score>60 and score<=70 then 1 else 0 end) as ‘[70-60]’,
concat(format(sum(case when score>60 and score<=70 then 1 else 0 end)/count(score),2)*100,’%’) as ‘[70-60]%’,
sum(case when score>0 and score<=60 then 1 else 0 end) as ‘[60-0]’,
concat(format(sum(case when score>0 and score<=60 then 1 else 0 end)/count(score),2)*100,’%’) as ‘[60-0]%’
from sc
join course c
on sc.cid=c.cid
group by sc.cid
order by sc.cid
– 18.查询各科成绩前三名的记录
select a.* from
(select cid,score,row_number() over(partition by cid order by score desc) as label
from sc)a
where a.label<4
– 19.查询每门课程被选修的学生数
select cid,count(distinct sid) as sid_cnt from sc
group by cid
– 20.查询出只选修两门课程的学生学号和姓名
select student.sid,sname,count(cid) as cid_cnt from student
join sc
on student.sid=sc.sid
group by sid
having count(cid)=2
– 21. 查询男生、女生人数
select ssex,count(sid) from student
group by ssex
– 22. 查询名字中含有「三」字的学生信息
select * from student
where Sname like ‘%三%’
– 23查询同名同性学生名单,并统计同名人数
select sname,ssex,count(1) from student
group by sname,Ssex
having count(1)>1
– 24.查询 1990 年年出生的学生名单
select * from student
where year(sage)=1990
– 25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
select cid,format(avg(score),1) as avg_score from sc
group by cid
order by avg_score desc,cid
–26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
select s.sid,s.sname,a.avg_score from student s
join
(select sid,avg(score) as avg_score
from sc
group by sid
having avg_score>85
)a
on s.sid=a.sid
–27查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
select sname,score from student
join sc
on sc.sid=student.SId
join course c
on sc.cid=c.CId
where cname=‘数学’ and score<60
–28. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
select s.*,sc.cid,sc.score
from student s
left join sc
on s.sid=sc.sid
–29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
select s.sname,cname,score
from student s
join sc on s.sid=sc.sid
join course c on sc.cid=c.CId
where score>70
–30.查询不及格的课程
select distinct c.cname
from course c
join sc on c.cid=sc.cid
where score<60
–31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
select s.sname,s.sid
from student s
join sc on s.sid= sc.sid
where cid=01 and score>=80
–32.求每门课程的学生人数
select CId,count(SId)
from sc group by sc.CId
–33 成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
select s.*,sc.score 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 =‘张三’
order by sc.score desc
limit 1
–34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生
update sc set score=90 where sid=07
select * from
(select a.,rank()over(order by score desc) as label from
(select s.,sc.score
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 =‘张三’
)a
)b
where b.label=1
–35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
select a.sid,a.cid,a.score
from sc a
join sc b
on a.sid=b.sid and a.score =b.score
and a.cid!=b.cid
–36. 查询每门成绩最好的前两名
select a.* from
(select *,row_number()over(partition by cid order by score desc) as label
from sc)a
where a.label<=2
–37. 统计每门课程的学生选修人数(超过 5 人的课程才统计)
select cId,count(SId)
from sc
group by CId
having count(SId)>5
–38.检索至少选修两门课程的学生学号
select SId from sc
group by SId
having count(CId)>=2
–39.查询选修了全部课程的学生信息
select student.* from student
join sc on student.SId=sc.SId
group by student.SId
having count(CId)=(select count(CId) from course)
–40.查询各学生的年龄,只按年份来算
select sid, (year(‘2021-01-01’)-year(sage) )as age from student