標籤:ar 使用 sp on 資料 2014 bs 代碼 as
下面想象一個這樣的情境,你的資料庫有一個表中儲存有使用者資訊,姑且稱為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|文文|1002|清清|100
sqlite> select * from data;data1|2014-12-08 11:19:19|1data2|2014-12-08 11:19:23|1data3|2014-12-08 11:19:27|1data4|2014-12-08 11:19:30|1data5|2014-12-08 11:19:34|1data1|2014-12-08 11:19:39|2data2|2014-12-08 11:19:42|2data3|2014-12-08 11:19:45|2data4|2014-12-08 11:19:49|2data5|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 資料來源來使用,極大地減少了程式的複雜度,提升了效率。
sqlite view定義查詢頁面