笔记 ~ 第三章 - 3.3 空值处理、数据更新与视图

目录

1. 空值的处理

(1)空值的处理

(2)空值的产生

(3)空值的判断

(4)空值的约束条件

(5)空值的算术、比较、逻辑运算

2. 数据更新

(1)插入数据

     ① 插入元组

     ② 插入子查询结果

(2)修改数据

(3)删除数据

3. 视图

(1)定义视图

    ① 建立视图

    ② 删除视图

(2)查询视图

(3)更新视图


1. 空值的处理

(1)空值的处理

空值就是“不知道”或“不存在”或“无意义”的值

一般由以下几种情况

   ❶ 该属性应该有一个值,但目前不知道它的具体值

   ❷ 该属性不应该有值

   ❸ 由于某种原因不便于填写

(2)空值的产生

空值是一个很特殊的值,含有不确定性。对关系的运算带来特殊的问题,需要做特殊的处理

空值的产生有其实际需求

   学生选课后, 产生选课表, 但是还没有成绩。这时候成绩部分就为空值,它和0不一样(不是0分)

(3)空值的判断

判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示

【例3.81】找出漏填了性别或者年龄信息的记录

SELECT *

FROM Student

WHERE Ssex IS NULL OR Sage IS NULL

(4)空值的约束条件

属性定义(或者域定义)中

   ❶ 有NOT NULL约束条件的不能取空值

   ❷ 加了UNIQUE限制的属性不能取空值

   ❸ 码属性不能取空值

(5)空值的算术、比较、逻辑运算

空值与另一个值(包括另一个空值)的算术运算的结果为空值

空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN

有UNKNOWN后,传统二值(TRUE,FALSE)逻辑就扩展成了三值逻辑

 【例3.82】找出选修1号课程的不及格的学生

SELECT Sno

FROM SC

WHERE Grade < 60 AND Cno = '1'

查询结果不包括缺考的学生,因为他们的Grade值为NULL

 【例3.82】找出选修1号课程的不及格的学生以及缺考的学生

SELCET Sno

FROM SC

WHERE Cno = '1' AND ( Grade < 60 OR Grade IS NULL)

2. 数据更新

(1)插入数据

插入元组

插入子查询结果

   • 可以一次插入多个元组

   ① 插入元组

语句格式

 ■ 功能

    • 将新元组插入指定表中

INTO子句

   ❶ 指定要插入数据的表名及属性列 

   ❷ 属性列的顺序可与表定义中的顺序不一样

   ❸ 没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致

   ❹ 指定部分属性列:插入的元组在其余属性列上去空值

【例3.69】将一个新学生元组(学号:201215128;姓名:陈冬;性别:男;所在系:IS;年                          龄:18岁)插入到Student表中

INSERT 

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

VALUES( '201215128',‘男’,‘IS’,18)

【例3.70】将学生张成民的信息插入到Student表中

INSERT

INTO Student

VALUES( '201215126',‘张成民’,‘男’,18,‘CS’)

【例3.71】插入一条选课记录(‘200215128’,‘1’)

INSERT 

INTO SC( Sno,Cno)

VALUES( '201215128',‘1’)

关系数据库管理系统将在新插入记录的Grade列上自动地赋空值

或者:

INSERT

INTO SC

VALUES( '201215128','1',NULL)

   ② 插入子查询结果

语句格式

   

INTO子句

子查询

   ● SELECT子句目标列必须与INTO子句匹配

      • 值的个数

      • 值的类型

【例3.72】对每一个系,求学生的平均年龄,并把结果存入数据库

关系数据库管理系统在执行插入语句时会检查所插入元组是否破坏表上已定义的完整性规则

   ❶ 实体完整性

   ❷ 参照完整性

   ❸ 用户定义的完整性

      • NOT NULL约束

      • UNIQUE约束

      • 值域约束

(2)修改数据

语句格式

功能

  ❶ 修改指定表中满足WHERE子句条件的元组

  ❷ SET子句给出 <表达式>的值用于取代相应的属性列

  ❸ 如果省略WHERE子句,表示要修改表中的所有元组

三种修改方式

   ❶ 修改某一个元组的值

   ❷ 修改多个元组的值

   ❸ 带子查询的修改语句

【例3.73】将学生201215121的年龄改为22岁

 【例3.74】将所有学生的年龄增加1岁

【例3.75】将计算机科学系全体学生的成绩置零

