SQLite 入門教程

不是 MySQL 用不起,而是 SQLite 更有性價比,絕大多數的 Web 應用 SQLite 都可以滿足。

SQLite 是一個用 C 語言編寫的開源、輕量級、快速、獨立且高可靠性的 SQL 數據庫引擎,它提供了功能齊全的數據庫解決方案。SQLite 幾乎可以在所有的手機和計算機上運行,它被嵌入到無數人每天都在使用的衆多應用程序中。

此外,SQLite 還具有穩定的文件格式、跨平臺能力和向後兼容性等特點。SQLite 的開發者承諾,至少在 2050 年之前保持該文件格式不變。

本文將介紹 SQLite 的基礎知識和使用方法。

SQLite 安裝

SQLite 官方頁面(https://sqlite.org/download.html) 下載適合你目標系統的壓縮包。

下載並解壓後,無論是在 Windows、Linux 還是 Mac OS 系統上,你都可以得到一個 sqlite3 命令行工具。

以下是在 Mac OS 上解壓後得到的命令行工具示例:

➜  sqlite-tools-osx-x64-3450100 ls -l
total 14952
-rwxr-xr-x@ 1 darcy  staff  1907136  1 31 00:27 sqldiff
-rwxr-xr-x@ 1 darcy  staff  2263792  1 31 00:25 sqlite3
-rwxr-xr-x@ 1 darcy  staff  3478872  1 31 00:27 sqlite3_analyzer

SQLite 使用場景

SQLite 與客戶端/服務器類型的 SQL 數據庫引擎(例如 MySQL、Oracle、PostgreSQL 或 SQL Server)不同,它們解決的問題也不同。

服務器端的 SQL 數據庫引擎旨在實現企業級數據的共享存儲,它們強調的是可擴展性、併發性、集中化和控制性。相比之下,SQLite 通常用於爲個人應用程序和設備提供本地數據存儲,它強調的是經濟、高效、可靠、獨立和簡單

SQLite 的使用場景:

  1. 嵌入式設備和物聯網

    SQLite 不需要額外的管理或服務啓動,非常適合用在手機、電視、機頂盒、遊戲機、相機、手錶等智能設備上。

  2. 網站

    多數低流量網站可以使用 SQLite 作爲數據庫。根據官方網站的介紹,通常每天訪問量少於 10 萬次的網站都可以很好地運行 SQLite。SQLite 的官方網站(https://www.sqlite.org/)自身就使用 SQLite 作爲數據庫引擎,每天處理大約 50 萬 HTTP 請求,其中約 15-20% 的請求涉及數據庫查詢

  3. 數據分析

    SQLite3 命令行工具能方便地與 CSV 和 Excel 文件進行交互操作,適合分析大數據集。同時,許多語言(如 Python)都內置了 SQLite 支持,可以輕鬆編寫腳本進行數據操作。

  4. 緩存

    SQLite 可以作爲應用服務的緩存,減輕對中心數據庫的壓力。

  5. 內存或者臨時數據庫

    得益於 SQLite 的簡單快速,非常使用程序演示或者日常測試。

SQLite 不適合的場景包括

  1. 需要通過網絡訪問數據庫的情況。SQLite 是一個本地文件數據庫,沒有提供遠程訪問功能。
  2. 要求高可用性和可擴展性的場合。SQLite 簡單易用,但不可擴展。
  3. 數據量極大時。儘管 SQLite 數據庫大小的限制高達 281 TB,但所有數據都必須存儲在單個磁盤上。
  4. 寫入操作高併發時。SQLite 在任何時刻只允許一個寫入操作執行,其他寫入操作需要排隊。

SQLite3 命令操作

SQLite 提供了 sqlite3(在windows 爲 sqlite3.exe)命令行工具,通過該工具可以執行 SQLite 數據庫操作和 SQL 語句。

直接在命令提示符下執行 ./sqlite3 啓動 sqlite3 程序,然後可以通過輸入 .help 查看幫助指南,或者輸入 .help 關鍵詞 獲取特定關鍵詞的幫助信息。

部分命令列表如下:

sqlite> .help
.databases               List names and files of attached databases
.dbconfig ?op? ?val?     List or change sqlite3_db_config() options
.dbinfo ?DB?             Show status information about the database
.excel                   Display the output of next command in spreadsheet
.exit ?CODE?             Exit this program with return-code CODE
.expert                  EXPERIMENTAL. Suggest indexes for queries
.explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto
.help ?-all? ?PATTERN?   Show help text for PATTERN
.hex-rekey OLD NEW NEW   Change the encryption key using hexadecimal
.indexes ?TABLE?         Show names of indexes
.mode MODE ?OPTIONS?     Set output mode
.open ?OPTIONS? ?FILE?   Close existing database and reopen FILE
.output ?FILE?           Send output to FILE or stdout if FILE is omitted
.quit                    Exit this program
.read FILE               Read input from FILE or command output
.schema ?PATTERN?        Show the CREATE statements matching PATTERN
.show                    Show the current values for various settings
.tables ?TABLE?          List names of tables matching LIKE pattern TABLE
.......

sqlite3 只是讀取輸入行信息,然後傳遞給 SQLite 庫來執行,SQL 語句都要以分號 ; 結尾纔會開始執行,因此你可以自由的分行輸入。

在 sqlite3 中,SQL 語句需以分號 ; 結尾纔會執行,允許跨行輸入。特殊的點命令(如 .help.tables)以小數點 . 開頭,不需要分號

SQLite 新建數據庫

直接執行 sqlite3 filename 打開或創建一個 SQLite 數據庫。如果文件不存在,SQLite 會自動創建它。

示例:打開或創建名爲 my_sqlite.db 的 SQLite 數據庫文件。

$ sqlite3 my_sqlite.db
SQLite version 3.39.5 2022-10-14 20:58:05
Enter ".help" for usage hints.
sqlite>

也可以首先創建一個空白文件,然後使用 sqlite3 命令打開它。接下來使用 CREATE TABLE 命令創建一個名爲 user 的表,用 .tables 命令查看現有表格,使用 .exit 退出 sqlite3 工具。

$ touch test.db
$ sqlite3 test.db
SQLite version 3.39.5 2022-10-14 20:58:05
Enter ".help" for usage hints.
sqlite> create table user(name text,age int);
sqlite> .tables
user
sqlite>

SQLite 查看當前數據庫

使用點命令 .databases 查看當前打開的數據庫。

sqlite> .databases
main: /Users/darcy/develop/sqlite-tools-osx-x86-3420000/my_sqlite.db r/w
sqlite>

SQLite 增刪改查

SQLite 幾乎完全兼容常見的 SQL 語句規範,因此可以直接編寫和執行標準的 SQL 語句。

創建表:

sqlite> create table user(name text,age int);
sqlite>

插入數據:

sqlite> insert into user values('aLang',20);
sqlite> insert into user values('Darcy',30);
sqlite> insert into user values('XiaoMing',40);

查詢數據:

sqlite> select * from user;
aLang|20
Darcy|30
XiaoMing|40

添加索引,爲 user 表的 name 創建名爲 user_name 的索引:

sqlite> create index user_name on user(name);

SQLite 更改輸出格式

在查詢數據時,SQLite 默認使用 | 分割每列數據,這可能不便於閱讀。實際上,sqlite3 工具支持多種輸出格式,默認爲 list 模式。

以下是可用的輸出格式:ascii、box、csv、column、html、insert、json、line、list、markdown、quote、table

可以使用 .mode 命令更改輸出格式。

Box 格式:

sqlite> .mode box
sqlite> select * from user;
┌──────────┬─────┐
│   name   │ age │
├──────────┼─────┤
│ aLang    │ 20  │
│ Darcy    │ 30  │
│ XiaoMing │ 40  │
└──────────┴─────┘

json 格式:

sqlite> .mode json
sqlite> select * from user;
[{"name":"aLang","age":20},
{"name":"Darcy","age":30},
{"name":"XiaoMing","age":40}]

column 格式:

sqlite> .mode column
sqlite> select * from user;
name      age
--------  ---
aLang     20
Darcy     30
XiaoMing  40

table 格式:

sqlite> .mode table
sqlite> select * from user;
+----------+-----+
|   name   | age |
+----------+-----+
| aLang    | 20  |
| Darcy    | 30  |
| XiaoMing | 40  |
+----------+-----+
sqlite>

查詢 Schema

sqlite3 工具提供了幾個方便的命令,可用於查看數據庫的 schema ,這些命令純粹作爲快捷方式提供。

例如,.table 查看數據庫中的所有表:

sqlite> .table
user

點命令 .table 相當於下面的查詢語句。

sqlite> SELECT name FROM sqlite_schema
   ...> WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
   ...> ;
user

sqlite_master 是 SQLite 中的一個特殊表,其中包含了數據庫的 schema 信息。你可以查詢這個表以獲取表的創建語句和索引信息。

sqlite> .mode table
sqlite> select * from sqlite_schema;
+-------+-----------+----------+----------+--------------------------------------+
| type  |   name    | tbl_name | rootpage |                 sql                  |
+-------+-----------+----------+----------+--------------------------------------+
| table | user      | user     | 2        | CREATE TABLE user(name text,age int) |
| index | user_name | user     | 3        | CREATE INDEX user_name on user(name) |
+-------+-----------+----------+----------+--------------------------------------+

使用 .indexes 查看索引,使用 .schema 查看 schema 詳情。

sqlite> .indexes
user_name

sqlite> .schema
CREATE TABLE user(name text,age int);
CREATE INDEX user_name on user(name);

結果寫出到文件

使用 .output filename 命令將查詢結果寫入指定文件。

下面是一個示例,先使用 .mode json 更改輸出爲 JSON 格式,然後在查詢表寫出到 sql_result.json

sqlite> .output sql_result.json
sqlite> .mode json
sqlite> select * from user;
sqlite> .exit

$ cat sql_result.json
[{"name":"aLang","age":20},
{"name":"Darcy","age":30},
{"name":"XiaoMing","age":40}]

**寫出並打開 EXCEL **

使用 .excel 會讓下一個查詢語句輸出到 Excel 中。

sqlite> .excel
sqlite> select * from sqlite_schema;

結果寫出到文件

sqlite> .output sql_result.txt
sqlite> select * from sqlite_schema;
sqlite> select * from user;

讀取運行 SQL 腳本

使用 .read 可以讀取指定文件中的 SQL 語句並運行,這在需要批量執行 SQL 腳本的場景中非常有用。

創建SQL文件:

$ echo "select * from user" > sql_query.sql
$ cat sql_query.sql
select * from user

$ ./sqlite3 my_sqlite.db
SQLite version 3.42.0 2023-05-16 12:36:15
Enter ".help" for usage hints.

sqlite> .mode table
sqlite> .read sql_query.sql
+----------+-----+
|   name   | age |
+----------+-----+
| aLang    | 20  |
| Darcy    | 30  |
| XiaoMing | 40  |
+----------+-----+
sqlite>

SQLite 備份與恢復

在涉及數據庫操作時,備份和恢復是至關重要的步驟,它們用於防止數據丟失並確保數據的持續性。SQLite 提供了簡單的方法來備份和恢復你的數據庫。

在 SQLite 中可以通過導出整個數據庫爲一個 SQL 腳本來備份數據庫。此功能使用 .dump 命令實現。

$ ./sqlite3 my_sqlite.db
SQLite version 3.42.0 2023-05-16 12:36:15
Enter ".help" for usage hints.
sqlite> .output backup.sql
sqlite> .dump
sqlite> .exit

$ cat backup.sql
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE user(name text,age int);
INSERT INTO user VALUES('aLang',20);
INSERT INTO user VALUES('Darcy',30);
INSERT INTO user VALUES('XiaoMing',40);
CREATE INDEX user_name on user(name);
COMMIT;

這將導出整個 my_sqlite.db 數據庫到 backup.sql 文件中。此 SQL 文件包含了重建數據庫所需的所有 SQL 語句。要恢復數據庫,只需在 sqlite3 中運行這個腳本。

示例:恢復數據到庫 my_sqlite_2 中。

$ ./sqlite3 my_sqlite_2.db
SQLite version 3.42.0 2023-05-16 12:36:15
Enter ".help" for usage hints.
sqlite> .read backup.sql
sqlite> select * from user;
aLang|20
Darcy|30
XiaoMing|40

這將執行 backup.sql 文件中的所有 SQL 語句,重建數據庫。通過以上的備份與恢復方法,你可以確保你的 SQLite 數據庫資料得到可靠的保護,且在需要時能夠迅速恢復。

SQLite 可視化工具

命令行操作總歸不太直觀,如果你喜歡可視化操作,可以下載 SQLite Database Browser 進行操作。

下載頁面:https://sqlitebrowser.org/dl/

附錄

SQLite 常用函數列表,見名知意不寫註釋了。

Function 1 Function 2 Function 3 Function 4
abs(X) changes() char(X1,X2,...,XN) coalesce(X,Y,...)
concat(X,...) concat_ws(SEP,X,...) format(FORMAT,...) glob(X,Y)
hex(X) ifnull(X,Y) iif(X,Y,Z) instr(X,Y)
last_insert_rowid() length(X) like(X,Y) like(X,Y,Z)
likelihood(X,Y) likely(X) load_extension(X) load_extension(X,Y)
lower(X) ltrim(X) ltrim(X,Y) max(X,Y,...)
min(X,Y,...) nullif(X,Y) octet_length(X) printf(FORMAT,...)
quote(X) random() randomblob(N) replace(X,Y,Z)
round(X) round(X,Y) rtrim(X) rtrim(X,Y)
sign(X) soundex(X) sqlite_compileoption_get(N) sqlite_compileoption_used(X)
sqlite_offset(X) sqlite_source_id() sqlite_version() substr(X,Y)
substr(X,Y,Z) substring(X,Y) substring(X,Y,Z) total_changes()
trim(X) trim(X,Y)

參考

  1. SQLite 開源代碼:https://www.sqlite.org/cgi/src/dir?ci=trunk
  2. SQLite 文件格式介紹:https://sqlite.org/fileformat2.html
  3. SQLite 可視化工具:https://sqlitebrowser.org/dl/
  4. SQL 函數文檔:https://www.sqlite.org/lang_corefunc.html

一如既往,文章中代碼存放在 Github.com/niumoo/javaNotes.

本文 Github.com/niumoo/JavaNotes倉庫已經收錄。
本文原發於網站:SQLite 入門教程
本文原發於公衆號:SQLite 入門教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章