MySQL视图与数据表CRUD对比学习笔记

一、视图基础概念

视图(View)是虚拟表,本身不存储真实数据,仅保存查询语句;数据来源于底层基础表,访问视图时动态查询基表数据。

数据表(Table)是实体表,磁盘存储真实行数据,拥有完整字段、索引、约束。

二、创建操作对比

1. 数据表创建

sql

CREATE TABLE student(

id INT PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(20) NOT NULL,

age INT,

class_id INT

);

- 存储:磁盘生成物理文件,分配存储空间

- 约束:可设置主键、外键、非空、自增、唯一、默认值

- 索引:创建后可单独建立索引提升查询

2. 视图创建

sql

CREATE VIEW v_student_class AS

SELECT s.id,s.name,c.class_name

FROM student s

LEFT JOIN class c ON s.class_id=c.id;

- 存储:仅保存SELECT查询逻辑,无物理数据

- 约束:不支持主键、自增、外键,仅继承基表字段约束

- 索引:标准MySQL视图无法建立索引(物化视图除外)

创建核心差异

维度 数据表 视图

存储介质 物理存储真实数据 仅存储查询SQL,无数据

依赖关系 独立存在,不依赖其他表(外键除外) 依赖1张/多张基表,基表删除视图失效

约束支持 完整约束体系 仅复用基表约束,无法新增

三、更新(INSERT/UPDATE)操作对比

1. 数据表更新

sql

-- 新增

INSERT INTO student(name,age) VALUES('张三',18);

-- 修改

UPDATE student SET age=19 WHERE id=1;

- 限制:仅受自身字段约束、事务、触发器限制

- 影响:直接修改磁盘原始数据,所有关联查询同步变化

2. 视图更新(可更新视图)

sql

-- 单表简单视图支持更新

CREATE VIEW v_stu_simple AS SELECT id,name,age FROM student;

UPDATE v_stu_simple SET name='小张' WHERE id=1;

INSERT INTO v_stu_simple(name,age) VALUES('李四',17);

视图不可更新场景

1. 包含多表JOIN连接

2. 使用聚合函数:SUM/COUNT/MAX/GROUP BY

3. DISTINCT、UNION、子查询、计算字段

4. ALGORITHM=TEMPTABLE算法视图

更新核心差异

1. 数据表:无额外限制,可自由增改;视图有严格语法限制,复杂视图无法更新

2. 数据流向:视图更新本质是修改底层基表,视图本身不保存数据

3. 权限:修改视图需要同时拥有视图查询权限+基表修改权限

四、删除操作对比

1. 数据表删除

(1)删除表内数据

sql

DELETE FROM student WHERE id=1; -- 删除单行数据

TRUNCATE TABLE student; -- 清空全表,重置自增主键

(2)删除整张表结构

sql

DROP TABLE IF EXISTS student;

- DROP:直接销毁物理文件,数据、索引、约束全部永久删除,不可恢复(无备份时)

- TRUNCATE:清空数据,保留表结构,速度远快于DELETE

2. 视图删除

(1)删除视图本身(无删除视图数据语法)

sql

DROP VIEW IF EXISTS v_student_class;

- 视图无“删除行数据”操作,如需删数据只能操作基表

- DROP VIEW仅删除查询逻辑,不会影响底层数据表及真实数据

删除核心差异

操作 数据表 视图

删除行数据 支持DELETE/TRUNCATE,直接清除物理数据 不支持,必须操作基表

删除结构 DROP TABLE销毁表+全部数据 DROP VIEW仅删除虚拟查询定义,基表完好

数据丢失风险 高,DROP/TRUNCATE会永久丢失业务数据 无,删除视图不影响原始业务数据

五、视图优缺点总结

优点

1. 简化复杂查询:多表关联逻辑封装,业务端直接查询视图

2. 权限隔离:仅开放部分字段给用户,隐藏敏感字段(手机号、工资)

3. 统一数据口径:复杂统计逻辑统一维护,一处修改全局生效

4. 数据安全:限制用户只能访问视图,无法直接修改底层完整数据表

缺点

1. 性能损耗:每次查询视图都会执行底层SELECT,复杂视图效率低于