数据库原理及应用——数据更新和视图创建

实验三  数据更新和视图创建

一、实验目的:

  1. 熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、修改、删除操作;
  2. 熟悉SQL语言有关视图的操作,能够熟练使用SQL语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。

 二、实验要求:

(1)针对“学生课程SC”数据库设计单元组插入、批量数据插入、修改数据和删除数据等SQL语句。理解和掌握INSERT、UPDATE和DELETE语法结构的各个组成成分,结合嵌套SQL子查询,分别设计几种不同形式的插入、修改和删除数据的语句,并调试成功。

(2)针对给定的数据库模式,以及相应的应用需求,创建视图、创建带WITH CHECK OPTION的视图,并验证视图WITH CHECK OPTION选项的有效性。理解和掌握视图消解执行原理,掌握可更新视图和不可更新视图的区别。

 三、实验重点和难点:

实验重点:

(1)插入、修改和删除数据的SQL。

(2)创建视图。

实验难点:

  1. 与嵌套SQL子查询相结合的插入、修改和删除数据的SQL语句;利用一个表的数据来插入、修改和删除另外一个表的数据。
  2. 可更新的视图和不可更新的视图之区别, WITH CHECK OPTION的验证。

 四、相关知识:(电子教材:P113---P127)

SQL Server提供了很多方法更新表中数据。以插入记录为例,可以使用INSERT语句、VALUES子句将特定值集合插入一行;可以使用数据库接口API(ADO、OLE DB、ODBC和DB-Library)中的函数进行数据插入等。本实验主要掌握INSERT、UPDATE和DELETE语句的基本用法。

(1)插入操作,其语句的一般格式为

INSERT INTO table_or_view [(colum_list)]

VALUES (date_values);

此语句是使date_values作为一行数据记录插入已命名的表或视图table_or_view中。

Column_list是由逗号分隔的table_or_view的列名列表,用来指定为其提供数据的列。如果没有指定column_list,表或视图中的所有列都将接收数据。

如果column_list没有为表或视图中的所有列命名,将在列表中没有命名的任何列中插入一个NULL值(或者在默认情况下为这些列定义的默认值)。在列的列表中没有指定的所有列都必须允许NULL值或者指定的默认值。否则SQL Server将返回一个错误。

(2)修改操作语句的一般格式为

UPDATE  表名 SET  <列名>=<表达式>[,<列名>=<表达式>]……

[where  <条件>];

其功能是修改指定表中满足WHERE子句条件的元组。其中SET子句用于指定修改方法,即用<表达式>的值取代相应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组。

(3)删除语句的一般格式为

DELETE FROM  <表名>

[WHERE <条件>];

其功能是从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句,则表示要删除表中的所有元组,但表的定义仍在字典中。

(4)视图

视图是根据子模式建立的虚拟表。一个视图可以由一个表构造,也可以由多个表构造。利用集成管理中心和视图创建向导进行创建,查看和修改视图就如同对表的操作一样,非常容易。

视图一经定义,就可以和基本表一样被查询、删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

视图的作用因应用需求的使用差异性而不同程度地体现。

 五、实验内容

(1)所使用的学生管理库中的三张表:

1、STUDENT(学生信息表)

SNO(学号)

SNAME(姓名)

SEX(性别)

SAGE(年龄)

SDEPT(所在系)

95001

李勇

20

CS

95002

刘晨

19

IS

95003

王名

18

MA

95004

张立

19

IS

95005

李明

22

CS

95006

张小梅

23

IS

95007

封晓文

20

MA

2.COURSE(课程表)

CNO(课程号)

CNAME(课程名)

CPNO(先行课)

CCREDIT(学分)

1

数据库

5

4

2

数学

2

3

信息系统

1

4

4

操作系统

6

3

5

数据结构

7

4

6

数据处理

2

7

PASCAL语言

6

4

3、SC(选修表)

SNO(学号)

CNO(课程号)

Grade(成绩)

95001

1

92

95001

2

85

95001

3

88

95002

2

90

95002

3

80

95003

1

78

95003

2

80

95004

1

90

95004

4

60

95005

1

80

95005

3

89

95006

3

80

95007

4

65

(2)数据更新具体完成以下例题:

1.插入一条学号为“95050”,姓名为“陈冬”的选课记录。

注:除学号、姓名为真实数据,其他数据随意。

insert

     into student(Sno,Sname,Ssex,Sage,Sdept)

     values('95050','陈冬','男','18','IS');

2.将一新学生记录(学号:99999;姓名:风清扬;性别:男;年龄:20;所在系: 

计算机科学与技术系’CS’)插入学生表中;

