实验二
(一)包括排序、分组的单表查询
1.求数学系学生的学号和姓名。
select Sno,Sname from Student where Sdept='MA';
2.求选修了课程的学生学号。
select distinct Sno from SC;
3.求选修课程号为‘2’的学生号和成绩,并要求对查询结果按成绩的降序排列,如果成绩相同按学号的升序排列。
select Sno,Grade from SC where Cno='2' order by Grade desc,Sno asc;
4.求选修课程号为’2’且成绩在80~90之间的学生学号和成绩,并将成绩乘以0.8输出。
select Sno,0.8*Grade from SC where Cno='2' and Grade between 80 and 90;
*5.求数学系或计算机系姓张的学生的信息。
select * from Student where Sdept in('MA','CS') or Sname like '张_%';
*6.求缺少了成绩的学生的学号和课程号。
select Sno,Cno from SC where Grade is null;
*7.查询各个课程号与相应的选课人数。
select cno,count(*) from SC group by cno;
(二) 多表连接查询
1.查询每个学生的情况以及他所选修的课程。
select * from Student,SC where Student.Sno=SC.Sno;
2.求学生的学号、姓名、选修的课程及成绩。
select Student.Sno,Student.Sname,SC.Cno,SC.Grade from Student,SC where Student.Sno=SC.Sno;
3.求选修课程号为‘1’且成绩在90分以上的学生学号、姓名和成绩。
select Student.Sno,Student.Sname,SC.Grade from Student,SC where Student.Sno=SC.Sno and SC.Cno='1';
*4.查询每一门课程的间接先行课。
Select First.Cno,Second.Cpno From Course First,Course Second Where First.Cpno=Second.Cno;
*5.查询与’刘晨’在同一个系学习的学生。
select s1.* from Student s1,Student s2 where s1.Sdept=s2.Sdept and s2.Sname='刘晨';
*6.查询选修了课程名为‘信息系统‘的学生学号和姓名。
select Student.Sno,Student.Sname from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Course.Cname='信息系统';
7.查询平均成绩在80分以上的学生学号和平均成绩。
select Sno,avg(Grade) from SC group by Sno having avg(Grade)>80;
8.查询选修了1门以上课程的学生的学号。
select Sno,count(*) from SC group by Sno having count(*)>1;
(三) 嵌套查询
1.求选修了信息系统的学号和姓名。
select Sno,Sname from Student where Sno in(select Sno from SC where Cno=(select Cno from Course where Cname='信息系统'));
2.查询与刘晨在同一个系学习的学生。
select * from Student where Sdept in(select Sdept from Student where Sname='刘晨');
3.求选修1号课程的成绩高于刘晨的成绩(指刘晨选修的所有的课程的成绩)的学生学号及成绩。
select Sno,Grade from SC where Cno='1' and Grade> (select max(Grade) from SC where Sno=(select Sno from Student where Sname='刘晨'));
4.求其他系中比计算机系某一学生年龄小的学生(即年龄小于计算机系年龄最大者的学生)。
select * from Student where Sdept!='CS' and Sage < (select max(Sage) from Student where Sdept='CS');
5.求其他系中比计算机系学生年龄都小的学生姓名及年龄。
select Sname,Sage from Student where Sdept!='CS' and Sage < (select min(Sage) from Student where Sdept='CS');
6.求没有选修3号课程的学生姓名。
select Sname from Student where Sno in(select Sno from SC where Cno!='3');
*7.查询选修了全部课程的学生姓名。
select Sname from Student where not exists(select * from Course where not exists(select * from SC where Sno=Student.Sno and Cno=Course.Cno));
SQL语言中没有全称量词∨(,all)。但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词。(∨x)P≡∟(exists x(∟P))
试做:查询所有学生都选修的课程名
select Cname from Course where not exists(select * from Student where not exists(select * from SC where Sno=Student.Sno and Cno=Course.Cno));
*8.求至少选修了学号为“200215121”的学生所选修全部课程的学生学号和姓名。
select Sno,Sname from Student where Sno in(select distinct Sno from SC s1 where not exists(select * from SC s2 where s2.Sno='200215121' and not exists(select * from SC s3 where s1.Sno=s3.Sno and s2.Cno=s3.Cno)));
9.求选修课程超过2门的学生的学号和姓名。
select Sno,Sname from Student where Sno in(select Sno from SC group by Sno having count(*)>2);
(四) 视图
1. 建立信息系学生的视图。并查询此视图,观察结果。
create view StuView (Sno,Sname,Ssex,Sage) as select Sno,Sname,Ssex,Sage from Student where Sdept='IS';
select * from StuView;
2.(在视图上建立)建立信息系选修了1号课程的学生的视图。查询此视图,并观察结果。
create view StuView_1 (Sno,Sname,Ssex,Sage,Grade) as select StuView.Sno,Sname,Ssex,Sage,Grade from StuView,SC where Cno='1';
select * from StuView_1;
3.将学生的学号及其平均成绩定义为一个视图。查询此视图,观察结果。
create view StuAvg (Sno,Avg) as select Sno,avg(Grade) from SC group by Sno;
select * from StuAvg;
4.将Student表中所有女生记录定义为一个视图F_stu(sno,sname,sdept,sex),并设置其更新限制with check option。
create view F_stu (sno,sname,sdept,sex) as select Sno,Sname,Sdept,Ssex from Student where Ssex='女' with check option;
5.对4中的视图进行insert操作,将sno为200215129,sname为‘smith’,sdept为‘MA’插入视图中,结果如何?
insert into F_stu (sno,sname,sdept,sex) values ('200215129','smith','MA'); 插入失败
6. 对4中的视图进行insert操作,将sno为200215129,sname为‘smith’,sdept为‘MA’,sex为‘女’插入视图中,结果如何?
insert into F_stu (sno,sname,sdept,sex) values ('200215129','smith','MA','女'); 插入成功
5.6有什么区别?
提示内容:
Create View <视图名>[(<列名>[,<列名>]…)
AS <子查询>
[ With CHECK OPTION];
视图:视图子查询中允许任意复杂的SELECT语句,但通常不允许含有Order By子句和distinct短语。
组成视图的属性列名或者全部省略,或者全部指定。
一下三种情况必须明确指定组成视图的所有列名:
1)某个目标列不是单纯的属性名,而是聚集函数或列表达式。
2)多表连接时选出了几个同名列作为视图的字段。
3)需要为某个列启用新的更合适的名字。
With CHECK OPTION 表示对视图进行update、insert、delete操作时要保证更新、插入或删除的行满洲子查询中的条件表达式。
(五)思考题:
1.Where子句中能否用聚集函数作为条件表达式。
2.多表连接查询中如果显示的某一属性不止一个表中出现,应如何处理。(例:(二)多表连接查询中的第2题)。
3.在嵌套查询中,什么情况下用“IN”和“=”都可以。