-- 示例:隐藏敏感字段 CREATEVIEW user_public AS SELECT id, username, email, created_at FROM users; -- 隐藏了password、phone等敏感字段
2. 简化查询
使复杂的查询易于理解和使用:
1 2 3 4 5 6 7 8 9 10 11
-- 复杂查询封装为视图 CREATEVIEW sales_summary AS SELECT p.name, p.price, s.quantity, p.price * s.quantity AS total, s.sale_date FROM products p JOIN sales s ON p.id = s.product_id WHERE s.sale_date >= DATE_SUB(NOW(), INTERVAL30DAY);
3. 数据抽象
为应用程序提供统一的数据接口,屏蔽底层表结构变化:
1 2 3 4 5 6 7 8 9
-- 即使底层表结构改变,视图接口保持不变 CREATEVIEW customer_info AS SELECT c.id, c.name, a.address, a.city FROM customers c LEFTJOIN addresses a ON c.id = a.customer_id;
-- 再次查询视图,自动包含新数据 mysql>SELECT*FROM totol_product; +--------+-------+----------+-------+ | name | price | quantity | Total | +--------+-------+----------+-------+ | apple |5|7|35| | balane |6|20|120| | pear |7|10|70| +--------+-------+----------+-------+ 3rowsinset (0.00 sec)
关键点:
视图不存储数据,每次查询都是实时计算
基础表数据变化,视图结果自动反映变化
视图提供了数据的实时视图
1.4 视图创建最佳实践
1. 使用明确的列名
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 推荐:明确指定列名 CREATEVIEW sales_report AS SELECT p.product_name AS product, p.unit_price AS price, s.quantity, s.sale_date ASdate FROM products p JOIN sales s ON p.id = s.product_id;
-- 不推荐:使用SELECT * CREATEVIEW sales_report AS SELECT*FROM products p JOIN sales s ON p.id = s.product_id;
2. 添加注释说明
1 2 3 4 5 6 7 8 9 10 11
-- 创建带注释的视图 CREATEVIEW customer_summary AS SELECT c.id, c.name, COUNT(o.id) AS order_count, SUM(o.total) AS total_amount FROM customers c LEFTJOIN orders o ON c.id = o.customer_id GROUPBY c.id, c.name COMMENT '客户订单汇总视图';
3. 使用WITH CHECK OPTION(可更新视图)
1 2 3 4 5 6
-- 创建带检查选项的视图 CREATEVIEW active_users AS SELECT*FROM users WHERE status ='active' WITHCHECK OPTION;
-- 这样可以防止通过视图插入不符合条件的数据
2. 查看视图
2.1 查看视图列表
方法一:使用SHOW TABLES
1 2 3 4 5 6 7 8 9 10 11 12
-- 查看当前数据库的所有表和视图 mysql> USE bgx; Database changed
-- 或者导出到文件 SELECT VIEW_DEFINITION INTO OUTFILE '/tmp/u_grant_backup.sql' FROM information_schema.VIEWS WHERE TABLE_SCHEMA ='bgx'AND TABLE_NAME ='u_grant';
-- 创建可更新视图 CREATEVIEW active_products AS SELECT*FROM products WHERE status ='active' WITHCHECK OPTION;
-- 通过视图更新数据 UPDATE active_products SET price =99.99 WHERE id =1;
可更新视图的限制:
不能包含聚合函数
不能包含DISTINCT、GROUP BY、HAVING
不能包含子查询
必须包含所有NOT NULL列
5.2 视图性能优化
1. 使用MERGE算法
1 2 3
-- 使用MERGE算法提高性能 CREATE ALGORITHM=MERGEVIEW sales_view AS SELECT*FROM sales WHERE status ='active';
2. 避免复杂计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-- 不推荐:在视图中进行复杂计算 CREATEVIEW complex_view AS SELECT *, (SELECTCOUNT(*) FROM orders WHERE customer_id = c.id) AS order_count FROM customers c;
-- 推荐:使用JOIN CREATEVIEW customer_orders AS SELECT c.*, COUNT(o.id) AS order_count FROM customers c LEFTJOIN orders o ON c.id = o.customer_id GROUPBY c.id;
5.3 视图安全最佳实践
1. 使用SQL SECURITY INVOKER
1 2 3
-- 以调用者权限执行,提高安全性 CREATESQL SECURITY INVOKER VIEW user_data AS SELECT id, name, email FROM users;
2. 隐藏敏感信息
1 2 3 4 5 6 7 8
-- 隐藏敏感字段 CREATEVIEW public_user_info AS SELECT id, username, created_at FROM users; -- 隐藏了password、email、phone等敏感信息
3. 行级安全控制
1 2 3 4
-- 基于用户权限的视图 CREATEVIEW my_orders AS SELECT*FROM orders WHERE user_id =CURRENT_USER();