数据库实验三 嵌套查询和视图操作

实验三 嵌套查询和视图操作

实验目的:

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;

 

你可能感兴趣的:(数据库)