首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MYSQL-视图(View)

MYSQL-视图(View)

作者头像
运维小路
发布2026-01-26 11:52:20
发布2026-01-26 11:52:20
1230
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL(本章节)

PostgreSQL

MongoDB

Redis

Etcd

一、视图是什么?

视图(View) 是基于 SQL 查询结果集的虚拟表。它包含一系列带有名称的列和行数据,但其内容并不像真实表那样持久存储在数据库中。

  • 核心思想:视图的本质是一条被预定义并命名保存的 SELECT 语句
  • 物理存储:数据库只存储视图的定义(即那条 SELECT 语句),而不存储视图包含的数据。当你查询一个视图时,数据库引擎会动态地从底层基表中取出数据并组装成视图的结果。
  • 比喻:可以把视图想象成一个定制化的、动态更新的“观察窗口”。你透过这个窗口只能看到预先定义好的数据,而看不到基表中其他无关或敏感的数据。

二、为什么需要使用视图?(优点与用途)

使用视图可以带来多方面的好处,主要围绕简化操作、安全性和逻辑独立性。

1. 简化复杂查询 (Simplification):这是视图最常用的场景。如果你有一条非常复杂的 SQL 查询,涉及多表连接(JOIN)、子查询、聚合函数等,你可以将它创建为一个视图。之后,应用程序或用户只需要对这个视图进行简单的 SELECT * FROM my_view 查询即可,无需每次都重写那条复杂的 SQL。
2. 数据安全与访问控制 (Security)

视图可以作为一种安全机制,限制用户只能访问表的特定行或列,从而隐藏敏感数据。

  • 列级安全:你可以创建一个只包含 employees 表中 id, name, department 列的视图,而不包含 salary, phone_number 等敏感信息。然后授权用户只能访问这个视图,而不是基表。
  • 行级安全:你可以创建一个 v_my_department_employees 视图,其中 WHERE 子句限定了 department_id = current_user_department。这样用户只能看到自己部门的员工信息。
3. 逻辑数据独立性 (Logical Data Independence)

视图可以帮助应用程序和底层表结构解耦。如果因为业务变更,需要将一个大表拆分成多个小表(规范化),或者修改了某些列名。为了不影响现有的应用程序,你可以创建一个与旧表结构一致的视图。应用程序仍然查询这个视图,而视图内部已经调整为新结构的复杂查询。这样就在不修改应用代码的情况下,完成了数据库的平滑演进。

4. 提供清晰、统一的视角 (Clarity)

可以为不同的用户或部门提供定制化的数据视角,避免让他们直接面对复杂且庞大的原始表结构。

三、视图的语法

3.1创建视图
代码语言:javascript
复制
-- 创建基础视图,只显示部分字段
CREATE VIEW vw_test_data_basic AS
SELECT id, value, created_at 
FROM test_data 
WHERE random_number > 500;
创建完成的视图就会形成一个虚拟表。
代码语言:javascript
复制
mysql> show tables;
+--------------------+
| Tables_in_test_db  |
+--------------------+
| departments        |
| myisam_table       |
| test_data          |
| users              |
| vw_test_data_basic |
+--------------------+
3.2.查询视图
由于视图是一张虚拟表,所以我们需要使用特定的命令才能知道当前库下面有哪些表是视图。
代码语言:javascript
复制
mysql> SHOW FULL TABLES WHERE TABLE_TYPE = 'VIEW';
+--------------------+------------+
| Tables_in_test_db  | Table_type |
+--------------------+------------+
| vw_test_data_basic | VIEW       |
+--------------------+------------+
1 row in set (0.00 sec)
3.3 修改视图
代码语言:javascript
复制
-- 完全重写视图定义,类似创建新视图替代旧视图
CREATE OR REPLACE VIEW vw_test_data_basic AS
SELECT 
    id,
    value,
    created_at,
    random_number,
    UPPER(value) AS upper_value,  -- 新增字段
    random_number * 2 AS doubled_number  -- 新增计算字段
FROM test_data 
WHERE random_number > 500 
  AND value IS NOT NULL;
代码语言:javascript
复制
-- 修改视图属性(不改变查询定义)类似修改表结构 
ALTER VIEW vw_test_data_basic 
SQL SECURITY INVOKER
COMMENT 'This view shows basic test data with calculated fields';

-- 查看视图属性变化
SELECT 
    TABLE_NAME,
    VIEW_DEFINITION,
    SECURITY_TYPE,
    CHECK_OPTION,
    IS_UPDATABLE,
    DEFINER,
    CHARACTER_SET_CLIENT,
    COLLATION_CONNECTION
FROM INFORMATION_SCHEMA.VIEWS 
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'vw_test_data_basic';
4.删除视图
代码语言:javascript
复制
-- 删除单个视图
DROP VIEW IF EXISTS vw_test_data_basic;

-- 删除多个视图
DROP VIEW IF EXISTS vw_test_data_basic, vw_test_data_enhanced;

-- 安全删除(避免不存在的视图报错)
DROP VIEW IF EXISTS vw_old_data_view;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB
    • 一、视图是什么?
    • 二、为什么需要使用视图?(优点与用途)
      • 1. 简化复杂查询 (Simplification):这是视图最常用的场景。如果你有一条非常复杂的 SQL 查询,涉及多表连接(JOIN)、子查询、聚合函数等,你可以将它创建为一个视图。之后,应用程序或用户只需要对这个视图进行简单的 SELECT * FROM my_view 查询即可,无需每次都重写那条复杂的 SQL。
      • 2. 数据安全与访问控制 (Security)
      • 3. 逻辑数据独立性 (Logical Data Independence)
      • 4. 提供清晰、统一的视角 (Clarity)
    • 三、视图的语法
      • 3.1创建视图
      • 创建完成的视图就会形成一个虚拟表。
      • 3.2.查询视图
      • 由于视图是一张虚拟表,所以我们需要使用特定的命令才能知道当前库下面有哪些表是视图。
      • 3.3 修改视图
      • 4.删除视图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档