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,复杂视图效率低于