单元6 数据视图(View)笔记整理
一、视图概述
1. 什么是视图?
视图(View)是从一个或多个基本表(或视图)中导出的虚拟表。
视图本身不实际存储数据,数据库中只存放视图的定义(SELECT 语句)。
对视图进行操作时,系统会根据视图定义去操作其关联的基本表。
2. 视图的优点
| 优点 | 说明 |
| 集中数据 | 将分散在多个表中的数据集中在一起,方便查询和处理 |
| 屏蔽复杂性 | 用户不必了解复杂的表结构,表结构更改也不影响用户使用 |
| 简化权限管理 | 只需授予用户使用视图的权限,不必开放整个表,增强安全性 |
| 便于数据共享 | 数据只需存储一次,各用户不必重复定义和存储已有数据 |
| 重新组织数据 | 可以按用户习惯重新组织数据,方便输出到其他应用 |
二、创建和查询视图
1. 创建视图(CREATE VIEW)
基本语法
CREATE [OR REPLACE] VIEW 视图名 [(列名列表)]
AS
SELECT 语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
语法说明
列名列表:为视图列定义明确名称,可省略(默认使用 SELECT 中的列名)
OR REPLACE:如果视图已存在,则替换原有视图
SELECT 语句:定义视图的核心查询语句
WITH CHECK OPTION:对可更新进行数据修改时,检查是否符合 WHERE 条件
LOCAL:只检查当前视图定义的条件CASCADED(默认):检查当前视图及所有底层视图的条件
【例6-1】创建计算机类图书销售视图jsj_sell
CREATE OR REPLACE VIEW jsj_sell
AS
SELECT 订单号, sell.图书编号, 书名, 订购册数
FROM book, sell
WHERE book.图书编号 = sell.图书编号
AND book.图书类别 = '计算机'
WITH CHECK OPTION;
【例6-2】创建计算机类图书平均销售视图sale_avg
CREATE VIEW sale_avg (name, sale_avg)
AS
SELECT 书名, AVG(订购册数)
FROM jsj_sell
GROUP BY 书名;
2. 查询视图
视图创建后,可以像查询基本表一样使用SELECT查询。
【例6-3】查询jsj_sell中的订单号和订购册数
SELECT 订单号, 订购册数
FROM jsj_sell;
【例6-4】查询平均订购册数大于 5 的会员
-- 先创建视图
CREATE VIEW kh_avg (userID, order_avg)
AS
SELECT 用户号, AVG(订购册数)
FROM sell
GROUP BY 用户号;
-- 再查询视图
SELECT * FROM kh_avg WHERE order_avg > 5;
三、操作视图(通过视图修改基本表数据)
1. 可更新视图的条件
要通过视图更新(INSERT / UPDATE / DELETE)基本表数据,视图必须是可更新视图。 视图中的行和基本表中的行必须具有一对一的关系。
2. 插入数据(INSERT)
【例6-5】创建jsj_book视图并插入数据
-- 创建视图
CREATE OR REPLACE VIEW jsj_book
AS
SELECT *
FROM book
WHERE 图书类别 = '计算机'
WITH CHECK OPTION;
-- 插入记录(图书类别必须为'计算机',否则报错)
INSERT INTO jsj_book
VALUES ('TP.0837', '计算机', 'Office应用实例', '张怡怡',
'人民邮电出版社', '2023-10-21', 34.5, NULL, NULL, NULL);
3. 修改数据(UPDATE)
【例6-6】通过视图将计算机类图书单价降低 5%
UPDATE jsj_book
SET 单价 = 单价 * (1 - 0.05);
【例6-7】修改jsj_sell中的数据
-- 修改书名(修改 book 表)
UPDATE jsj_sell
SET 书名 = 'PHP网站制作'
WHERE 图书编号 = 'TP.2525';
-- 修改订购册数(修改 sell 表)
UPDATE jsj_sell
SET 订购册数 = 100
WHERE 订单号 = 5;
-- 错误!同时修改两个表的数据
UPDATE jsj_sell
SET 书名 = 'PHP网站制作', 订购册数 = 100
WHERE 订单号 = 5 AND 图书编号 = 'TP.2525';
4. 删除数据(DELETE)
【例6-8】删除jsj_book中人民邮电出版社的记录
DELETE FROM jsj_book
WHERE 出版社 = '人民邮电出版社';
四、修改和删除视图
1. 修改视图定义(ALTER VIEW)
语法与CREATE VIEW类似,用于修改已存在的视图。
【例6-9】将jsj_book修改为只包含图书编号、书名、单价
ALTER VIEW jsj_book
AS
SELECT 图书编号, 书名, 单价
FROM book
WHERE 图书类别 = '计算机';
2. 删除视图(DROP VIEW)
DROP VIEW [IF EXISTS] 视图名1 [, 视图名2, ...];
六、本章核心速记
| 操作 | 关键字 | 要点 |
| 创建视图 | `CREATE VIEW` | 虚拟表,不存数据;`OR REPLACE` 可替换 |
| 保证数据一致性 | `WITH CHECK OPTION` | 插入/更新时检查是否符合 WHERE 条件 |
| 查询视图 | `SELECT` | 和查表一样使用 |
| 更新视图 | `INSERT/UPDATE/DELETE` | 只能操作单表,多表视图不可更新 |
| 修改视图 | `ALTER VIEW` | 重新定义视图结构 |
| 删除视图 | `DROP VIEW` | 只删定义,不删数据;支持 `IF EXISTS` |