视图即虚拟表,也成为派生表,因为它们的内容都派生自其他表的查询结果。虽然视图看起来感觉就像基本表一样,但是它们不是基本表。基本表的内容是持久的,而视图的内容是在使用时动态产生的。创建视图的语法如下:
1 | create view name as select-stmt; |
视图的名称通过 name 指定,其定义由 select-stmt 定义。最终生成的视图看起来就像名为 name 的基本表。想象一下你有一个一直在运行的查询,你会对多次编写这样的查询感到厌烦,此时视图则是这种情况的最佳选择。在开始创建视图之前,我们先创建基本表 TYPES 和 FOODS:
1 | -- 创建 TYPES 表,插入数据 |
1 | -- 创建 FOODS 表,插入数据 |
基本表创建完毕后,紧接着执行如下查询:
1 | SELECT F.NAME, T.NAME |
该查询返回所有 FOOD 的名称,以及所在系列。如果 FOODS 表的数据量很大的话,查询结果将是一个大表,但不用每次需要这些结果时都写出前面的查询,我们可以将它们整理成命名为 FOODS_VIEW 的视图形式。
1 | CREATE VIEW FOODS_VIEW AS |
现在你可以像查询表一样查询 FOODS_VIEW,例如:
1 | SELECT FD AS FOOD_NAME, TP AS FOOD_TYPE FROM FOODS_VIEW WHERE FOOD_TYPE LIKE '%果'; |
视图的内容是动态生成的。因此,每次使用 FOODS_VIEW 时,基于数据库的当前数据执行相关的 SQL 语句,产生结果。其他数据库通常不提供视图的其他功能,例如基于视图的安全,但是 SQLite 提供,使用操作控制工具与 SQLite 编程,就可提供基于视图的安全。
最后,通过提供 name,使用命令 drop view 删除视图。语句如下:
1 | drop view name; |
可更新的视图:关系模型需要可更新的视图。你可以修改这些视图,可以对这些视图进行 insert 或 update 操作,例如,这些变化可以直接应用到底层表中。SQLite 不支持可更新的视图。但是,使用触发器可以创建类似的东西。详情请参考文章《SQLite 触发器》。