1. 程式人生 > >SQLite入門介紹(一)

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入門介紹(二)

結束語:本文僅用來學習記錄,參考查閱。