MySQL进阶—— 视图(详解)

        本文全面介绍Mysql 视图相关的核心知识。包括介绍视图定义,基于查询结果的虚拟表,有简化查询、保障安全、解耦逻辑等作用。讲解创建、修改、删除视图的操作,以及及视图可更新条件、安全性控制及性能优化方法。

本文目录

    • 一、视图的定义与作用
      • 定义
      • 作用
    • 二、视图的创建与管理
      • 创建视图
      • 修改视图
        • 方式 1:覆盖原有视图
        • 方式 2:ALTER VIEW
      • 删除视图
    • 三、视图两种算法
      • MERGE(默认)
      • TEMPTABLE
    • 四、视图的可更新性
      • 可更新视图条件
      • 可更新示例
      • 不可更新示例
    • 五、视图的安全性控制
    • 六、视图的性能优化
    • 七、实际应用场景
      • 数据权限隔离
      • 简化报表查询

一、视图的定义与作用

定义

视图是基于一个或多个表的查询结果生成的虚拟表,不存储实际数据,数据动态生成。

作用

  1. 简化复杂查询:封装多表连接、聚合等操作,简化业务逻辑。
CREATE VIEW user_order_view AS
SELECT 
    u.id AS user_id,
    u.name AS user_name,
    o.id AS order_id,
    p.name AS product_name,
    o.quantity,
    o.total_price
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;
  1. 数据安全:限制用户访问基表的敏感字段,如隐藏手机号、密码等。



二、视图的创建与管理

创建视图

CREATE VIEW view_name AS
SELECT column1, column2 FROM table WHERE condition;

修改视图

方式 1:覆盖原有视图
CREATE OR REPLACE VIEW view_name AS
SELECT new_columns FROM table;
方式 2:ALTER VIEW
ALTER VIEW view_name AS
SELECT updated_query;

删除视图

DROP VIEW view_name;



三、视图两种算法

MySQL 支持两种视图处理算法:

MERGE(默认)

将视图查询与外部查询合并,直接执行优化后的 SQL。

-- (默认)
CREATE VIEW vip_users AS
SELECT id, name FROM users WHERE level >= 3;

TEMPTABLE

将视图结果存入临时表,再基于临时表执行外部查询。

-- 显式指定 TEMPTABLE 算法
CREATE ALGORITHM = TEMPTABLE VIEW product_sales AS
SELECT product_id, SUM(quantity) AS total_sold
FROM orders 
GROUP BY product_id;



四、视图的可更新性

可更新视图条件

  1. 视图基于单表查询。
  2. 未使用聚合函数(SUM/AVG 等)、DISTINCT、GROUP BY、HAVING、UNION。

可更新示例

-- 创建可更新视图
CREATE VIEW user_balance AS
SELECT id, name, balance 
FROM users;

-- 更新用户余额
UPDATE user_balance SET balance = balance - 100 WHERE id = 2001;

不可更新示例

-- 含GROUP BY的视图不可更新
CREATE VIEW product_sales_view AS
SELECT product_id, SUM(quantity) AS total_sales
FROM orders
GROUP BY product_id;



五、视图的安全性控制

确保通过视图更新的数据符合视图的 WHERE 条件,防止数据越权修改。

-- 仅允许修改状态为 'pending' 的订单
CREATE VIEW pending_orders AS
SELECT * FROM orders WHERE status = 'pending'
WITH CHECK OPTION;

-- 以下操作会报错
UPDATE pending_orders SET status = 'paid' WHERE id = 100; 



六、视图的性能优化

  1. 避免嵌套视图:多层嵌套可能导致查询计划复杂化。
  2. 索引优化:确保视图查询涉及的基表字段已建立索引。
  3. 减少复杂计算:将计算逻辑移至应用层或使用缓存。



七、实际应用场景

数据权限隔离

-- 仅展示用户基本信息
CREATE VIEW customer_service_view AS
SELECT id, name, email FROM users;

简化报表查询

-- 每日销售统计视图
CREATE VIEW daily_sales AS
SELECT 
    DATE(order_time) AS sale_date,
    SUM(total_price) AS daily_revenue
FROM orders
GROUP BY sale_date;



← 上一篇 Java进阶——常用类及常用方法详解
记得点赞、关注、收藏哦!
下一篇 Java进阶——数组超详细整理 →

你可能感兴趣的:(MySQL,sql,mysql)