VIEW 视图管理
创建、修改和删除视图,将复杂查询封装为虚拟表
语法
CREATE [OR REPLACE] VIEW view_name AS SELECT ...; ALTER VIEW view_name AS SELECT ...; DROP VIEW [IF EXISTS] view_name;
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
CREATE VIEW |
创建视图 | CREATE VIEW v_active_users AS SELECT * FROM users WHERE status = 1; |
常用 |
OR REPLACE |
存在则替换 | CREATE OR REPLACE VIEW v_orders AS SELECT ...; |
常用 |
WITH CHECK OPTION |
限制通过视图的修改必须满足视图条件 | CREATE VIEW v_vip AS SELECT * FROM users WHERE level >= 3 WITH CHECK OPTION; |
进阶 |
ALTER VIEW |
修改视图定义 | ALTER VIEW v_active_users AS SELECT id, username FROM users WHERE status = 1; |
常用 |
DROP VIEW |
删除视图 | DROP VIEW IF EXISTS v_active_users; |
常用 |
示例
创建订单统计视图
CREATE OR REPLACE VIEW v_order_summary AS SELECT u.id AS user_id, u.username, COUNT(o.id) AS order_count, SUM(o.total_amount) AS total_spent, MAX(o.created_at) AS last_order_time FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id, u.username;
将复杂的统计查询封装为视图,使用时像普通表一样 SELECT
使用视图简化查询
-- 直接查询视图 SELECT username, order_count, total_spent FROM v_order_summary WHERE order_count >= 10 ORDER BY total_spent DESC LIMIT 20;
视图让复杂查询变得简单,也便于权限控制
创建安全视图(隐藏敏感列)
-- 给客服人员使用的视图,隐藏密码和敏感信息 CREATE VIEW v_user_info AS SELECT id, username, email, phone, status, created_at FROM users; -- 只授权客服访问视图 GRANT SELECT ON ecommerce.v_user_info TO 'support'@'%';
通过视图控制数据访问范围,不暴露底层表结构
查看视图定义
-- 查看视图列表 SHOW FULL TABLES WHERE Table_type = 'VIEW'; -- 查看视图创建语句 SHOW CREATE VIEW v_order_summary;
定期检查视图定义是否需要更新
常见错误
ERROR 1356: View references invalid table(s) or column(s)
视图引用的表或列已被修改或删除,需要重新创建视图
ERROR 1471: The target table is not updatable
包含 GROUP BY、DISTINCT、聚合函数的视图不可更新,只能查询
技巧
- 视图不存储数据,每次查询都会执行底层 SQL,复杂视图可能影响性能
- 用视图做权限隔离:给用户授权视图而非底层表
- 视图命名建议加 v_ 前缀,便于区分表和视图