-- Sql练习题总结(参考猴子课程课件)
-- 向student2表中插入数据
insert into student2 (学号,姓名,出生日期,性别)
values('0001','猴子','1989-01-01','男');
insert into student2 (学号,姓名,出生日期,性别)
values('0002','猴子','1990-12-21','女');
insert into student2 (学号,姓名,出生日期,性别)
values ('0003','马云','1991-12-21','男');
insert into student2 (学号,姓名,出生日期,性别)
values ('0004','王思聪','1990-05-20','男');
-- 向course2添加数据
insert into course2 (课程号,课程名称,教师号)
values('0001','语文','0002');
insert into course2 (课程号,课程名称,教师号)
values ('0002','数学','0001');
insert into course2 (课程号,课程名称,教师号)
values ('0003','英语','0003');
-- 向teacher2添加数据
insert into teacher2 (教师号,教师姓名)
values ('0001','孟扎扎');
insert into teacher2 (教师号,教师姓名)
values ('0002','马化腾');
insert into teacher2 (教师号,教师姓名)
values ('0003',null);
insert into teacher2 (教师号,教师姓名)
values ('0004','')
-- 1.简单查询
-- (1)查询姓猴的学生名单
select 学号,姓名
from student2
where 姓名 like '猴%';
-- (2)查询姓名中最后一个字是“猴”的学生名单
select *
from student2
where 姓名 like '%猴';
-- (3)查询姓名中带“猴”的学生名单
select *
from student2
where 姓名 like '%猴%';
-- (4)查询三个字的“王”姓学生名单
select *
from student2
where 姓名 like '王__';
-- 2.汇总查询
-- (1)查询课程编号为0002的总成绩
select sum(成绩) as 总成绩
from score2
where 课程号='0002';
-- (2)查询选了课程的人数
select count(distinct 学号) as 选课总人数
from score2;
-- (3)查询男女生人数
select 性别,count(*) as 学生人数
from student2
group by 性别;
-- (4)查询各科成绩最高和最低分
select 课程号,max(成绩) as 最高分,min(成绩) as 最低分
from score2
group by 课程号;
-- (5)查询每门课程被选修的学生数
select 课程号,count(学号) as 选修人数
from score2
group by 课程号;
-- (6)查询平均成绩大于60分学生的学号和平均成绩
select 学号,avg(成绩) as 平均成绩
from score2
group by 学号
having 平均成绩>60;
-- (7)查询至少选修两门课程的学生学号
select 学号,count(课程号) as 选修课程数
from score2
group by 学号
having 选修课程数>=2;
-- (8)查询同名同姓学生名单并统计同名人数
select 姓名,count(学号) as 同名人数
from student2
group by 姓名
having 同名人数>1;
-- (9)查询平均成绩不及格的课程并按课程号从大到小排序
select 课程号,avg(成绩) as 平均成绩
from score2
group by 课程号
order by 课程号 desc;
-- (10)查询每门课程的平均成绩,结果按平均成绩升序排序。平均成绩相同时,按课程号降序排序
select 课程号,avg(成绩) as 平均成绩
from score2
group by 课程号
order by 平均成绩 asc,课程号 desc;
-- 3.复杂查询
-- (1)创建视图
create view 按性别汇总(性别,人数)
as
select 性别,count(*) as 人数
from student
group by 性别;
select 性别,人数 from 按性别汇总;
-- (2)哪些学生的成绩比 课程0002的全部成绩里的 任意一个高呢?
select 学号,成绩
from score2
where 成绩>any(
select 成绩
from score2
where 课程号='0002'
);
-- (3)哪些学生的成绩比 课程0002的全部成绩里的 都高呢?
select 学号,成绩
from score2
where 成绩>all(
select 成绩
from score2
where 课程号='0002'
);
-- (4)大于平均成绩学生的学号和成绩
select 学号,成绩
from score2
where 成绩>(
select avg(成绩)
from score
);
-- (5)成绩在差生和优等生平均成绩之间的学生学号和成绩
select 学号,成绩
from score2
where 成绩 between(
select avg(成绩)
from score2
where 成绩<=60
) and (
select avg(成绩)
from score2
where 成绩>80
);
-- (6)查找出每个课程中 大于对应课程平均成绩的学生
select 学号,课程号,成绩
from score2 as s1
where 成绩>(
select avg(成绩)
from score2 as s2
where s1.课程号=s2.课程号
group by 课程号
);
-- (7)找出每个课程里成绩最低的学号
select 学号,课程号,成绩
from score2 as s1
where 成绩=(
select min(成绩)
from score2 as s2
where s1.课程号=s2.课程号
group by 课程号
);
-- 4.多表查询
-- (1)查询所有学生的学号、姓名、选课数和总成绩
select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩
from student2 as a left join score2 as b
on a.学号=b.学号
group by a.学号;
-- (2)查询平均成绩大于85的所有学生的学号、姓名和平均成绩。
select a.学号,a.姓名 ,avg(b.成绩) as 平均成绩
from student2 as a left join score2 as b
on a.学号=b.学号
group by a.学号
having 平均成绩>85;
-- (3)查询学生的选课情况:学号,姓名,课程号,课程名称
select a.学号,a.姓名,c.课程号,c.课程名称
from student2 as a inner join score2 as b
on a.学号=b.学号
inner join course2 as c on b.课程号=c.课程号;
-- case 表达式
-- (4)判断学生的成绩是合格还是不合格
select 学号,课程号,成绩,(
case when 成绩>=60 then '及格'
when 成绩<60 then '不及格'
end) as 是否合格
from score2;
-- (5)查询每门课程的及格人数和不及格人数
select 课程号,sum(
case when 成绩>=60 then 1
else 0
end) as 及格人数,
sum(
case when 成绩<60 then 1
else 0
end
) as 不及格人数
from score2
group by 课程号;
-- (6)使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,
-- 统计对应课程号、课程名称下各分数段人数。
select a.课程号,b.课程名称,sum(
case when a.成绩>85 and a.成绩<=100 then 1
else 0 end ) as 优秀人数,sum(
case when a.成绩>70 and a.成绩<=85 then 1
else 0 end ) as 良好人数,sum(
case when a.成绩>60 and a.成绩<=70 then 1
else 0 end ) as 中等人数,sum(
case when a.成绩<=60 then 1
else 0 end ) as 60及以下人数
from score2 as a inner join course2 as b
on a.课程号=b.课程号
group by a.课程号,b.课程名称;
本文为猴子live讲座的笔记,MySQL知识点参考猴子课件,知识点汇总如下: