SQLite数据库入门
2012-05-18 15:23:55 阿炯

1. 介绍

SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎,其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,其安装和运行非常简单,在大多数情况下 - 只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。

在SQLite中的SQL92不支持的特性如下:
特性描述
RIGHT OUTER JOIN只实现了 LEFT OUTER JOIN。
FULL OUTER JOIN只实现了 LEFT OUTER JOIN。
ALTER TABLE支持 RENAME TABLE 和 ALTER TABLE 的 ADD COLUMN variants 命令,不支持 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT。
Trigger 支持支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器。
VIEWs视图是只读的,不可以在视图上执行 DELETE、INSERT 或 UPDATE 语句。
GRANT 和 REVOKE可以应用的唯一的访问权限是底层操作系统的正常文件访问权限。

2. 安装

SQLite on Windows
1. 进入 SQL 下载页面:http://www.sqlite.org/download.html
2. 下载 Windows 下的预编译二进制文件包:
 * sqlite-shell-win32-x86-<build#>.zip
 * sqlite-dll-win32-x86-<build#>.zip
3. 注意: <build#> 是 sqlite 的编译版本号 将 zip 文件解压到你的磁盘,并将解压后的目录添加到系统的 PATH 变量中,以方便在命令行中执行 sqlite 命令。
4. 可选: 如果你计划发布基于 sqlite 数据库的应用程序,你还需要下载源码以便编译和利用其 API
* sqlite-amalgamation-<build#>.zip

SQLite on Linux
在多个 Linux 发行版提供了方便的命令来获取 SQLite:
/* For Debian /*
$ sudo apt-get install sqlite3 sqlite3-dev

/* For RedHats/*
$ yum install SQLite3 sqlite3-dev

3. 创建首个 SQLite 数据库

现在你已经安装了 SQLite 数据库,接下来我们创建首个数据库。在命令行窗口中输入如下命令来创建一个名为  test.db 的数据库。
sqlite3 test.db

创建表:
sqlite> create table mytable(id integer primary key, value text);
2 columns were created.

该表包含一个名为 id 的主键字段和一个名为 value 的文本字段。

注意: 最少必须为新建的数据库创建一个表或者视图,这么才能将数据库保存到磁盘中,否则数据库不会被创建。

接下来往表里中写入一些数据:
sqlite> insert into mytable(id, value) values(1, 'Micheal');
sqlite> insert into mytable(id, value) values(2, 'Jenny');
sqlite> insert into mytable(value) values('Francis');
sqlite> insert into mytable(value) values('Kerk');

查询数据:
sqlite> select * from test;
1|Micheal
2|Jenny
3|Francis
4|Kerk

设置格式化查询结果:
sqlite> .mode column;
sqlite> .header on;
sqlite> select * from test;
id          value
----------- -------------
1           Micheal
2           Jenny
3           Francis
4           Kerk

.mode column 将设置为列显示模式,.header 将显示列名。

修改表结构,增加列:
sqlite> alter table mytable add column email text not null '' collate nocase;;

创建视图:
sqlite> create view nameview as select * from mytable;

创建索引:
sqlite> create index test_idx on mytable(value);

4. 一些有用的 SQLite 命令

显示表结构:
sqlite> .schema [table]
获取所有表和视图:
sqlite > .tables

获取指定表的索引列表:
sqlite > .indices [table ]

导出数据库到 SQL 文件:
sqlite > .output [filename ]
sqlite > .dump
sqlite > .output stdout

从 SQL 文件导入数据库:
sqlite > .read [filename ]

格式化输出数据到 CSV 格式:
sqlite >.output [filename.csv ]
sqlite >.separator ,
sqlite > select * from test;
sqlite >.output stdout

从 CSV 文件导入数据到表中:
sqlite >create table newtable ( id integer primary key, value text );
sqlite >.import [filename.csv ] newtable

备份数据库:
/* usage: sqlite3 [database] .dump > [filename] */
sqlite3 mytable.db .dump > backup.sql

恢复数据库:
/* usage: sqlite3 [database ] < [filename ] */
sqlite3 mytable.db < backup.sql

5. 常用命令盘点

注意:所有的命令开头都是一个点。确保 sqlite> 提示符与点命令之间没有空格,否则将无法正常工作。

进入命令行环境:sqlite3
打开一个控制台窗口,输入 sqlite3 回车,这时你就进入了 SQLite 命令行环境,其显示了版本号,并告诉你每一条 SQL 语句必须用分号(;)来结尾。

命令行帮助:.help
在命令行环境下输入 .help 回车,显示所有可使用的命令以及这些命令的帮助。

退出命令行环境
.quit 或者 .exit  都可以退出。

sqlite3命令的基本语法如下:
sqlite3 testDB.db

通常情况下,数据库名称在 RDBMS 内应该是唯一的。上面的命令将在当前目录下创建一个文件 testDB.db,该文件将被 SQLite 引擎用作数据库。命令在成功创建数据库文件之后将提供一个 sqlite> 提示符。另外也可以使用 .open 来建立新的数据库文件:
sqlite>.open test.db

上面的命令创建了数据库文件 test.db,位于 sqlite3 命令同一目录下。打开已存在数据库也是用 .open 命令,以上命令如果 test.db 存在则直接会打开,不存在就创建它。

一旦数据库被创建,就可以使用 SQLite 的 .databases 命令来检查它是否在数据库列表中。

导入数据:.read    数据文件
打开记事本,并将下列 SQL 语句复制到记事本中,保存为 freeoa.sql 到目录下,在命令行环境中输入
.read   freeoa.sql

即将所有的数据导入到 freeoa.db 数据库中。

列出所有的数据表:.tables
显示数据库结构:.schema
显示表的结构:.schema    表名
显示语句执行时间:.timer on

导出某个表的数据:.dump    表名
整个表以 SQL 语句的形式为导出来了,但是只是显示在终端上,如何把它导出到文件中可见如下。

设置导出目标:
.output 文件名
或者
.output stdout

先运行.output cars.sql ,然后再运行.dump 命令试试看?如果要回复成导出到终端(标准输出),则运行 .output stdout。

数据显示相关命令

设置分隔符:.separator 分隔符
可以首先运行 SELECT * FROM Names,可以看到默认的分隔符是 |
运行.separator : 以后,再执行上述语句,可以看到分隔符已经变成 : 了。

设置显示模式:.mode 模式
有好几种显示模式,默认的是 list 显示模式,一般使用 column 显示模式,还有其他几种显示模式可以 .help 看 mode 相关内容。

显示标题栏:.headers    on

设置每一列的显示宽度:.width    w1,w2,w3...
一些内容,默认的宽度显示不下,这个命令就有用了

设置 NULL 值显示成什么样子(默认情况下NULL值什么也不显示):.nullvalue    想要的NULL值格式

列出当前显示格式设置情况:.show

配置文件 .sqliterc

如果每次进入命令行都要重新设置显示格式,很麻烦,其实 .show 命令列出的所有设置项都可以保存到一个 .sqliterc 文件中,这样每次进入命令行就自动设置好了。该文件在 Linux 下保存在用户的 Home 目录下,在 Windows 下可以保存到任何目录下,但是需要设置环境变量让数据库引擎能找到它。

sqlite_master 表格

主表中保存数据库表的关键信息,并把它命名为 sqlite_master。
sqlite>.schema sqlite_master

CREATE TABLE sqlite_master (
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);

SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。SQL 注释以两个连续的 "-" 字符(ASCII 0x2d)开始,并扩展至下一个换行符(ASCII 0x0a)或直到输入结束,以先到者为准,但不能嵌套。所有的 SQLite 语句可以以任何关键字开始,如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP 等,所有的语句以分号 ; 结束。

命令描述
.backup ?DB? FILE备份 DB 数据库(默认是 "main")到 FILE 文件。
.bail ON|OFF发生错误后停止。默认为 OFF。
.databases列出数据库的名称及其所依附的文件。
.dump ?TABLE?以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。
.echo ON|OFF开启或关闭 echo 命令。
.exit退出 SQLite 提示符。
.explain ON|OFF开启或关闭适合于 EXPLAIN 的输出模式。如果没有带参数,则为 EXPLAIN on,即开启 EXPLAIN。
.header(s) ON|OFF开启或关闭头部显示。
.help显示消息。
.import FILE TABLE导入来自 FILE 文件的数据到 TABLE 表中。
.indices ?TABLE?显示所有索引的名称。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表的索引。
.load FILE ?ENTRY?加载一个扩展库。
.log FILE|off开启或关闭日志。FILE 文件可以是 stderr(标准错误)/stdout(标准输出)。
.mode MODE设置输出模式,MODE 可以是下列之一:
  • csv 逗号分隔的值

  • column 左对齐的列

  • html HTML 的 <table> 代码

  • insert TABLE 表的 SQL 插入(insert)语句

  • line 每行一个值

  • list 由 .separator 字符串分隔的值

  • tabs 由 Tab 分隔的值

  • 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|OFF开启或关闭统计。
.tables ?PATTERN?列出匹配 LIKE 模式的表的名称。
.timeout MS尝试打开锁定的表 MS 毫秒。
.width NUM NUM为 "column" 模式设置列宽度。
.timer ON|OFF开启或关闭 CPU 定时器。

在 sqlite3 中,SQL 语句需以分号 ; 结尾才会执行,允许跨行输入。特殊的点命令(如 .help 和 .tables)以小数点 . 开头,不需要分号。

在查询数据时,SQLite 默认使用 | 分割每列数据,这可能不便于阅读。实际上,sqlite3 工具支持多种输出格式,默认为 list 模式。以下是可用的输出格式:ascii、box、csv、column、html、insert、json、line、list、markdown、quote、table。

可以使用 .mode 命令更改输出格式:
> .mode xxx

sqlite_master 是 SQLite 中的一个特殊表,其中包含了数据库的 schema 信息。可以查询这个表以获取表的创建语句和索引信息。使用 .indexes 查看索引,使用 .schema 查看 schema 详情。

使用 .output filename 命令将查询结果写入指定文件。可先使用 .mode json 更改输出为 JSON 格式,然后在查询表写出到 sql_result.json 文件中。

使用 .excel 会让下一个查询语句输出到 Excel 中。
> .excel
> select * from sqlite_schema;

使用 .read 可以读取指定文件中的 SQL 语句并运行,这在需要批量执行 SQL 脚本的场景中非常有用。

备份与恢复

在涉及数据库操作时,备份和恢复是至关重要的步骤,可用于防止数据丢失并确保数据的持续性;SQLite 提供了简单的方法来备份和恢复数据库。在 SQLite 中可以通过导出整个数据库为一个 SQL 脚本来备份数据库。此功能使用 .dump 命令实现。

$ ./sqlite3 my_sqlite.db
sqlite> .output backup.sql
sqlite> .dump
sqlite> .exit

$ cat backup.sql
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
...SQLS...
COMMIT;

这将导出整个 my_sqlite.db 数据库到 backup.sql 文件中。此 SQL 文件包含了重建数据库所需的所有 SQL 语句。要恢复数据库,只需在 sqlite3 中运行这个脚本。如恢复数据到库 my_sqlite_2 中。

$ ./sqlite3 my_sqlite_2.db
sqlite> .read backup.sql
sqlite> select * from user;
...

这将执行 backup.sql 文件中的所有 SQL 语句,重建数据库。通过以上的备份与恢复方法,可以确保你的 SQLite 数据库资料得到可靠的保护,且在需要时能够迅速恢复。

如果喜欢可视化操作,可以尝试 SQLite Database Browser 进行操作或使用DBeaver工具。


何时应该使用SQLite

嵌入式应用程序:所有需要可移植性、不需要扩展的应用程序,例如单用户的本地应用、移动应用或者游戏。

替代磁盘访问:在很多情况下,需要直接读写磁盘文件的应用程序可以切换到SQLite从而受益于SQLite提供的额外功能以及使用结构化查询语言(SQL)所带来的简便性。

测试:对大部分应用程序而言没必要使用额外的进程测试业务逻辑(例如应用程序的主要目标:功能)。

何时不应该使用SQLite

多用户应用程序:如果有多个客户端需要访问并使用同一个数据库,那么最好使用功能完整的关系型数据库(例如PostgreSQL),而不是选择SQLite。

需要高写入量的应用程序:写操作是SQLite的一个局限。该DBMS在同一时刻仅允许一个写操作,因而也限制了其吞吐量。