SQLite入門介紹(一)
什麼是SQLite
Sqlite是一款小型的、開源的、可嵌入、程式驅動式、無資料型別、支援ACID事務操作、效率高的關係型資料庫。
ACID指資料庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)。一個支援事務(Transaction)的資料庫,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證資料的正確性,交易過程極可能達不到交易方的要求。
原子性:整個事務中的所有操作(整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。)
隔離性:隔離狀態執行事務(如果事務是併發多個,系統也必須如同序列事務一樣操作。其主要特徵是保護性和不變性(Preserving an Invariant),以轉賬案例為例,假設有五個賬戶,每個賬戶餘額是100元,那麼五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論併發多少個,比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性)
一致性:在事務開始之前和事務結束以後(隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,執行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請求,使得在同一時間僅有一個請求用於同一資料。)
- 永續性:在事務完成以後,該事務對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。
SQLite是一個程序內的庫,實現了自給自足的、無伺服器的、零配置的、事務性的 SQL 資料庫引擎。它是一個零配置的資料庫,這意味著與其他資料庫一樣,我們不需要在系統中配置。
就像其他資料庫,SQLite 引擎不是一個獨立的程序,可以按應用程式需求進行靜態或動態連線。SQLite 直接訪問其儲存檔案。
為什麼用SQLite
- 不需要一個單獨的伺服器程序或操作的系統(無伺服器的)。
- SQLite 不需要配置,這意味著不需要安裝或管理。
- 一個完整的 SQLite 資料庫是儲存在一個單一的跨平臺的磁碟檔案。
- SQLite 是非常小的,是輕量級的,完全配置時小於 400KiB,省略可選功能配置時小於250KiB。
- SQLite 是自給自足的,這意味著不需要任何外部的依賴。
- SQLite 事務是完全相容 ACID 的,允許從多個程序或執行緒安全訪問。
- SQLite 支援 SQL92(SQL2)標準的大多數查詢語言的功能。
- SQLite 使用 ANSI-C 編寫的,並提供了簡單和易於使用的 API。
- SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中執行。
SQLite安裝
其實如果要在Android中使用SQLite資料庫的話,因為SQLite不需要配置,所以可以直接使用,你只需要一個有用的資料庫圖形工具就可以了,不過這裡我仍然說明下如何在Windows下安裝SQLite。
說是安裝,其實只是將一些檔案放到你指定的目錄下,在配置環境變數罷了。
請訪問 SQLite 下載頁面,從 Windows 區下載預編譯的二進位制檔案dll和tools。解壓後你能得到sqlite3.def、sqlite3.dll檔案還有sqlite3.exe, sqlite3_analyzer.exe, sqldiff.exe。
在cmd中輸入sqlite3,你就可以在當前目錄下操作資料庫了。
資料庫圖形工具
隨著資料庫的廣泛應用和發展,只在命令列上操作資料庫無疑會降低我們的工作效率,於是就有許多的資料庫圖形工具的出現。在這裡我推薦使用Navicat Premium,它操作簡單。我這裡提供它的下載連結。http://download.csdn.net/download/hardworkingant/9820595。
SQLite資料庫
建立資料庫
sqlite3 test.db 或 .open test.db //會在當前目錄下生成.db檔案
sqlite3 test.db .dump > test.sql //.dump命令可以將db檔案轉換為sql語句儲存。
sqlite test.db < test.sql //這樣就可以用sql檔案恢復test.db
附加資料庫
ATTACH DATABASE 'DatabaseName' As 'Alias-Name';
如果資料庫尚未被建立,上面的命令將建立一個數據庫,如果資料庫已存在,則把資料庫檔名稱與邏輯資料庫 ‘Alias-Name’ 繫結在一起。
sqlite> ATTACH DATABASE 'test.db' as 'TEST';
執行後,用.database檢視,你就會發現除了main資料庫外,多出了test資料庫。
這時用.table命令也可以檢視到test.db的資料表。
分離資料庫
DETACH DATABASE 'Alias-Name';
SQLite命令
命令 | 描述 |
---|---|
.backup ?DB? FILE | 備份 DB 資料庫(預設是 “main”)到 FILE 檔案。 |
.bail ON | OFF |
.databases | 列出附加資料庫的名稱和檔案。 |
.dump ?TABLE? | 以 SQL 文字格式轉儲資料庫。如果指定了 TABLE 表,則只轉儲匹配 LIKE 模式的 TABLE 表。 |
.echo ON or OFF | 開啟或關閉 echo 命令。 |
.exit | 退出 SQLite 提示符。 |
.explain ON or OFF | 開啟或關閉適合於 EXPLAIN 的輸出模式。如果沒有帶引數,則為 EXPLAIN on,及開啟 EXPLAIN。 |
.header(s) ON or OFF | 開啟或關閉頭部顯示。 |
.help | 顯示訊息。 |
.import FILE TABLE | 匯入來自 FILE 檔案的資料到 TABLE 表中。 |
.indexes ?TABLE? | 顯示所有索引的名稱。如果指定了 TABLE 表,則只顯示匹配 LIKE 模式的 TABLE 表的索引。 |
.load FILE ?ENTRY? | 載入一個擴充套件庫。 |
.log FILE or off | 開啟或關閉日誌。FILE 檔案可以是 stderr(標準錯誤)/stdout(標準輸出)。 |
.mode MODE | 設定輸出模式,MODE 可以是下列之一:1.csv 逗號分隔的值 2.column 左對齊的列 3.html HTML的table 程式碼 4.insert TABLE表的 SQL 插入(insert)語句 5.line 每行一個值 6.list 由 .separator 字串分隔的值 7.tabs 由 Tab 分隔的值 8.tcl TCL 列表元素 |
.nullvalue STRING | 在 NULL 值的地方輸出 STRING 字串。 |
.output FILENAME | 傳送輸出到 FILENAME 檔案。 |
.output stdout | 傳送輸出到螢幕。 |
.print STRING… | 逐字地輸出 STRING 字串。 |
.prompt MAIN CONTINUE | 替換標準提示符。 |
.quit | 退出 SQLite 提示符。 |
.read FILENAME | 執行 FILENAME 檔案中的 SQL。 |
.schema ?TABLE? | 顯示 CREATE 語句。如果指定了 TABLE 表,則只顯示匹配 LIKE 模式的 TABLE 表。 |
.separator STRING | 改變輸出模式和 .import 所使用的分隔符。 |
.show | 顯示各種設定的當前值。 |
.stats ON or OFF | 開啟或關閉統計。 |
.tables ?PATTERN? | 列出匹配 LIKE 模式的表的名稱。 |
.timeout MS | 嘗試開啟鎖定的表 MS 毫秒。 |
.width NUM NUM | 為 “column” 模式設定列寬度。 |
.timer ON | OFF 開啟或關閉 CPU 定時器。 |
sqlite>.show
echo: off
explain: off
headers: off
mode: column
nullvalue: “”
output: stdout
separator: “|”
width:
sqlite>.mode column
sqlite>.headers on
sqlite>.timer on
這樣你就能改變輸出個格式,顯示出列名,CPU時間。
主表中儲存資料庫表的關鍵資訊,並把它命名為 sqlite_master。如要查看錶概要,可按如下操作:
sqlite>.schema sqlite_master
這將產生如下結果:
CREATE TABLE sqlite_master (
type text,
name text,
tbl_name text,
rootpage integer,
sql text
);
SQLite資料型別
儲存類
儲存類 | 描述 |
---|---|
NULL | 值是一個 NULL 值。 |
INTEGER | 值是一個帶符號的整數,根據值的大小儲存在 1、2、3、4、6 或 8 位元組中。 |
REAL | 值是一個浮點值,儲存為 8 位元組的 IEEE 浮點數字。 |
TEXT | 值是一個文字字串,使用資料庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)儲存。 |
BLOB | 值是一個 blob 資料,完全根據它的輸入儲存。 |
親和(Affinity)型別
SQLite支援列的親和型別概念。任何列仍然可以儲存任何型別的資料,當資料插入時,該欄位的資料將會優先採用親緣型別作為該值的儲存方式。SQLite目前的版本支援以下五種親緣型別:
親和型別 | 描述 |
---|---|
TEXT | 數值型資料在被插入之前,需要先被轉換為文字格式,之後再插入到目標欄位中。 |
NUMERIC | 當文字資料被插入到親緣性為NUMERIC的欄位中時,如果轉換操作不會導致資料資訊丟失以及完全可逆,那麼SQLite就會將該文字資料轉換為INTEGER或REAL型別的資料,如果轉換失敗,SQLite仍會以TEXT方式儲存該資料。對於NULL或BLOB型別的新資料,SQLite將不做任何轉換,直接以NULL或BLOB的方式儲存該資料。需要額外說明的是,對於浮點格式的常量文字,如”30000.0”,如果該值可以轉換為INTEGER同時又不會丟失數值資訊,那麼SQLite就會將其轉換為INTEGER的儲存方式。 |
INTEGER | 對於親緣型別為INTEGER的欄位,其規則等同於NUMERIC,唯一差別是在執行CAST表示式時。 |
REAL | 其規則基本等同於NUMERIC,唯一的差別是不會將”30000.0”這樣的文字資料轉換為INTEGER儲存方式。 |
NONE | 不做任何的轉換,直接以該資料所屬的資料型別進行儲存。 |
下表為當建立 SQLite3 表時可使用的各種資料型別名稱,同時也顯示了相應的親和型別:
資料型別 | 親和型別 |
---|---|
INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8 | INTEGER |
CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255), NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100), TEXT, CLOB | TEXT |
BLOB, no datatype specified | NONE |
REAL, DOUBLE, DOUBLE PRECISION, FLOAT | REAL |
NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME | NUMERIC |
Boolean 資料型別
SQLite 沒有單獨的 Boolean 儲存類。相反,布林值被儲存為整數 0(false)和 1(true)。
Date 與 Time 資料型別
SQLite 沒有一個單獨的用於儲存日期和/或時間的儲存類,但 SQLite 能夠把日期和時間儲存為 TEXT、REAL 或 INTEGER 值。
儲存類 | 日期格式 |
---|---|
TEXT | 格式為 “YYYY-MM-DD HH:MM:SS.SSS” 的日期。 |
REAL | 從公元前 4714 年 11 月 24 日格林尼治時間的正午開始算起的天數。 |
INTEGER | 從 1970-01-01 00:00:00 UTC 算起的秒數。 |
可以以任何上述格式來儲存日期和時間,並且可以使用內建的日期和時間函式來自由轉換不同格式。
SQLite的語法有很多,一個部落格不可能將其說完,那會顯得太臃腫了,所以就講到這裡,有興趣的朋友可以看我的SQLite入門介紹(二)。
結束語:本文僅用來學習記錄,參考查閱。