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