一、实验目的
- 熟练掌握数据查询中的分组、统计、计算和组合的操作方法;
- 进一步掌握 SQL Server 查询分析器的使用,加深对 SQL 语言的嵌套查询语句的理解。
二、实验准备
- 了解 SELECT 语句的 GROUP BY 和 ORDER BY 子句的作用;
- 了解统计函数和分组统计函数的使用方法;
- 熟悉查询分析器的运行环境。
三、实验要求
- 在实验之前做好准备;
- 注意操作结果的截图与保存,供撰写实验报告使用。
四、实验内容
在数据库 EDUC 中用 SQL 语句实现如下查询:
- 查询学生的总人数;
- 查询选修了课程的学生人数;
- 查询课程的课程号和选修该课程的人数;
- 查询选修课程超过 2 门课的学生学号和姓名;
- 查询没有选修“0001”号课程的学生姓名;
- 查询选修了全部课程的学生姓名;
- 查询至少选修了学号为“20170102”的学生选修的全部课程的学生学号;
- 查询“王军”和“李杰”都选修的课程编号。
五、实验步骤
--查询学生的总人数
select count(*) from student
--查询选修了课程的学生人数
select count(distinct Sno) from sc
--查询课程的课程号和选修该课程的人数
select Cno,count(Sno) from sc group by Cno
--查询选修课程超过 2 门课的学生学号和姓名
select student.sno,sname
from student
where sno in(
select sno
from sc
group by sno
having count(cno)>2)
--查询没有选修“0001”号课程的学生姓名
select distinct Sname from student,sc where student.Sno=sc.Sno and Cno!='0001'
--查询选修了全部课程的学生姓名
select Sname
from Student
where not exists(
select *
from course
where not exists(
select *
from sc
where sc.Sno = student.Sno and sC.Cno = course.Cno
)
)
--查询至少选修了学号为“20170102”的学生选修的全部课程的学生学号
select distinct Sno
from sc scx
where not exists
(
select *
from sc scy
where scy.Sno='20170102' and not exists
(
select *
from sc scz
where scz.Sno=scx.Sno and
scz.Cno=scy.Cno
)
)
--查询“王军”和“李杰”都选修的课程编号
select cno from student,sc
where student.Sno = sc.Sno and Sname = '王军'
intersect
select cno from student,sc
where student.Sno = sc.Sno and Sname = '李杰';