Spanner视图 #
一、视图概述 #
1.1 视图概念 #
text
视图特点:
├── 虚拟表,不存储数据
├── 基于查询定义
├── 简化复杂查询
├── 提供数据抽象
└── 支持权限控制
1.2 视图优势 #
text
视图优势:
├── 简化复杂查询
├── 提供数据安全
├── 逻辑数据独立
├── 重用查询逻辑
└── 统一数据访问接口
二、创建视图 #
2.1 基本语法 #
sql
CREATE VIEW view_name AS
SELECT ...;
2.2 创建简单视图 #
sql
-- 示例表
CREATE TABLE users (
user_id INT64 NOT NULL,
name STRING(100) NOT NULL,
email STRING(255),
status STRING(20),
salary FLOAT64
) PRIMARY KEY (user_id);
-- 创建视图
CREATE VIEW active_users AS
SELECT user_id, name, email
FROM users
WHERE status = 'active';
-- 使用视图
SELECT * FROM active_users;
2.3 创建复杂视图 #
sql
-- 创建聚合视图
CREATE VIEW user_stats AS
SELECT
status,
COUNT(*) AS user_count,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary
FROM users
GROUP BY status;
-- 创建JOIN视图
CREATE VIEW user_orders AS
SELECT
u.user_id,
u.name,
o.order_id,
o.amount
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id;
-- 使用视图
SELECT * FROM user_stats;
SELECT * FROM user_orders WHERE user_id = 1;
2.4 创建带列别名的视图 #
sql
-- 指定视图列名
CREATE VIEW user_summary (id, user_name, user_email) AS
SELECT user_id, name, email
FROM users
WHERE status = 'active';
-- 使用视图
SELECT id, user_name FROM user_summary;
三、安全视图 #
3.1 安全视图概念 #
text
安全视图特点:
├── 使用SQL SECURITY INVOKER
├── 以调用者权限执行
├── 支持行级安全
└── 敏感数据保护
3.2 创建安全视图 #
sql
-- 创建安全视图
CREATE VIEW employee_salaries
SQL SECURITY INVOKER AS
SELECT user_id, name, salary
FROM users
WHERE dept_id = SESSION_CONTEXT('dept_id');
-- 只有有权限的用户才能查看
3.3 行级安全 #
sql
-- 使用会话变量实现行级安全
CREATE VIEW my_orders AS
SELECT * FROM orders
WHERE user_id = SESSION_CONTEXT('user_id');
-- 设置会话变量
-- 在应用层设置SESSION_CONTEXT
四、使用视图 #
4.1 查询视图 #
sql
-- 像表一样查询视图
SELECT * FROM active_users;
-- 带条件查询
SELECT * FROM active_users WHERE user_id = 1;
-- 排序和分页
SELECT * FROM user_stats
ORDER BY user_count DESC
LIMIT 10;
4.2 视图嵌套 #
sql
-- 创建基于视图的视图
CREATE VIEW vip_users AS
SELECT * FROM active_users
WHERE user_id IN (
SELECT user_id FROM orders
GROUP BY user_id
HAVING SUM(amount) > 10000
);
-- 使用嵌套视图
SELECT * FROM vip_users;
4.3 视图与子查询 #
sql
-- 视图替代复杂子查询
-- 原始查询
SELECT u.name, o.total
FROM users u,
(SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id) o
WHERE u.user_id = o.user_id;
-- 使用视图简化
CREATE VIEW order_totals AS
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id;
SELECT u.name, o.total
FROM users u
INNER JOIN order_totals o ON u.user_id = o.user_id;
五、管理视图 #
5.1 查看视图 #
sql
-- 查看所有视图
SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE table_type = 'VIEW';
-- 查看视图定义
SELECT table_name, view_definition
FROM INFORMATION_SCHEMA.VIEWS;
-- 查看视图列
SELECT column_name, data_type
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'active_users';
5.1 修改视图 #
sql
-- Spanner不支持ALTER VIEW
-- 需要先删除再创建
-- 删除视图
DROP VIEW IF EXISTS active_users;
-- 重新创建
CREATE VIEW active_users AS
SELECT user_id, name, email, status
FROM users
WHERE status IN ('active', 'premium');
5.2 删除视图 #
sql
-- 删除视图
DROP VIEW active_users;
-- 如果存在则删除
DROP VIEW IF EXISTS active_users;
六、视图限制 #
6.1 功能限制 #
text
视图限制:
├── 不支持INSERT/UPDATE/DELETE
├── 不能创建索引
├── 不能有主键
├── 不能是交错表
└── 不支持某些SQL特性
6.2 性能考虑 #
text
视图性能考虑:
├── 每次查询都执行底层查询
├── 复杂视图可能影响性能
├── 建议使用EXPLAIN分析
└── 考虑物化数据(实际表)
七、视图最佳实践 #
7.1 设计建议 #
text
视图设计建议:
├── 简化复杂查询
├── 提供数据抽象
├── 实现安全控制
├── 重用查询逻辑
└── 保持视图简单
7.2 命名规范 #
text
视图命名建议:
├── 使用有意义的名称
├── 区分表和视图
├── 如: v_active_users, user_view
└── 添加注释说明
7.3 性能建议 #
text
视图性能建议:
├── 避免过度嵌套
├── 使用EXPLAIN分析
├── 考虑查询优化
├── 监控视图性能
└── 复杂逻辑考虑实际表
八、总结 #
视图使用场景:
| 场景 | 说明 |
|---|---|
| 查询简化 | 封装复杂查询 |
| 数据安全 | 隐藏敏感数据 |
| 逻辑独立 | 屏蔽表结构变化 |
| 权限控制 | 行级安全 |
最佳实践:
text
1. 合理使用视图
└── 简化复杂查询
2. 注意性能影响
└── 使用EXPLAIN分析
3. 实现安全控制
└── 使用安全视图
4. 保持视图简单
└── 避免过度嵌套
5. 定期维护视图
└── 更新和优化
下一步,让我们学习变更流!
最后更新:2026-03-27