实验三 嵌套查询和视图操作
实验目的:
1. 通过本实验能够熟练应用sql语言使用IN、比较符、ANY或ALL和EXISTS操作符进行嵌套查询操作。
2. 掌握视图的定义、查询、修改。
实验要求:
1. 在进行本实验之前,应熟练课程内容,在上机之前做好实验计划,编写好相应的代码。
2. 认真填写实验报告,记录所有实验用例。
实验内容:
(一) 嵌套查询
1.求选修了’MA’的学号和姓名。(信息系统)
select sno, sname from student where sno in (select sno from sc where cnoin (select cno from course where cname='信息系统'));
SNO SNAME
--------- --------
20070001 李佳
20070003 王添
2.查询与刘晨在同一个系学习的学生。
SQL> select * from student where sdept=(select sdept from student wheresname='李佳');
SNO SNAME SSEX SAGE SDEPT
--------- -------- ---- ---- --------------------
20070001 李佳 女 20 MA
20070003 王添 男 18 MA
20070006 张力 男 19 MA
224129 庞阿男 男 22 MA
3. 求选修1号课程的成绩高于刘晨的成绩(指刘晨选修的所有的课程的成绩)的学生学号及成绩。(李佳)
SQL> select sno,grade from sc where cno='1' and grade >(selectmax(grade) from sc where sno=(select sno from student where sname='李佳'));
SNO GRADE
--------- -----
224128 100
4. 求其他系中比计算机系某一学生年龄小的学生(即年龄小于计算机系年龄最大者的学生)。
select * from student where sdept<>'MA' and sage<(selectmax(sage) from student where sdept='MA');
SNO SNAME SSEX SAGE SDEPT
--------- -------- ---- ---- --------------------
20070004 张力 女 21 IS
20070005 张力 女 19 CS
224128 庞振男 女 20 IT
5. 求其他系中比计算机系学生年龄都小的学生姓名及年龄。
SQL> select sname, Sage from student where sdept<>'CS' andsage<(select min(sage) from student where sdept='CS');
SNAME SAGE
-------- ----
王添 18
6. 求没有选修3号课程的学生姓名。
SQL> select sname from student where sno not in(select sno from scwhere cno='3');
SNAME
--------
张力
张力
张力
庞振男
庞阿男
nana
6 rows selected
7. 查询选修了全部课程的学生姓名。
SQL语言中没有全称量词∨(,all)。但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词。(∨x)P≡∟(exists x(∟P))
SQL> select sname from student where not exists (select * from coursewhere not exists (select * from sc where sno=student.sno and cno=course.cno));
SNAME
--------
李佳
试做:查询所有学生都选修的课程名
试做:
SQL> select cname from course where not exists(select * from studentwhere not exists (select * from sc where sno=student.sno and cno=course.cno));
CNAME
--------------------
数据库原理
DB
8. 求至少选修了学号为“200215121”的学生所选修全部课程的学生学号和姓名。
首先看学号为“200215122”的学生是否选修了学号为“200215121”这个学生所修的全部课程;
即:当200215122号学生没有没选200215121所选的课程时,即200215122全选了200215121同学选修的全部课程。
select * from sc a wherea.sno='200215121' and not exists(select * from sc b where b.sno='200215122' anda.cno=b.cno);
扩展到所有的学生
select sno,sname from student where not exists (select * from sc a wherea.sno='200215122' and not exists(select * from sc b where b.sno=student.sno anda.cno=b.cno));
9. 求选修课程超过2门的学生的学号和姓名。
SQL> select sno,sname from student where sno in (select a.sno from sca,sc b where a.sno=b.sno and a.cno<>b.cno);
SNO SNAME
--------- --------
20070001 李佳
20070003 王添
借助于笛卡尔积(求的是选修课程大于等于两门的学生)
SQL> select sno,sname from student where sno in (select sno from scgroup by sno having count(*)>2);
SNO SNAME
--------- --------
20070003 王添
20070001 李佳
借助于聚集函数,此种方法更好一些
二、数据更新
1.插入数据
1)向Student表中插入2行数据,1行为你的信息,另一行自定。
SQL> insert into student (sno,sname,ssex,sage,sdept) values (224128,'庞振男','女',20,'IT');
1 row inserted
SQL> insert into student (sno,sname,ssex,sage,sdept) values (224129,'庞阿男','男',22,'MA');
1 row inserted
SQL> commit;
Commit complete
2)向Course表中插入2行数据,1行为本门课程的信息,另一行自定。
SQL> insert into course (cno,cname,cpno,ccredit)values(001,'DB','002',3);
1 row inserted
SQL> insert into course (cno,cname,cpno,ccredit)values(002,'OS','003',4);
1 row inserted
SQL> commit;
Commit complete
3)向SC表中插入数据,插入你的这门课程的选课信息。
SQL> insert into sc (sno,cno,grade) values(224128,001,100);
1 row inserted
SQL> commit;
Commit complete
2.修改数据
1)将姓刘的同学删除。
SQL> delete from student where sno in (select sno from student wheresname like '刘%');
1 row deleted
SQL> commit;
Commit complete
或者:
deletefrom student where sname like '刘%';
2)将’CS’系同学的选课信息中的成绩置0。
SQL> update sc set grade=0 where sno in (select sno from student wheresdept='CS');
1 row updated
SQL> commit;
Commitcomplete
3.删除数据
1)删除和’ 刘晨’在同一个系的学生的信息。
SQL> delete from student where sdept=(select sdept from student wheresname='李佳');
4 rowsdeleted
SQL> commit;
Commitcomplete
2)删除’CS’系同学的选课信息。
SQL> delete from sc where sno in (select sno from student wheresdept='CS');
1 row deleted
SQL> commit;
Commitcomplete
在插入修改删除数据时,一定不要忘记commit;