大道至簡—SQLite3 使用教學

OS X自從10.4後把SQLite這套相當出名的數據庫軟件,放進了作業系統工具集裏。OS X包裝的是第三版的SQLite,又稱SQLite3。這套軟件有幾個特色:
        軟件屬於公共財(public domain),SQLite可說是某種「美德軟件」(virtueware),作者本人放棄着作權,而給使用SQLite的人以下的「祝福」(blessing):
        May you do good and not evil. 願你行善莫行惡
        May you find forgiveness for yourself and forgive others. 願你原諒自己寬恕他人
        May you share freely, never taking more than you give. 願你寬心與人分享,所取不多於你所施予
        支援大多數的SQL指令(下面會簡單介紹)。
        一個檔案就是一個數據庫。不需要安裝數據庫服務器軟件。
        完整的Unicode支援(因此沒有跨語系的問題)。
        速度很快。
目前在OS X 10.4裏,SQLite是以/usr/bin/sqlite3的形式包裝,也就說這是一個命令列工具,必須先從終端機(Terminal.app或其他 程序)進入shell之後才能使用。網絡上有一些息協助使用SQLite的視覺化工具,但似乎都沒有像CocoaMySQL(配合MySQL數據庫使用) 那般好用。或許隨時有驚喜也未可知,以下僅介紹命令列的操作方式。
SQLite顧名思議是以SQL爲基礎的數據庫軟件,SQL是一套強大的數據庫語言,主要概念是由「數據庫」、「資料表」(table)、「查詢指 令」(queries)等單元組成的「關聯性數據庫」(進一步的概念可參考網絡上各種關於SQL及關聯性數據庫的文件)。因爲SQL的查詢功能強大,語法 一致而入門容易,因此成爲現今主流數據庫的標準語言(微軟、Oracle等大廠的數據庫軟件都提供SQL語法的查詢及操作)。
以下我們就建立數據庫、建立資料表及索引、新增資料、查詢資料、更改資料、移除資料、sqlite3命令列選項等幾個項目做簡單的介紹。

目錄
        1 建立數據庫檔案
        2 在sqlite3提示列下操作
        3 SQL的指令格式
        4 建立資料表
        5 建立索引
        6 加入一筆資料
        7 查詢資料
        8 如何更改或刪除資料
        9 其他sqlite的特別用法
        10 小結
 
建立數據庫檔案
用sqlite3建立數據庫的方法很簡單,只要在shell下鍵入(以下$符號爲shell提示號,請勿鍵入):
$ sqlite3 foo.db
如果目錄下沒有foo.db,sqlite3就會建立這個數據庫。sqlite3並沒有強制數據庫檔名要怎麼取,因此如果你喜歡,也可以取個例如foo.icannameitwhateverilike的檔名。

在sqlite3提示列下操作
進入了sqlite3之後,會看到以下文字:
SQLite version 3.1.3
Enter ".help" for instructions
sqlite> 
這時如果使用.help可以取得求助,.quit則是離開(請注意:不是quit)

SQL的指令格式
所以的SQL指令都是以分號(;)結尾的。如果遇到兩個減號(--)則代表註解,sqlite3會略過去。

建立資料表
假設我們要建一個名叫film的資料表,只要鍵入以下指令就可以了:
create table film(title, length, year, starring);
這樣我們就建立了一個名叫film的資料表,裏面有name、length、year、starring四個字段。
這個create table指令的語法爲:
create table table_name(field1, field2, field3, ...);
table_name是資料表的名稱,fieldx則是字段的名字。sqlite3與許多SQL數據庫軟件不同的是,它不在乎字段屬於哪一種資料型態:sqlite3的字段可以儲存任何東西:文字、數字、大量文字(blub),它會在適時自動轉換。

建立索引
如果資料表有相當多的資料,我們便會建立索引來加快速度。好比說:
create index film_title_index on film(title);
意思是針對film資料表的name字段,建立一個名叫film_name_index的索引。這個指令的語法爲
create index index_name on table_name(field_to_be_indexed);
一旦建立了索引,sqlite3會在針對該字段作查詢時,自動使用該索引。這一切的操作都是在幕後自動發生的,無須使用者特別指令。

加入一筆資料
接下來我們要加入資料了,加入的方法爲使用insert into指令,語法爲:
insert into table_name values(data1, data2, data3, ...);
例如我們可以加入
insert into film values ('Silence of the Lambs, The', 118, 1991, 'Jodie Foster');
insert into film values ('Contact', 153, 1997, 'Jodie Foster');
insert into film values ('Crouching Tiger, Hidden Dragon', 120, 2000, 'Yun-Fat Chow');
insert into film values ('Hours, The', 114, 2002, 'Nicole Kidman');
如果該字段沒有資料,我們可以填NULL。

