下面想象一个这样的场景,你的数据库有一个表中储存有用户信息,姑且称为user表。 sql
.schema user 数据库
CREATE TABLE user(id integer,name text,telphone text,unique(id));表user中储存有 id: 至关于用户的实际ID,惟一
name: 用户的用户名,供显示或者登陆的时候使用 c#
telphone:一个附加信息,电话号码 性能
通常咱们程序中还会有一个储存用户数据的表,这里引用为data表,里面储存的是一些用户数据,彻底能够自定义。在多用户的状况下咱们通常会添加一个字段user_id来表示这个数据的所属用户。 spa
.schema data code
CREATE TABLE data(message text,time datetime,user_id integer);这是一个简单的场景,如今咱们的需求是 提供一个用户界面,能够显示出 姓名,时间,信息
咱们须要怎么作呢,(这里不提我曾经见过的一个中规模程序中逻辑控制拼接这些信息的了,代码冗余且丑陋,性能更不用提~) sqlite
咱们在数据库中建立一个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表中插入了一些数据 it
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 数据源来使用,极大地减小了程序的复杂度,提高了效率。