数据库语句(三)

最后是分两个模块,一个是数据的更新(插入,修改,删除),预计数据定义的第四个模——视图(因为这个比较大块,所以分开来了),首先说说我们的数据更新

插入数据

v  两种插入数据方式

1. 插入元组

2. 插入子查询结果

  • 可以一次插入多个元组

 

我们先说插入元组:

v  语句格式

         INSERT

         INTO <表名> [(<属性列1>[,<属性列2 >…)]

         VALUES (<常量1> [,<常量2>]    …           )

v  功能

n  将新元组插入指定表中

v  INTO子句

n  属性列的顺序可与表定义中的顺序不一致

n  没有指定属性列

n  指定部分属性列

v   VALUES子句

n   提供的值必须与INTO子句匹配

v  值的个数

v  值的类型

v  [例1]  将一个新学生元组(学号:200215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。

v      INSERT

v      INTO  Student (Sno,Sname,Ssex,Sdept,Sage)

v      VALUES ('200215128','陈冬','男','IS',18);

 

 

v  [例2]  将学生张成民的信息插入到Student表中。

v        INSERT

v                 INTO  Student

v                 VALUES (‘200215126’, ‘张成民’, ‘男’,18,'CS');

 

这边说说插入子查询结果

 

 

说完数据的插入,然后就说说修改数据了

 

(修改某一个元组的值)

将学生200215121的年龄改为22

         UPDATE  Student

         SET Sage=22

         WHERE  Sno=' 200215121 '

(修改多个元组的值)

[6]  将所有学生的年龄增加1

         UPDATE Student

         SET Sage= Sage+1

(带有子查询的修改语句)

[7]  将计算机科学系全体学生的成绩置零。

        UPDATE SC

        SET  Grade=0

        WHERE  'CS'=

                       (SELETE Sdept

                        FROM  Student

                        WHERE  Student.Sno = SC.Sno)

 

 

最后就说数据更新的最后一部分,删除数据

 

(删除某一个元组的值)

[8]  删除学号为200215128的学生记录。

        

       DELETE

         FROM Student

         WHERE Sno= 200215128 ';

  

 

(删除多个元组的值)

[9]  删除所有的学生选课记录。

     

   DELETE

        FROM SC;

  

 

(带有子查询的删除语句)

10]  删除计算机科学系所有学生的选课记录。

       

 DELETE

        FROM SC

        WHERE  'CS'=

                           (SELETE Sdept

                            FROM Student

                            WHERE Student.Sno=SC.Sno);

 

  

 

 

终于来到这一个章节最后一部分,视图,首先我们说说视图的特点:

虚表,是从一个或几个基本表(或视图)导出的表

只存放视图的定义,不存放视图对应的数据

基表中的数据发生变化,从视图中查询出的数据也随之改变

 

 

而我们得到视图之后,我们还可以对视图再次操作,其操作的种类有:

查询

 删除

 受限更新

 定义基于该视图的新视图

 

 

好了,说了一点皮毛的东西,现在我们说说定义视图(分建立和删除):

建立:

语句格式

       CREATE  VIEW

             <视图名>  [(<列名>  [<列名>]…)]

       AS  <子查询>

       [WITH  CHECK  OPTION]

组成视图的属性列名:全部省略或全部指定

子查询不允许含有ORDER BY子句和DISTINCT短语

WITH CHECK OPTION表示对视图进行UPDATEINSERTDELETE 操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。

 

 

以下三种情况必须指定所有列名

1)目标列不是单纯属性名,而是聚集函数或列表达式;

2)多表连接时选出了几个同名列;

3)需要在视图中启用新的更合适的名字。

 

 

RDBMS执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。

在对视图查询时,按视图的定义从基本表中将数据查出。

例子:

[1]  建立信息系学生的视图。

     

   CREATE VIEW IS_Student

        AS

        SELECT Sno,Sname,Sage

        FROM    Student

        WHERE  Sdept= 'IS';

  

 