查詢資料
講到這裏,我們終於要開始介紹SQL最強大的select指令了。我們首先簡單介紹select的基本句型:
select columns from table_name where expression;
最常見的用法,當然是倒出所有數據庫的內容:
select * from film;
如果資料太多了,我們或許會想限制筆數:
select * from film limit 10;
或是照着電影年份來排列:
select * from film order by year limit 10;
或是年份比較近的電影先列出來:
select * from film order by year desc limit 10;
或是我們只想看電影名稱跟年份:
select title, year from film order by year desc limit 10;
查所有茱蒂佛斯特演過的電影:
select * from film where starring='Jodie Foster';
查所有演員名字開頭叫茱蒂的電影('%' 符號便是 SQL 的萬用字符):
select * from film where starring like 'Jodie%';
查所有演員名字以茱蒂開頭、年份晚於1985年、年份晚的優先列出、最多十筆,只列出電影名稱和年份:
select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10;
有時候我們只想知道數據庫一共有多少筆資料:
select count(*) from film;
有時候我們只想知道1985年以後的電影有幾部:
select count(*) from film where year >= 1985;
(進一步的各種組合,要去看SQL專書,不過你大概已經知道SQL爲什麼這麼流行了:這種語言允許你將各種查詢條件組合在一起──而我們還沒提到「跨數據庫的聯合查詢」呢!)

如何更改或刪除資料
瞭解select的用法非常重要,因爲要在sqlite更改或刪除一筆資料,也是靠同樣的語法。
例如有一筆資料的名字打錯了:
update film set starring='Jodie Foster' where starring='Jodee Foster';
就會把主角字段裏,被打成'Jodee Foster'的那筆(或多筆)資料,改回成Jodie Foster。
delete from film where year < 1970;
就會刪除所有年代早於1970年(不含)的電影了。

其他sqlite的特別用法
sqlite可以在shell底下直接執行命令:
sqlite3 film.db "select * from film;"
輸出 HTML 表格:
sqlite3 -html film.db "select * from film;"
將數據庫「倒出來」:
sqlite3 film.db ".dump" > output.sql
利用輸出的資料,建立一個一模一樣的數據庫(加上以上指令,就是標準的SQL數據庫備份了):
sqlite3 film.db < output.sql
在大量插入資料時,你可能會需要先打這個指令:
begin;
插入完資料後要記得打這個指令,資料纔會寫進數據庫中:
commit;

小結
以上我們介紹了SQLite這套數據庫系統的用法。事實上OS X也有諸於SQLiteManagerX這類的圖形接口程序,可以便利數據庫的操作。不過萬變不離其宗,瞭解SQL指令操作,SQLite與其各家變種就很容易上手了。
至於爲什麼要寫這篇教學呢?除了因爲OS X Tiger大量使用SQLite之外(例如:Safari的RSS reader,就是把文章存在SQLite數據庫裏!你可以開開看~/Library/Syndication/Database3這個檔案,看看裏面有 什麼料),OpenVanilla從0.7.2開始,也引進了以SQLite爲基礎的詞彙管理工具,以及全字庫的注音輸入法。因爲使用SQLite,這兩 個模塊不管數據庫內有多少筆資料,都可以做到「瞬間啓動」以及相當快速的查詢迴應。
將一套方便好用的數據庫軟件包進OS X中,當然也算是Apple相當相當聰明的選擇。再勤勞一點的朋友也許已經開始想拿SQLite來記錄各種東西(像我們其中就有一人寫了個程序,自動記錄 電池狀態,寫進SQLite數據庫中再做統計......)了。想像空間可說相當寬廣。
目前支援SQLite的程序語言,你能想到的大概都有了。這套數據庫2005年還贏得了美國O'Reilly Open Source Conference的最佳開放源代碼軟件獎,獎評是「有什麼東西能讓Perl, Python, PHP, Ruby語言團結一致地支援的?就是SQLite」。由此可見SQLite的地位了。而SQLite程序非常小,更是少數打 "gcc -o sqlite3 *",不需任何特殊設定就能跨平臺編譯的程序。小而省,小而美,SQLite連網站都不多贅言,直指SQL語法精要及API使用方法,原作者大概也可以算 是某種程序設計之道(Tao of Programming)裏所說的至人了。
Enjoy /usr/bin/sqlite3 in your OS X Tiger.:)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章