下面想象一个这样的场景,你的数据库有一个表中储存有用户信息,姑且称为user表。
.schema user
CREATE TABLE user(id integer,name text,telphone text,unique(id));
表user中储存有 id: 相当于用户的实际ID,唯一
name: 用户的用户名,供显示或者登录的时候使用
telphone:一个附加信息,电话号码
一般我们程序中还会有一个储存用户数据的表,这里引用为data表,里面储存的是一些用户数据,完全可以自定义。在多用户的情况下我们一般会添加一个字段user_id来表示这个数据的所属用户。
.schema data
CREATE TABLE data(message text,time datetime,user_id integer);
这是一个简单的场景,现在我们的需求是 提供一个用户界面,可以显示出 姓名,时间,信息
我们需要怎么做呢,(这里不提我曾经见过的一个中规模程序中逻辑控制拼接这些信息的了,代码冗余且丑陋,性能更不用提~)
我们在数据库中创建一个view来解决(引用为view1):
.schema view1
CREATE VIEW view1 as select (select name from user where id=data.user_id) as name,time,message from data;
查询view1的方式与查询table一样,view与table的区别就是view只可以执行查询的操作,不能执行插入,更新数据等操作,因为view不对应实际的物理内存,只是一个预定义的查询语句而已。
现在我往user与data表中插入了一些数据
sqlite> select * from user;
1|文文|100
2|清清|100
sqlite> select * from data;
data1|2014-12-08 11:19:19|1
data2|2014-12-08 11:19:23|1
data3|2014-12-08 11:19:27|1
data4|2014-12-08 11:19:30|1
data5|2014-12-08 11:19:34|1
data1|2014-12-08 11:19:39|2
data2|2014-12-08 11:19:42|2
data3|2014-12-08 11:19:45|2
data4|2014-12-08 11:19:49|2
data5|2014-12-08 11:19:52|2
现在查询view1的结果是
sqlite> select * from view1;
文文|2014-12-08 11:19:19|data1
文文|2014-12-08 11:19:23|data2
文文|2014-12-08 11:19:27|data3
文文|2014-12-08 11:19:30|data4
文文|2014-12-08 11:19:34|data5
清清|2014-12-08 11:19:39|data1
清清|2014-12-08 11:19:42|data2
清清|2014-12-08 11:19:45|data3
清清|2014-12-08 11:19:49|data4
清清|2014-12-08 11:19:52|data5
达到了合并两张表的效果。在数据库中定义好之后可以直接查询这个视图(视图储存在数据库中)。 当然这个可以作为查询历史数据用,view还可以有更好的更强大的方式去显示。
比如下面这个场景:
你程序中有个页面是获取当前每个用户最新的一个记录显示。程序后台将数据源源不断地存进数据库,前台固定频率查询最新的一条数据来显示,可以说是实时显示的意思。
创建一个视图(引用为view2)
.schema view2
create view view2 as select (select name from user where id=data.user_id) as name,max(time),message from data group by user_id;
sqlite> select * from view2;
文文|2014-12-08 11:19:34|data5
清清|2014-12-08 11:19:52|data5
这样就做成了一张实时最新的数据表单,可以供用户查看实时数据。
当然不必把任何显示的数据都预先做成view 比如排序,筛选等,也可以做成一个view后再执行相应的查询操作。
预先做成的view 可以直接作为 c#或者QT里的 tablecontrol/tableview 数据源来使用,极大地减少了程序的复杂度,提升了效率。