[2]建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生

      

  CREATE VIEW IS_Student

        AS

        SELECT Sno,Sname,Sage

        FROM  Student

        WHERE  Sdept= 'IS'

        WITH CHECK OPTION;

  

 

 

(基于多个基表的视图)

[3]  建立信息系选修了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]  建立信息系选修了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,2000-Sage

        FROM  Student;

  

 

 

(分组视图)

[6]  将学生的学号及他的平均成绩定义为一个视图

                假设SC表中“成绩”列Grade为数字型

     

       CREATE  VIEW S_G(Sno,Gavg)

             AS 

             SELECT Sno,AVG(Grade)

             FROM  SC

             GROUP BY Sno;

  

 

(不指定属性列)

[7]Student表中所有女生记录定义为一个视图

  

    CREATE VIEW F_Student(F_Sno,name,sex,age,dept)

      AS

      SELECT *

      FROM  Student

      WHERE Ssex=‘女’;

  

     缺点:

     修改基表Student的结构后,Student表与F_Student视图的映象关系被破坏,导致该视图不能正确工作

 

 

 

 

 

 

说了那么多创建,下面我们说说删除视图:

语句的格式:

                  DROP  VIEW  <视图名>

  • 该语句从数据字典中删除指定的视图定义
  • 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
  • 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除

[例8  删除视图BT_S DROP VIEW BT_S

              

              删除视图IS_S1DROP VIEW IS_S1

  • 拒绝执行
  • 级联删除:

                     DROP VIEW IS_S1 CASCADE;      

 

 

 

 

 

说完了定义视图的创建与删除,下面我们进入到第二大模块,查询视图:

用户角度:查询视图与查询基本表相同

RDBMS实现视图查询的方法

  • 视图消解法(View Resolution
    • 进行有效性检查
    • 转换成等价的对基本表的查询
    • 执行修正后的查询

[9]  在信息系学生的视图中找出年龄小于20岁的学生。

        SELECT   SnoSage

        FROM      IS_Student

        WHERE   Sage<20

IS_Student视图的定义 (参见视图定义例1)

 

视图消解转换后的查询语句为:

 SELECT  Sno,Sage      

 FROM  Student

 WHERE  Sdept= 'IS'  AND  Sage<20;

  

视图消解法的局限

  • 有些情况下,视图消解法不能生成正确查询。

 

第三大块,更新视图:

[12]  将信息系学生视图IS_Student中学号200215122的学生姓名改为“刘辰”。

(修改某个值)

UPDATE  IS_Student

SET  Sname= '刘辰'

WHERE  Sno= ' 200215122 ';

转换后的语句:

UPDATE  Student

SET Sname= '刘辰'

WHERE Sno= ' 200215122 ' AND Sdept= 'IS';

  

 

(增加记录)

[13]  向信息系学生视图IS_S中插入一个新的学生记录:200215129,赵新,20

INSERT

INTO IS_Student

VALUES(‘95029’,‘赵新’,20);

转换为对基本表的更新:

INSERT

INTO   Student(Sno,Sname,Sage,Sdept)

VALUES(‘200215129 ','赵新',20,'IS' );

  

 

(删除记录)

[14]删除信息系学生视图IS_Student中学号为200215129的记录

DELETE

FROM IS_Student

WHERE Sno= ' 200215129 ';

转换为对基本表的更新:

DELETE

FROM Student

WHERE Sno= ' 200215129 ' AND Sdept= 'IS';

  

 

更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新

允许对行列子集视图进行更新

对其他类型视图的更新不同系统有不同限制

 

 

 

 

最后说说视图的作用:

1. 视图能够简化用户的操作

2. 视图使用户能以多种角度看待同一数据

3. 视图对重构数据库提供了一定程度的逻辑独立性

4. 视图能够对机密数据提供安全保护

5. 适当的利用视图可以更清晰的表达查询

 

posted @ 2017-12-12 23:11  鹏达君  阅读(796)  评论(0编辑  收藏  举报