该笔记总结自 《数据库系统概论》4小时期末不挂科!期末突击|核心考点|案例解析 的选集4 更新与视图
速通SQL语句可以直接看:
目录
数据更新
插入子查询结果
sql
INSERT INTO <表名>[<属性列1>[,<属性列2>]]
子查询;
例:对于本校每一个专业,求学生平均年龄,并把结果存入数据库
sql
CREATE TABLE Student
( Smajor VARCHAR(20),
Ayg_age INT);
INSERT INTO Student(Smajor, Avg_age)
SELECT Smajor, AVG(age)
FROM Student
GROUP BY Smajor;
修改操作
sql
UPDATE <表名>
SET <列名> = <表达式>[,<列名> = <表达式>]
[WHERE<条件>];
例1:将学生20250001的出生日期改为2007年5月2日
sql
UPDATE Student
SET Sbrithday = '20070502'
WHERE Sno = '20250001';
例2:将2025年第2学期选修课号为10086课程所有学生的总课程学分数减少5分
sql
UPDATE Course
SET XF = XF - 5
WHERE Ctime = 20252 AND Cno = '10086';
例3:将计算机科学与技术专业学生成绩置零
sql
UPDATE Course
SET grade = 0
WHERE SC.Sno IN (
SELECT Sno FROM Student
WHERE Smajor = 'CS'
)
完整性约束
关系数据库管理系统在执行修改语句时会检查修改操作是否破坏表上已定义的完整性规则
- 实体完整性
- 主码不允许修改
- 用户定义的完整性
- NOT NULL约束
- UNIQUE约束
- 值域约束
数据删除
sql
DELETE FROM <表名>
[WHERE <条件>];
WHERE子句:指定要删除的元组,缺省表示要删除表中的全部元组,但表的定义仍在字典中。
例1:删除学号为20250001的学生记录
sql
DELETE FROM Student
WHERE Sno = '20250001';
例2:删除所有的学生选课记录
sql
DELETE FROM SC;
例3:删除智能科学与技术专业所有学生的选课记录
sql
DELETE FROM SC
WHERE Sno IN (
SELECT Sno
FROM Student
WHERE Smajor = 'IS');
空值
- 定义:空值就是"不知道"、"不存在"或"无意义"的值。
- 一般有以下几种情况:
- 该属性应该有一个值,但目前不知道它的具体值
- 该属性不应该有值
- 由于某种原因不便于填写
注意:空值是一个很特殊的值,含有不确定性。对关系运算带来特殊的问题,需要做特殊的处理。
空值的判断
使用 IS NULL 和 IS NOT NULL
sql
SELECT * FROM Student
WHERE Sname IS NULL OR Sno IS NULL OR Ssex IS NULL;
空值约束
- 在创建基本表时,如果属性定义(或者域定义)为NOT NULL约束,则该属性不能取空值。
- 主码的属性不能取空值
视图
视图的特点
- 虚表,是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,而不存放视图对应的数据
- 基本表中的数据发生变化,从视图中查询出的数据也随之改变
建立与删除视图
sql
CREATE VIEW <视图名>[(<列名> [,<列名>])]
AS <子查询>
[WITH CHECK OPTION]; -- 确保通过视图执行的数据修改操作不会导致被修改的行从视图中消失
DROP VIEW <视图名>[CASCADE];
-- CASCADE表示级联删除
【例题1】建立软件工程专业学生的视图,并要求进行插入、修改和删除操作时仍需保证该视图只有软件工程专业的学生。
sql
CREATE VIEW A
AS
SELECT * FROM Student
WHERE Smajor = 'SE'
WITH CHECK OPTION;
【例题2】建立软件工程专业选修了999号课程的学生的视图(包括学号、姓名、成绩属性)。
sql
CREATE VIEW B
AS
SELECT Student.Sno, Sname, grade
FROM Student, SC
WHERE SC.Sno = Student.Sno AND Smajor = 'SE' AND Cno = '999';
【例题3】建立软件工程专业选修了999号课程且成绩在90分以上的学生的视图(包括学号、姓名、成绩属性)
sql
CREATE VIEW C
AS
SELECT Student.Sno, Sname, grade
FROM B
WHERE grade >= 90;
【例题4】将学生的学号、姓名、专业、年龄定义为一个视图。
sql
CREATE VIEW D(Sno, Sname, Smajor, Sage)
AS
SELECT Sno, Sname, Smajor, Sage
FROM Student;
【例题5】将Student表中所有女生记录定义为一个视图。
sql
CREATE VIEW E
AS
SELECT * FROM Student
WHERE Ssex = '女';
【例题6】删除视图ST_haha以及用它创建的视图。
sql
DROP VIEW ST_haha CASCADE;
视图查询
与基本表的查询基本相同
例:在信息管理与信息系统专业学生的视图中,找出年龄小于等于20岁的学生(包括学生的学号和出生日期)
sql
SELECT Sno, Sbirthdate
FROM IS_Student
WHERE (extract(year from current_date)-extract(year from Sbirthdate) ) <= 20;
视图更新
更新视图:通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。
视图的更新操作通过视图消解,转换为对基本表的更新操作
为防止用户有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OPTION子句
在视图上增、删、改数据时,关系数据库管理系统会检查视图定义中的条件,若不满足条件则拒绝执行该操作
【例题1】将信息管理与信息系统专业学生视图IS_Student中学号为"20180005"的学生姓名改为"刘新奇"。
sql
UPDATE IS_Student
SET Sname = '刘新奇'
WHERE Sno = '20180005';
【例题2】向信息管理与信息系统专业学生视图IS_Student中插入一个新的学生记录(20180207,赵新,男,2001-7-19)
sql
INSERT INTO IS_Student(Sno, Sname, Ssex, Sbri)
VALUES ('20180207', '赵新', '男', '2001-7-19');
【例题3】删除信息管理与信息系统专业学生视图IS_Student中学号为"20180207"的记录。
sql
DELETE FROM IS_Student
WHERE Sno = '20180207';
视图的作用
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当利用视图可以更清晰地表达查询