Mysql 12: 视图全解——从创建到使用

视图(View)是 MySQL 中基于表的虚拟表,本身不存储数据,仅存储查询逻辑,可简化复杂查询、实现数据权限控制,是数据库开发的常用工具。本文围绕图片中的知识点,从创建、查看、修改到删除,带你彻底掌握 MySQL 视图。


一、核心知识点总览

大类 细分知识点 核心作用
1. 视图的优点 简化查询、权限控制、数据隔离、逻辑独立
2. 创建视图 1) 语法格式、2) 单表创建、3) 多表创建
3. 查看视图 4 种查看视图的方法
4. 修改视图 两种修改视图的方法
5. 更新视图 视图数据更新规则
6. 删除视图 删除不再使用的视图
7. 视图和表的区别 面试高频考点

二、1. 视图的优点

  1. 简化复杂查询:将多表关联、复杂条件封装成视图,直接查询视图即可
  2. 数据权限控制:仅给用户开放视图权限,隐藏敏感字段(如密码、薪资)
  3. 数据逻辑隔离:底层表结构变更时,仅需修改视图,不影响上层业务
  4. 统一数据口径:多个业务共用同一视图,保证数据统计标准一致
  5. 安全性高:视图可限制用户仅查看指定行 / 列,避免数据泄露

三、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. 更新视图

视图本身不存储数据,更新视图本质是更新底层基表,需满足以下条件:

  1. 视图不能包含聚合函数(SUM/AVG/COUNT)、DISTINCTGROUP BYHAVING
  2. 多表关联视图不能更新
  3. 视图字段必须对应基表的可写字段

示例

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)
存储 仅存储查询逻辑,不存储数据 存储实际数据
占用空间 几乎不占用 占用磁盘空间
更新 部分视图可更新(本质更新基表) 可直接更新
结构 虚拟表,基于表创建 真实表,物理存储
使用场景 简化查询、权限控制、数据隔离 存储实际业务数据
查询性能 每次查询都执行底层逻辑 直接查询数据,性能更高

九、核心总结

  1. 视图本质:虚拟表,仅存查询逻辑,不存数据
  2. 核心操作CREATE VIEW 创建、DESC/SHOW CREATE VIEW 查看、DROP VIEW 删除
  3. 关键特性:简化查询、权限控制、逻辑隔离
  4. 面试考点:视图与表的区别、视图更新条件
  5. 适用场景:复杂查询封装、数据权限管理、多业务统一口径
相关推荐
一个有温度的技术博主3 小时前
Redis缓存预热:解决服务冷启动的“数据库杀手”问题
数据库·redis·缓存
zh_xuan4 小时前
Android 传统view嵌入compose
android
ZHANG13HAO6 小时前
Android 13 AOSP 内置 NekoTTS 中文免费商用 TTS 完整流程
android
沃尔威武10 小时前
数据库 Sinks(.net8)
数据库·.net·webview
许杰小刀10 小时前
ctfshow-web文件包含(web78-web86)
android·前端·android studio
Dreamboat¿11 小时前
SQL 注入漏洞
数据库·sql
曹牧12 小时前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星12 小时前
MySQL count()函数的用法
数据库·mysql
末央&12 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库