MySQL视图概念与操作详解

宋时安
宋时安
发布时间:2026-10-13| 4人浏览过
原创

MySQL中的视图是一种基于已有表的虚拟表,本身不存储数据,主要用于简化复杂查询逻辑、提高安全性及减少数据冗余。本文将详细介绍数据库常见对象中视图的定位,讲解如何通过SQL语句创建、查看、修改及删除视图,并深入分析视图数据的更新限制条件与维护成本。

常见的数据库对象

在MySQL及多数关系型数据库中,视图是重要的对象之一。以下是常见的数据库对象及其作用:

  • 表 (TABLE):存储数据的逻辑单元,由行(记录)和列(字段)组成。
  • 数据字典:即系统表,存放数据库相关信息,通常由系统维护,用户只读。
  • 约束 (CONSTRAINT):用于保证数据完整性的校验规则。
  • 视图 (VIEW):虚拟表,显示来自一个或多个基表的数据,本身不存储数据。
  • 索引 (INDEX):用于提升查询性能,类似书的目录。
  • 存储过程 (PROCEDURE):封装业务处理逻辑,无返回值,但可通过参数传出数据。
  • 存储函数 (FUNCTION):执行特定计算,具有返回值。
  • 触发器 (TRIGGER):监听数据库事件并在发生时自动执行相应操作。

视图的概念

视图建立在已有表的基础上,这些被引用的表称为基表。视图的本质是一条存储起来的 SELECT 语句。

视图具有以下特点:

  1. 无数据存储:视图不保存任何数据,占用极少内存空间,所有数据真正存储在基表中。
  2. 定义独立:创建或删除视图仅影响视图本身,不影响基表结构。
  3. 双向关联:对视图数据进行增删改(DML操作),基表数据会相应变化;反之亦然。
  4. 适用场景:在大型项目或表结构复杂的场景中,视图能将频繁使用的结果集虚拟化,提升查询效率与管理便捷性。

创建视图

使用 CREATE VIEW 语句创建视图。如果未指定别名,查询字段名将直接作为视图的列名。

第1步:基础视图创建

目的:从单一基表中提取关键字段形成视图。

CREATE VIEW vu_emps
AS 
SELECT employee_id,last_name,salary
FROM emps;

若需自定义视图列名,可在视图名后列出字段列表:

CREATE VIEW vu_emps2(emp_id,name,monthly_sal)
AS 
SELECT employee_id,last_name,salary
FROM emps;

第2步:多表连接视图

目的:关联多个基表,展示综合信息。

CREATE VIEW vu_emp_dept
AS
SELECT employee_id,e.department_id,department_name
FROM emps e JOIN depts d
ON e.department_id = d.department_id;
-- 验证视图内容
SELECT * FROM vu_emp_dept;

第3步:格式化视图

目的:利用字符串函数对输出内容进行拼接格式化。

CREATE VIEW vu_emp_dept1
AS
SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
FROM emps e JOIN depts d
ON e.department_id = d.department_id;

第4步:基于视图创建视图

目的:在已有视图基础上进一步抽象。

CREATE VIEW vu_emp4
AS 
SELECT department_id,department_name FROM vu_emp_dept;
SELECT * FROM vu_emp4;

查看视图

确认视图是否存在及其详细定义是运维的基础操作。

第5步:列出视图与检查结构

入口:MySQL命令行或客户端工具。 动作:查看所有表和视图对象,并检查特定视图结构。

SHOW TABLES; -- 列表中会包含视图名
DESC vu_emp4; -- 显示视图的字段结构

第6步:查看视图状态

动作:查询视图的系统属性信息。

SHOW TABLE STATUS LIKE 'vu_emp4'\G;

在返回结果中,观察 Comment 字段值为 VIEWS,可确认该对象类型为视图。

第7步:获取视图定义源码

动作:查看创建该视图的具体SQL语句。

SHOW CREATE VIEW vu_emp4\G;

输出中包含 Create View 字段,展示了完整的视图构建逻辑及安全设置(如 DEFINER 和 SQL SECURITY)。

更新视图数据

虽然视图支持部分更新操作,但由于其虚拟性质,更新存在严格限制。要使视图可更新,视图中的行与基表中的行必须保持一对一的关系。

注意:不建议频繁更新视图数据,因为维护成本高且可读性差。最佳实践是通过操作实际的基表来管理数据。

以下情况视图不支持更新操作:

  • 算法限制:定义了 ALGORITHM = TEMPTABLE,视图不支持 INSERT 和 DELETE。
  • 缺失非空列:视图中不包含基表中所有定义为 NOT NULL 且无默认值的列时,不支持 INSERT。
  • 联合查询:使用了 JOIN 联合查询时,不支持 INSERT 和 DELETE。
  • 表达式与子查询:字段列表中使用数学表达式或子查询时,不支持 INSERT,也不支持更新涉及表达式的字段。
  • 分组与去重:使用了 DISTINCT、聚合函数、GROUP BY、HAVING 或 UNION 时,完全不支持增删改。
  • 不可更新源:视图定义基于另一个不可更新视图或常量视图。

修改视图

当业务逻辑变更需要调整视图时,可使用以下两种方式:

第8步:使用 CREATE OR REPLACE VIEW

动作:重新定义视图,若存在同名视图则替换。

CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS
SELECT employee_id, first_name || ' ' || last_name, salary, department_id
FROM employees
WHERE department_id = 80;
-- 另一种示例:修改为多表连接格式化视图
CREATE OR REPLACE VIEW vu_emp4
AS 
SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
FROM emps e JOIN depts d
ON e.department_id = d.department_id;

注意:新定义的列别名应与子查询中的列一一对应。

第9步:使用 ALTER VIEW

动作:直接修改现有视图的定义语句。

ALTER VIEW vu_emp4
AS 
SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
FROM emps e JOIN depts d
ON e.department_id = d.department_id;

删除视图

当视图不再需要时,应及时清理以避免资源浪费和维护混淆。

第10步:执行删除操作

动作:移除指定的视图对象。建议先使用 IF EXISTS 避免报错。

DROP VIEW vu_emp4;
-- 安全删除,不存在也不报错
DROP VIEW IF EXISTS vu_emp1;

视图的优缺点总结

优点:

  • 操作简单:简化复杂SQL编写。
  • 数据安全:隐藏敏感列,控制访问权限。
  • 逻辑解耦:分解复杂查询逻辑,适应需求变动。
  • 减少冗余:避免重复定义相同的过滤条件。

缺点:

  • 维护成本高:基表结构变更可能导致视图失效。
  • 可读性挑战:多层嵌套视图会增加理解难度。

以上就是MySQL视图的概念和操作函数的详细内容,更多关于MySQL视图的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。