sql 数据查询练习 实验题

表:
在这里插入图片描述


查询同时选修“01”号课程和“02”号课程的所有学生的学号;

select s1.sno 
from sc s1, sc s2 
where s1.sno = s2.sno and s1.cno = '01' and s2.cno = '02';

按照院系降序显示所有学生的 “院系,学号、姓名、性别、年龄”等信息,其中院系按照以下规定显示:院系为CS显示为计算机系,院系为IS显示为信息系,院系为MA显示为数学系,院系为EN显示为外语系,院系为CM显示为中医系,院系为WM显示为西医系,其他显示为院系不明;

select 
	case sdept
		when 'CS' then '计算机系'
		when 'IS' then '信息系'
		when 'MA' then '数学系'
		when 'EN' then '外语系'
		when 'CM' then '中医系'
		when 'WM' then '西医系'
		else '院系不明'
	end 院系, sno 学号, sname 姓名, ssex 性别, sage 年龄
from student
order by sdept desc;

查询所有院系(要求不能重复,不包括空值),并在结果集中增加一列字段“院系规模”,其中若该院系人数>=5则该字段值为“规模很大”,若该院系人数大于等于4小于5则该字段值为“规模一般”, 若该院系人数大于等于2小于4则该字段值为“规模稍小”,否则显示“规模很小”;

select sdept 院系,
	case 
		when count(*) >= 5 then '规模很大'
		when count(*) >= 4 then '规模一般'
		when count(*) >= 2 then '规模稍小'
		else '规模很小'
	end 院系规模
from student
where sdept is not null
group by sdept;

查询学生信息表中的学生总人数及平均年龄,在结果集中列标题分别指定为“学生总人数,平均年龄”;

select count(*) 学生总人数, avg(sage) 平均年龄
from student;

查询选修的课程数大于3的各个学生的选修课程数;

select sno 学号, count(*) 选修课程数
from sc
group by sno
having 选修课程数 > 3;

查询平均成绩大于“赵菁菁”平均成绩的各个学生的学号、平均成绩;

select sno 学号, avg(grade) 平均成绩
from sc
group by sno
having avg(grade) >
(
	select avg(grade)
	from student, sc
	where student.sno = sc.sno and student.sname = '赵菁菁'
)

查询每个院系的学生前两条记录,并组成新表ceshi;

create table ceshi
	select * 
	from student s
	where sdept is not null 
	and 2 >
	(
		select count(*) from student
		where sdept = s.sdept and sno < s.sno
	)
	order by s.sdept;

在这里插入图片描述


查询选修了‘数学’或者‘大学英语’的学生学号、姓名、所在院系、选修课程号及成绩;

select s.sno, s.sname, s.sdept, sc.cno, sc.grade
from student s, sc
where sc.sno = s.sno and s.sno in
(
	select s.sno 
	from course c, student s, sc 
	where sc.sno = s.sno and sc.cno = c.cno 
		and (c.cname = '数学' or c.cname = '大学英语')
);

查询与‘张力’(假设姓名唯一)年龄不同的所有学生的信息;

select * 
from student
where sage <>
(
	select sage
	from student
	where sname = '张力'
);

按照“学号,姓名,所在院系,已修学分”的顺序列出学生学分的获得情况。其中已修学分为考试已经及格的课程学分之和;

select s.sno 学号, s.sname 姓名, s.sdept 所在院系, sum(c.ccredit) 已修学分
from student s, course c, sc
where s.sno = sc.sno and c.cno = sc.cno and sc.grade >= 60
group by s.sno;

查找选修了至少一门和张力选修课程一样的学生的学号、姓名及课程号;

select s.sno 学号, s.sname 姓名, sc.cno 课程号
from student s, sc
where s.sno = sc.sno and s.sno in
(
	select s.sno
	from student s, sc
	where s.sno = sc.sno and sc.cno in
	(
		select sc.cno
		from sc, student s
		where s.sno = sc.sno and s.sname = '张力'
	)
);

查询只被一名学生选修的课程的课程号、课程名;

select cno, cname
from course
where cno in
(
	select cno
	from sc
	group by cno
	having count(*) = 1
);

使用嵌套查询出选修了“数据结构”课程的学生学号和姓名;

select sno, sname
from student
where sno in
(
	select s.sno
	from student s, sc, course c
	where sc.sno = s.sno and sc.cno = c.cno and c.cname = '数据结构'
);

使用嵌套查询查询其它系中年龄小于CS系的某个学生的学生姓名、年龄和院系;

select sno, sage, sdept
from student
where sdept <> 'CS' and sage < any(
	select sage 
	from student 
	where sdept = 'CS'
);

显示选修各个课程的及格的人数,及格比率;

select cno, sum(case when grade >= 60 then 1 else 0 end) 及格人数,
	sum(case when grade >= 60 then 1 else 0 end) / count(*) 及格比率
from sc
group by cno;

使用ANY、ALL 查询,列出其他院系中比WM系所有学生年龄小的学生的姓名;

select sname 
from student
where sage < all(
	select sage
	from student
	where sdept = 'WM'
);

显示各个院系男女生人数,其中在结果集中列标题分别指定为“院系名称、男生人数、女生人数”;

select sdept 院系名称,
	sum(case ssex when '男' then 1 else 0 end) 男生人数,
	sum(case ssex when '女' then 1 else 0 end) 女生人数
from student
group by sdept;

列出有二门以上课程(含两门)不及格的学生的学号及该学生的平均成绩;

select sno, avg(grade)
from sc 
group by sno
having sum(case when grade < 60 then 1 else 0 end) >= 2;

显示选修课程数最多的学号及选修课程数最少的学号;

select sno, count(*)
from sc
group by sno
having count(*) >= all(select count(*) from sc group by sno)
	or count(*) <= all(select count(*) from sc group by sno);

修改student表,将cs系姓名为“李咏”的学生姓名为“李勇”;

update student
set sname = '李勇'
where sname = '李咏' and sdept = 'CS';

将学号为“200515010”的学生信息重新设置为“王丹丹、女、20、MA”;

update student
set sname = '王丹丹', ssex = '女', sage = 20, sdept = 'MA'
where sno = '200515010';

修改course表,将“数据处理”的学分改为3学分;

update course
set ccredit = 3
where cname = '数据处理';

修改sc表,将选修课程“01”的同学成绩加5分;

update sc
set grade = grade + 5
where cno = '01';

删除数据表student中无专业的学生记录;

delete
from student
where sdept is null;
  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zyh_fighting

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

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

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

打赏作者

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

抵扣说明:

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

余额充值