视图(View)是 MySQL 中基于表的虚拟表,本身不存储数据,仅存储查询逻辑,可简化复杂查询、实现数据权限控制,是数据库开发的常用工具。本文围绕图片中的知识点,从创建、查看、修改到删除,带你彻底掌握 MySQL 视图。
一、核心知识点总览
| 大类 | 细分知识点 | 核心作用 |
|---|---|---|
| 1. 视图的优点 | 简化查询、权限控制、数据隔离、逻辑独立 | |
| 2. 创建视图 | 1) 语法格式、2) 单表创建、3) 多表创建 | |
| 3. 查看视图 | 4 种查看视图的方法 | |
| 4. 修改视图 | 两种修改视图的方法 | |
| 5. 更新视图 | 视图数据更新规则 | |
| 6. 删除视图 | 删除不再使用的视图 | |
| 7. 视图和表的区别 | 面试高频考点 |
二、1. 视图的优点
- 简化复杂查询:将多表关联、复杂条件封装成视图,直接查询视图即可
- 数据权限控制:仅给用户开放视图权限,隐藏敏感字段(如密码、薪资)
- 数据逻辑隔离:底层表结构变更时,仅需修改视图,不影响上层业务
- 统一数据口径:多个业务共用同一视图,保证数据统计标准一致
- 安全性高:视图可限制用户仅查看指定行 / 列,避免数据泄露
三、2. 创建视图
2.1 语法格式
sql
CREATE [OR REPLACE] VIEW 视图名 AS
SELECT 查询语句
[WITH CHECK OPTION];
关键说明:
OR REPLACE:视图存在则替换,不存在则创建WITH CHECK OPTION:强制通过视图插入 / 修改的数据必须满足视图的查询条件
2.2 在单表上创建视图
需求:创建学生表的视图,隐藏年龄字段
sql
-- 准备测试表
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
age INT NOT NULL,
phone VARCHAR(11) NOT NULL
);
INSERT INTO student (name, age, phone) VALUES
('张三',18,'13812345678'),
('李四',19,'13987654321');
-- 创建单表视图
CREATE OR REPLACE VIEW v_student AS
SELECT id, name, phone FROM student;
2.3 在多表上创建视图
需求:创建学生 + 成绩的多表关联视图
sql
-- 准备成绩表
CREATE TABLE score (
id INT PRIMARY KEY AUTO_INCREMENT,
stu_id INT NOT NULL,
subject VARCHAR(20) NOT NULL,
score INT NOT NULL,
FOREIGN KEY (stu_id) REFERENCES student(id)
);
INSERT INTO score (stu_id, subject, score) VALUES
(1,'语文',85),(1,'数学',92),(2,'语文',78);
-- 创建多表视图
CREATE OR REPLACE VIEW v_student_score AS
SELECT
s.id AS stu_id,
s.name AS stu_name,
sc.subject,
sc.score
FROM student s
JOIN score sc ON s.id = sc.stu_id;
四、3. 查看视图(4 种方法)
1) 使用 DESCRIBE 查看基本结构
sql
DESCRIBE v_student;
-- 简写
DESC v_student;
2) 使用 SHOW TABLE STATUS 查看视图状态
sql
SHOW TABLE STATUS LIKE 'v_student';
说明:
Comment字段为VIEW表示是视图。
3) 使用 SHOW CREATE VIEW 查看创建语句
sql
SHOW CREATE VIEW v_student_score;
4) 在 views 系统表中查看详细信息
sql
SELECT * FROM information_schema.VIEWS
WHERE TABLE_NAME = 'v_student_score' AND TABLE_SCHEMA = DATABASE();
五、4. 修改视图(了解)
1) 使用 CREATE OR REPLACE VIEW(推荐)
sql
-- 直接替换视图,修改查询逻辑
CREATE OR REPLACE VIEW v_student AS
SELECT id, name, phone, age FROM student; -- 新增age字段
2) 使用 ALTER VIEW 语句
sql
ALTER VIEW v_student AS
SELECT id, name, phone FROM student; -- 恢复原逻辑
六、5. 更新视图
视图本身不存储数据,更新视图本质是更新底层基表,需满足以下条件:
- 视图不能包含聚合函数(
SUM/AVG/COUNT)、DISTINCT、GROUP BY、HAVING - 多表关联视图不能更新
- 视图字段必须对应基表的可写字段
示例
sql
-- 单表视图可更新
UPDATE v_student SET name = '张三三' WHERE id = 1;
-- 底层student表同步更新
SELECT * FROM student WHERE id = 1;
七、6. 删除视图
语法
sql
DROP VIEW [IF EXISTS] 视图名;
示例
sql
DROP VIEW IF EXISTS v_student, v_student_score;
说明:可同时删除多个视图,用逗号分隔。
八、7. 视图和表的区别
| 对比项 | 视图(View) | 表(Table) |
|---|---|---|
| 存储 | 仅存储查询逻辑,不存储数据 | 存储实际数据 |
| 占用空间 | 几乎不占用 | 占用磁盘空间 |
| 更新 | 部分视图可更新(本质更新基表) | 可直接更新 |
| 结构 | 虚拟表,基于表创建 | 真实表,物理存储 |
| 使用场景 | 简化查询、权限控制、数据隔离 | 存储实际业务数据 |
| 查询性能 | 每次查询都执行底层逻辑 | 直接查询数据,性能更高 |
九、核心总结
- 视图本质:虚拟表,仅存查询逻辑,不存数据
- 核心操作 :
CREATE VIEW创建、DESC/SHOW CREATE VIEW查看、DROP VIEW删除 - 关键特性:简化查询、权限控制、逻辑隔离
- 面试考点:视图与表的区别、视图更新条件
- 适用场景:复杂查询封装、数据权限管理、多业务统一口径