下面想象一個這樣的場景,你的數據庫有一個表中儲存有用戶信息,姑且稱爲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 數據源來使用,極大地減小了程序的複雜度,提高了效率。