MySQL视图学习笔记——视图与数据表增删改操作对比
视图(View)是一种虚拟数据表,本身不会在磁盘中存储真实数据,仅保存一条预先定义好的SELECT查询语句,每次查询视图时,数据库都会执行这条SQL语句,从底层原始数据表(基表)中动态提取数据。而普通数据表(Table)是物理实体,会在硬盘中持久存储数据,占用磁盘存储空间。
创建数据表使用CREATE TABLE语句,执行后会生成物理数据文件用来存放业务数据,代码示例:
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
age INT
);
创建视图使用CREATE VIEW语句,仅保存查询逻辑,不会生成物理数据,几乎不占用存储空间,示例:
CREATE VIEW v_student AS
SELECT id,name FROM student WHERE age >= 18;
修改数据表结构依靠ALTER TABLE,可以新增、修改、删除字段,直接改动物理存储结构:
ALTER TABLE student ADD COLUMN gender CHAR(1);
ALTER TABLE student MODIFY COLUMN name VARCHAR(30);
视图没有独立字段结构,只能通过ALTER VIEW改写对应的查询语句:
ALTER VIEW v_student AS
SELECT id,name,gender FROM student WHERE age >= 18;
对视图执行插入、更新数据,最终等价于修改底层原始数据表,多表联查构建的视图通常不支持数据更新。删除数据表执行DROP TABLE,整张表连同全部数据会被永久清除:
DROP TABLE student;
删除视图执行DROP VIEW,只会删除查询语句,底层数据表和原有数据不会受到任何影响:
DROP VIEW v_student;
视图拥有诸多优势:可以封装复杂联查语句,简化日常重复查询操作;能够管控数据权限,只对外暴露部分字段,隐藏原始表中的敏感信息;还可以屏蔽底层表结构变动,减少上层业务代码的修改量。同时视图也存在短板:无法建立索引,在高频查询场景下性能不足;
多表连接创建的视图大多无法执行新增与更新操作;一旦依赖的基表被删除,视图会直接失效。总而言之,数据表是持久存放数据的实体容器,视图只是封装好的查询脚本,所有对视图的数据操作,最终都会作用于它所依赖的原始数据表。