0
0
0
第5章精讲:数据更新、视图与索引
文章摘要
|
第 5 章:数据更新、视图与索引精讲
上一篇解决了"查",这一篇解决"改"和"优化":INSERT/UPDATE/DELETE 三件套,加上视图与索引两个重要概念。考试上它们以 SQL 小题和简答题形式出现,工作中它们是每天都在用的基本功。
一、插入数据 INSERT
-- 插入单行(值与列一一对应)
INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept)
VALUES('2026001', '张三', '男', 19, '计算机');
-- 只给部分列赋值(其余列取空值或默认值)
INSERT INTO Student(Sno, Sname) VALUES('2026002', '李四');
-- 把查询结果批量插入(常用于建备份表、汇总表)
INSERT INTO SC_backup(Sno, Cno, Grade)
SELECT Sno, Cno, Grade FROM SC WHERE Grade < 60;
注意:插入的值必须满足已定义的全部约束(主码不重复、外码引用存在、CHECK 通过),违反任何一条整条语句失败。
二、修改数据 UPDATE
-- 把C01课程全部成绩加5分
UPDATE SC SET Grade = Grade + 5 WHERE Cno = 'C01';
-- 同时修改多列
UPDATE Student SET Sage = Sage + 1, Sdept = '软件工程'
WHERE Sno = '2026001';
⚠️ 经典事故:UPDATE/DELETE 忘写 WHERE = 全表修改/删除。练习时养成先写 WHERE 再补 SET 的习惯。
三、删除数据 DELETE
DELETE FROM SC WHERE Grade < 40 AND Cno='C02'; -- 删除特定成绩
DELETE FROM SC; -- 清空全部行(表结构还在)
DROP TABLE SC; -- 整个表删掉(区别!)
参照完整性与删除:删除被引用表的行(如删 Student 里的学生,而 SC 里还有他的成绩)默认会报错,除非建表时声明了级联删除(ON DELETE CASCADE)。
四、视图(VIEW):虚表
定义与本质
视图是从基本表(或其他视图)导出的虚表:数据库里只存视图的定义(一段 SELECT),不存视图的数据,数据仍在基本表中。所以基本表数据一变,视图查出来的结果自动跟着变。
三大作用(简答必背)
- 简化操作:把复杂的多表查询定义成视图,之后一行 SQL 搞定;
- 提供数据逻辑独立性:基本表结构变化时,只需改视图定义,用户程序不变(呼应第 1 章的外模式/模式映像——视图就是外模式的具体实现);
- 安全性:向用户只开放视图(部分列/部分行),隐藏机密数据。
语法
-- 定义:计算机系学生视图
CREATE VIEW v_cs AS
SELECT Sno, Sname, Sage FROM Student WHERE Sdept='计算机';
-- 像表一样查询
SELECT Sno, Sname FROM v_cs WHERE Sage > 20;
-- 可更新视图(简单视图可以 INSERT/UPDATE/DELETE)
UPDATE v_cs SET Sage = Sage + 1 WHERE Sno='2026001';
DROP VIEW v_cs;
五、索引(INDEX):加速查询的目录
本质
索引类似图书目录:DBMS 在数据之外建立"索引键 → 存储位置"的有序结构(如 B+ 树),查询时先查索引再定位数据,避免全表扫描。
语法
CREATE INDEX idx_sname ON Student(Sname); -- 建索引
CREATE UNIQUE INDEX idx_sno ON Student(Sno); -- 唯一索引
DROP INDEX idx_sname; -- 删索引
代价(简答考点)
索引不是越多越好:
- 优点:加快查询速度(尤其等值/范围查询)、加速表连接;
- 缺点:占用额外存储空间;每次 INSERT/UPDATE/DELETE 都要同步维护索引,降低更新性能。
实践准则:经常出现在 WHERE、JOIN、ORDER BY 中的列适合建索引;频繁更新的表、小表、区分度低的列(如性别)不适合。
六、自测题
- 视图和基本表的区别?(虚表不存数据)
- 视图为什么能提供逻辑独立性?(它是外模式的实现)
- 索引的优缺点各说两条;
- 写出"删除 2026001 学生的全部选课记录"的 SQL;
- 写出"把计算机系全部学生年龄加 1"的 SQL。
下一篇进入第 6 章:规范化理论——判断你的表设计得好不好。
