本文全面介绍Mysql 视图相关的核心知识。包括介绍视图定义,基于查询结果的虚拟表,有简化查询、保障安全、解耦逻辑等作用。讲解创建、修改、删除视图的操作,以及及视图可更新条件、安全性控制及性能优化方法。
视图是基于一个或多个表的查询结果生成的虚拟表,不存储实际数据,数据动态生成。
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;
CREATE VIEW view_name AS
SELECT column1, column2 FROM table WHERE condition;
CREATE OR REPLACE VIEW view_name AS
SELECT new_columns FROM table;
ALTER VIEW view_name AS
SELECT updated_query;
DROP VIEW view_name;
MySQL 支持两种视图处理算法:
将视图查询与外部查询合并,直接执行优化后的 SQL。
-- (默认)
CREATE VIEW vip_users AS
SELECT id, name FROM users WHERE level >= 3;
将视图结果存入临时表,再基于临时表执行外部查询。
-- 显式指定 TEMPTABLE 算法
CREATE ALGORITHM = TEMPTABLE VIEW product_sales AS
SELECT product_id, SUM(quantity) AS total_sold
FROM orders
GROUP BY product_id;
-- 创建可更新视图
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;
-- 仅展示用户基本信息
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进阶——数组超详细整理 → |