一、数据更新
插入数据:1.插入元组 2.插入子查询结果(一次插入多个元组)
插入元组
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… ); ##提供的值必须与INTO子句匹配
into子句规则:
没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致
eg:
INSERT INTO SC VALUES (' 201215128 ',' 1 ');
指定部分属性列:插入的元组在其余属性列上取空值
eg:
INSERT INTO SC(Sno,Cno) VALUES ('201215128 ',' 1 ');
插入子查询
INSERT
INTO <表名> [(<属性列1> [,<属性列2>… )]
子查询;
子查询规则:
SELECT子句目标列必须与INTO子句匹配 1.值的个数 2.值的类型
eg :
INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student GROUP BY Sdept;
!!!注意!!!
执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则:
实体完整性
参照完整性
用户定义的完整性 :1. NOT NULL约束 2. UNIQUE约束 3. 值域约束
修改数据
1. 修改指定表中满足WHERE子句条件的元组
2. SET子句给出<表达式>的值用于取代相应的属性列
3. 如果省略WHERE子句,表示要修改表中的所有元组
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
修改某一个元组的值
eg:UPDATE Student SET Sage=22 WHERE Sno=' 201215121 ';
修改多个元组的值
eg:UPDATE Student SET Sage= Sage+3;
带子查询的修改语句
eg:UPDATE SC SET Grade=0 WHERE Sno IN (SELETE Sno FROM Student WHERE Sdept= 'CS' );
!!!注意!!!
执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则:
实体完整性
参照完整性
用户定义的完整性 :1. NOT NULL约束 2. UNIQUE约束 3. 值域约束
删除数据
删除指定表中满足WHERE子句条件的元组
DELETE
FROM <表名>
[WHERE <条件>]; ## 1.指定要删除的元组 2. 缺省表示要删除表中的全部元组,表的定义仍在字典中
删除某一个元组的值
eg:DELETE FROM Student WHERE Sno= 201915158 ';
删除多个元组的值
eg:DELETE FROM SC;
带子查询的删除语句
eg:DELETE FROM SC WHERE Sno IN (SELETE Sno FROM Student WHERE Sdept= 'js') ;
二、空值的处理
空值产生的原因:
1.该属性应该有一个值,但目前不知道它的具体值 ###未考试,属性成绩为空
2.该属性不应该有值 ###科目属性有的学生并未选取,值应该为空
3.由于某种原因不便于填写 ###密码属性,出于保密为空
判断是否为空:
IS NULL、IS NOT NULL
eg:SELECT * FROM Student WHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL;
约束条件:
1. 有NOT NULL约束条件的不能取空值
2. 加了UNIQUE限制的属性不能取空值
3. 码属性不能取空值
空值的运算规则:
1. 空值与另一个值(包括另一个空值)的算术运算的结果为空值
2. 空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN。
3. 有UNKNOWN后,传统二值(TRUE,FALSE)逻辑就扩展成了三值逻辑
逻辑运算表:(T表示TRUE,F表示FALSE,U表示UNKNOWN)
x y | x AND y | x OR y | NOT x |
T T | T | T | F |
T U | U | T | F |
T F | F | T | F |
U T | U | T | U |
U U | U | U | U |
U F | F | U | U |
F T | F | T | T |
F U | F | U | T |
F F | F | F | T |
三、视图
(创建时只保存视图定义,查询时按定义从相应基本表查出)
特点:
1. 虚表,是从一个或几个基本表(或视图)导出的表
2. 只存放视图的定义,不存放视图对应的数据
3. 基表中的数据发生变化,从视图中查询出的数据也随之改变
视图创建:
CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询> ###可以是任意的SELECT语句
[WITH CHECK OPTION]; ##对视图进行UPDATE、INSERT、DELETE操作时要其对应的行满足视图定义中的子查询中的条件表达式
视图的属性列名:
1.全部省略
- 由子查询中SELECT目标列中的诸字段组成
2.明确指定
- 某个目标列是聚集函数或列表达式
- 多表连接时选出了几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更合适的名字
eg:建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION; ###对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept='IS'的条件。
删除视图:
DROP VIEW <视图名>[CASCADE]; ##CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
查询视图:
用户角度:查询视图与查询基本表相同
关系数据库管理系统角度:
使用视图消解法进行语义转化 1.进行有效性检查 2.将视图查询语句转换成等价的对基本表的查询 3.执行修正后的查询对基本表查询
更新视图(与基本表语法一致)
一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换(视图消解法)成对相应基本表的更新。
视图更新限制 :
- 若视图是由两个以上基本表导出的,则此视图不允许更新。
- 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
- 若视图的字段来自聚集函数(sum、count等),则此视图不允许更新。
- 若视图定义中含有GROUP BY子句,则此视图不允许更新。
- 若视图定义中含有DISTINCT短语,则此视图不允许更新。
- 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
- 一个不允许更新的视图上定义的视图也不允许更新。
视图的作用
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当的利用视图可以更清晰的表达查询