插入一条该生选课记录(‘99999’,’4’,’60’)。

insert

     into student

     values('99999','风清扬','男','20','CS');

insert

     into sc

     values('99999','4','60');

 3.对每一个系,求学生的平均年龄,并把结果存入数据库。

(提示:对于这道题,首先要在数据库中建立一个有两个属性列的新表,其中一列存放系名,另一列存放相应系的学生平均年龄。

CREATE TABLE Deptage(所在系 CHAR(20),平均年龄SMALLINT);

然后对数据库的学生表按所在系分组求平均年龄,再把所在系和平均年龄存入新表中。)

create table Dept_age

     (Sdept char(15),

      Avg_age smallint);

insert

     into dept_age(Sdept,Avg_age)

     select Sdept,avg(Sage)

     from student

     group by Sdept;

 4.将学号“95001”的学生年龄改为22岁。

update student

     set Sage=22

     where Sno='95001';

5.将所有学生的年龄增加一岁。

update student

      set Sage=Sage+1;

6.将课程“数据库”的成绩用五级制显示,成绩>=90为优秀,90>成绩>=80为良好,80>成绩>=70为中等,70>成绩>=60为及格,成绩<60为不及格。

select Sno,Cno,

     (case when grade>=90 then'优秀'when grade>=80 then'良好'

     when grade>=70 then'中等'when grade>=60 then'及格'else'不及格'end)as grade

     from sc

     where Cno='1';

 

7.将计算机科学系“CS”全体学生的成绩置零。

select Sno,Cno,

     (case when grade>=90 then'优秀'when grade>=80 then'良好'

     when grade>=70 then'中等'when grade>=60 then'及格'else'不及格'end)as grade

     from sc

     where Cno=

           (select Cno

            from course

            where Cname='数据库');

8.删除“信息系统”课程成绩小于李明学生成绩的记录。

delete

from sc

where Sno in(

select Sno

from sc

where (Grade<(

       select Grade

       from sc

       where Sno=(

           select Sno

           from student

           where Sname='李明')

       and (Cno=(

           select Cno

           from course

           where Cname='信息系统')

           )

       ))

)

 

9.删除学号为“95006”的学生记录。(提示:注意外键的约束

set foreign_key_checks=0;

delete

    from student

    where Sno='95006';

set foreign_key_checks=1;

10. 删除计算机科学系“CS”所有学生的选课记录

delete

    from sc

    where Sno in

          (select Sno

           from student

           where Sdept='CS');

(3)视图操作具体完成以下例题:

1. 建立信息系“IS”学生的视图

create view IS_Student

    as

    select Sno,Sname,Ssex,Sage

    from student

    where Sdept='IS';

 

2.建立信息系IS”学生的视图,并要求进行修改和插入操作时仍须保证该视图只有信息系的学生。

create view IS_student

    as

    select Sno,Sname,Ssex,Sage

    from student

    where Sdept='IS'

    with check option;

 

3.建立信息系IS”选修了“1”号课程的学生视图

create view IS_S1(Sno,Sname,Grade)

    as

    select student.Sno,Sname,Grade

    from student,sc

    where Sdept='IS'

           and student.Sno=sc.Sno

           and sc.Cno='1';

4. 建立信息系IS”选修了“1”号课程且成绩在90分以上的学生视图

create view IS_S2

    as

    select Sno,Sname,Grade

    from is_s1

    where Grade>=90;

5. 定义一个反映学生出生年份的视图(提示:将年龄数值属性体现为“出生年份”

create view BT_S(Sno,Sname,Sbirth)

    as

    select Sno,Sname,2021-Sage

    from student;

 

六、实验结果与分析(概括、分析与总结):

上述结果中,部分题有多解法,这里只写了一种方法,运用到一些关键词update、delete等,以及创建视图create view……,其中还用了一些语句加以修饰,例如:with check option可以表示对视图进行更改等操作时要保证更新、插入或删除的行满足视图定义中的谓词条件;set foreign_key_checks=0可以在删除元组时关闭外键的介入进而删除元组,删除后在等于1即可;这些关键词等,可以轻松的解决题目。

七、实验心得:

本次实验,将本节的数据更新以及视图进行实践。通过实践,不仅可以加强对查询语句的记忆以及其他关键词的用法,使得mysql语句有了更深的记忆,其次对插入、删除或更新等关键词有了进一步的使用,还进而学习到了创建视图。对本次实验,收获颇多,对于今后的学习有了更好的理解和帮助。

おすすめ

転載: blog.csdn.net/weixin_48388330/article/details/122513219