1. 视图的定义
- 是个虚拟表,是从数据库中一个或多个表中导出的表;
- 可以像表一样进行查询,修改和删除操作。通过视图新增或删除数据,会影响基本表,反之亦然;
2. 视图作用
- 简单化
- 简化用户对数据的理解。经常被使用的查询可以被定义为视图,减少SQL编写。
- 安全性
- 数据库的授权只能定义到表级别,而视图可以细化到特定的行和列。
- 逻辑数据独立性
- 屏蔽真实表结构变化带来的影响
3. 创建视图
先创建一个简单的表:
DROP TABLE IF EXISTS `t`;
CREATE TABLE t(quantity INT, price INT);
INSERT INTO t VALUES(1, 2),(3, 4);
为该表创建视图:
DROP VIEW IF EXISTS `view_t`;
-- 其实感觉就是写select 语句
CREATE VIEW view_t AS SELECT quantity, price , quantity * price FROM t;
查询视图:
DESCRIBE view_t; -- 查看视图包含的基本字段信息
在使用视图时,用户不需要了解基本表结构,更接触不到实际表中数据,保证了数据库的安全。
4. 查看视图信息
- 查看数据库中已存在视图的定义:
DESCRIBE view_t; --查看视图包含的基本字段信息
-- 等价
DESC view_t;
SHOW TABLE STATUS LIKE '%view_t%';
SHOW CREATE VIEW view_t; -- 显示建视图语句
SELECT * FROM information_schema.views; -- 查询所有视图信息
5. 修改视图结构
CREATE OR REPLACE VIEW view_t AS SELECT * FROM t;
-- 等价
ALTER VIEW view_t AS SELECT quantity FROM t;
6. 更新视图
更新视图指通过视图来插入,更新,删除真实表数据。
UPDATE view_t SET quantity = 100 WHERE price > 5;
-- 使用DELETE语句删除符合条件的记录
DELETE FROM view_t;
注意:通过视图更新所影响的行受限于定义视图的语句。也就是更新视图所影响的行是更新视图语句的where条件和定义视图的where条件的交集。
举例:
-- 修改视图只查询price<5的行
CREATE OR REPLACE VIEW view_t AS SELECT * FROM t WHERE price < 5;
-- 执行update视图操作,最后影响的行为0,因为两个where条件取交集互斥
UPDATE view_t SET quantity = 100 WHERE price > 5;
另外需要注意的是,当视图包含如下内容时,更新操作不能执行:
- 尝试更新视图中未定义的非空列;
- 视图中的列由数学表达式,聚合函数,distinct,union,group by,having 等语句产生时,更新该列会报错
关于第二点的理解,我认为是由于该列不能对应到物理表的某一列,所以才不能更新。
7. 删除视图
DROP VIEW IF EXISTS `view_t`;
8.总结
视图与表的区别与联系:
区别
- 视图时已经编辑好的SQL,基于SQL语句的结果集的可视化表,表不是
- 视图没有实际的物理记录
- 表是内容,视图时窗口
- 表占物理空间,视图不占物理空间,视图时逻辑概念
- 视图的建立和删除只影响视图本身
联系
视图建立在基本表之上,结构和内容都来自基本表。一个视图可以对应一个表,可以对应多个表。
它是基本表的抽象和逻辑意义上建立的新关系。