SQLite 的视图(View)提供了一种虚拟表的概念:
-
视图的概念
- 视图是基于 SQL 查询结果的虚拟表
- 不存储实际数据,只存储查询定义
- 每次查询视图时都执行底层的 SQL 语句
-
创建视图
sql-- 创建简单视图 CREATE VIEW user_orders AS SELECT u.id, u.name, COUNT(o.id) as order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id, u.name; -- 创建带过滤条件的视图 CREATE VIEW active_users AS SELECT * FROM users WHERE status = 'active'; -
视图的优势
- 简化复杂查询:将复杂的 JOIN 和聚合操作封装在视图中
- 数据安全性:限制用户访问特定列或行
- 逻辑抽象:隐藏底层表结构的变化
- 代码重用:避免重复编写相同的查询
-
查询视图
sql-- 查询视图就像查询普通表一样 SELECT * FROM user_orders WHERE order_count > 5; -
管理视图
sql-- 查看视图定义 SELECT sql FROM sqlite_master WHERE type = 'view' AND name = 'user_orders'; -- 删除视图 DROP VIEW view_name; -- 修改视图(需要先删除再创建) DROP VIEW IF EXISTS user_orders; CREATE VIEW user_orders AS ...; -
视图的限制
- SQLite 的视图是只读的(默认情况下)
- 不能直接对视图执行 INSERT、UPDATE、DELETE 操作
- 可以使用 INSTEAD OF 触发器实现可更新视图
sqlCREATE TRIGGER update_user_orders INSTEAD OF UPDATE ON user_orders BEGIN UPDATE users SET name = NEW.name WHERE id = NEW.id; END; -
视图的使用场景
- 报表和数据分析
- 数据权限控制
- 简化应用层的查询逻辑
- 跨表查询的抽象
-
性能考虑
- 视图本身不存储数据,每次查询都执行底层 SQL
- 复杂视图可能影响查询性能
- 可以考虑使用物化视图(通过表定期刷新)
视图是 SQLite 提供数据抽象和安全控制的重要机制。