关系数据库管理系统在执行修改语句时会检查修改操作是否破话表上已定义的完整性规则

   ❶ 实体完整性

   ❷ 参照完整性

   ❸ 用户定义的完整性

      • NOT NULL约束

      • UNIQUE约束

      • 值域约束

(3)删除数据

■ 语句格式

功能

   • 删除指定表中满足WHERE子句条件的元组

WHERE子句

   • 指定要删除的元组 

   • 无该子句将会删除表中的全部元组

【例3.76】删除学号为201215128的学生记录

【例3.77】删除所有的学生选课记录

【例3.78】删除计算机科学系所有学生的选课记录

3. 视图

视图特点:

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

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

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

视图的作用

  ❶ 视图能够简化用户的操作

      当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作

       • 基于多张表连接形成的视图

       • 基于复杂嵌套查询视图

       • 含导出属性的视图

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

     视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要

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

      由于对视图的更新是由条件的,因此应用程序中修改数据的语句可能仍会因基本结构的改变而        改变

      数据库重构:

    

 

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

      对于不同用户定义不同视图,使每个用户只能看到他有权看到数据

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

       经常需要执行这样的查询 “对每个同学找出他获得最高成绩的课程号” ,可以先定义一个视               图,求出每个同学获得的最高成绩

(1)定义视图

   ① 建立视图

语句格式

 ■ WITH CHECK OPTION

   ● 对视图进行UPDATE,INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义          中的谓词条件(即子查询中的条件表达式)

 ■ 子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则决定         具体系统的实现

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

    ● 全部省略:

        • 由子查询中SELECT目标列中的诸字段组成

    ● 明确指定视图的所有列名:

        • 某个目标列是聚集函数或列表达式

        • 多表连接时选出了几个同名列作为视图的字段

        • 需要在视图中为某个列启用新的更合适的名字

关系数据库管理系统执行CREATE VIEW语句时,只是把视图定义存入数据字典,并不执行其中     的SELECT语句

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

【例3.84】建立信息系学生的视图

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

定义IS_Student视图时加上了WITH CHECK OPTION子句,对该视图进行插入、修改和删除操     作时,RDBMS会自动加上Sdept = ‘IS’的条件

若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主           码,我们成这类视图为行列子集视图

    • IS_Student视图就是一个行列子集视图

基于多个表的视图

【例3.86】建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)

   

基于视图的视图

【例3.87】建立信息系选修1号课程且成绩在90分以上的学生的视图

带表达式的视图

【例3.88】定义一个反映学生出生年份的视图

分组视图

【例3.89】将学生的学号及平均成绩定义为一个视图

 【例3.90】将Student表中所有女生记录定义为一个视图

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

   ② 删除视图

■ 语句的格式:

该语句从数据字典中删除指定的视图定义

如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视     图一起删除

删除基表时,由该基表导出所有视图定义都必须显式地使用DROP VIEW语句删除

【例3.91】删除视图BT_S和IS_S1

              要删除IS_S1,需要使用级联删除:

(2)查询视图

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

关系数据库管理系统实现视图查询的方法

   ● 视图消解法(View Resolution)

     ❶ 进行有效性检查

     ❷ 转换成等价的对基本表的查询

     ❸ 执行修正后的查询

【例3.92】在信息系学生的视图中找出年龄小于20岁的学生

                     

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

【例3.93】查询选修了1号课程的信息系学生

 ■ 视图消解法的局限

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

【例3.94】也可以用如下SQL语句完成

(3)更新视图

【例3.95】将信息系学生视图IS_Student中学号“201215122”学生姓名改为“刘辰”

 转换后的语句:

 

 

【例3.96】向信息系学生视图IS_Student中插入一个新的学生记录,其中学号为“201215129”,                      姓名为“赵新”,年龄为20岁

 

转换为对基本表的更新 

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

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

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

DB2对视图0更新的限制:

   ❶ 若视图由两个以上基本表导出的,则此视图不允许更新

   ❷ 若视图的字段来字段表达式或常数,则不允许对此视图执行INSERT和UODATE操作,但允许         执行DELETE

   ❸ 若视图的字段来自集函数,则此视图不允许更新

   ❹ 若视图定义中GROUP BY子句,则此视图不允许更新

   ❺ 若视图定义中含有DISTINCT短语,则此视图不允许更新

   ❻ 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本               表,则此视图不允许更新

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值