数据库系统概论4 - 更新与视图 期末速成课笔记

该笔记总结自 《数据库系统概论》4小时期末不挂科!期末突击|核心考点|案例解析 的选集4 更新与视图

速通SQL语句可以直接看:

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'
)

完整性约束

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

  1. 实体完整性
  2. 主码不允许修改
  3. 用户定义的完整性
    • 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');

空值

  1. 定义:空值就是"不知道"、"不存在"或"无意义"的值。
  2. 一般有以下几种情况:
    1. 该属性应该有一个值,但目前不知道它的具体值
    2. 该属性不应该有值
    3. 由于某种原因不便于填写

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

空值的判断

使用 IS NULLIS NOT NULL

sql 复制代码
SELECT * FROM Student
WHERE Sname IS NULL OR Sno IS NULL OR Ssex IS NULL;

空值约束

  1. 在创建基本表时,如果属性定义(或者域定义)为NOT NULL约束,则该属性不能取空值。
  2. 主码的属性不能取空值

视图

视图的特点

  • 虚表,是从一个或几个基本表(或视图)导出的表
  • 只存放视图的定义,而不存放视图对应的数据
  • 基本表中的数据发生变化,从视图中查询出的数据也随之改变

建立与删除视图

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';

视图的作用

  1. 视图能够简化用户的操作
  2. 视图使用户能以多种角度看待同一数据
  3. 视图对重构数据库提供了一定程度的逻辑独立性
  4. 视图能够对机密数据提供安全保护
  5. 适当利用视图可以更清晰地表达查询
相关推荐
锋行天下1 小时前
数据库安全并发控制详解:乐观锁 vs 悲观锁 vs 原子操作
前端·数据库·后端
2601_961875241 小时前
花生十三公考课程|网课|视频
数据库·windows·git·svn·eclipse·github
l1t2 小时前
DeepSeek总结的parquet Variant “碎形化“技术
数据库·parquet
لا معنى له2 小时前
NeoVerse: Enhancing 4D World Model with in-the-wild Monocular Videos
人工智能·笔记·机器学习·语言模型
黄毛火烧雪下2 小时前
Java 基础笔记:文件、递归与字符编码
java·开发语言·笔记
学计算机的计算基2 小时前
链表算法上篇:LeetCode 206/234/141/142/160/21 题解与易错点
java·笔记·算法·链表
云计算磊哥@2 小时前
运维开发宝典030-MySQL06数据库运维阶段总结
运维·数据库·运维开发
这个DBA有点耶2 小时前
国产数据库有哪些?2026年主流产品选型对比
数据库·程序人生·职场和发展·架构·程序员创富·改行学it
pFg0v4O7P2 小时前
从Cursor迁移到Claude Code:完整过渡指南
数据库