1. SQLite 简介
	1.1 公有领域
	1.2 ACID
2. SQLite 特性
	2.1 SQLite 重点特性
	2.2 一些添加特性的版本
3. SQLite 教程
	3.1 教程链接
	3.2 SQLite 命令; 语法; 数据类型; 常用函数
	3.3 SQLite 局限性
4. SQLite 工具
5. DB Browser for SQLite

1. SQLite 简介

https://www.sqlite.org
https://zh.wikipedia.org/wiki/SQLite
https://wiki.archlinux.org/title/SQLite
SQLite(/ˌɛskjuːɛlˈlaɪt/或/ˈsiːkwəl.laɪt/)是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中。与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中(嵌入式699KB)。
SQLite 通常遵循PostgreSQL语法。SQLite 使用不保证域完整性的动态弱类型SQL语法。
SQLite将PostgreSQL作为参考平台。项目将“PostgreSQL可能做些什么”作为SQL标准实现的开发参考。
然而与这个目标最重要的偏差在于,除了主键以外,SQLite不强制进行类型检查。一个值的类型是动态的,不被schema所强制限制(虽然如此,但如果可以进行可恢复的类型转换时,schema会在存储数据时触发一个自动转换)。SQLite 努力遵循Postel 的规则。
SQLite是D. Richard Hipp 于2000年创建的公有领域项目。
文件扩展名通常会用: .sqlite3; .sqlite; .db; .db3

1.1 公有领域

https://en.wikipedia.org/wiki/Public_domain
https://zh.wikipedia.org/wiki/公有领域
(英文:Public Domain)是在现代知识产权法体系下,一种由不适于私人所有权的知识财产要素组成的真正的公地[1],或是不适合于知识产权保护的思想和作品的总体。是人类的一部分作品、知识总汇,可以包括文章、艺术品、音乐、科学理论、发明等。
对于领域内的知识财产,任何个人或团体都不具所有权益(所有权益通常由著作权或专利体现)。这些知识发明属于公有文化遗产,任何人可以不受限制地使用和加工它们(此处不考虑有关安全、出口等的法律)。

1.2 ACID

是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性: 

  • Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
  • Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
  • Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

2. SQLite 特性

2.1 SQLite 重点特性

https://www.sqlite.org/quirks.html
全部特性请查阅上面链接, 以下是一些主要的特点: 

  • 程序库实现了多数的SQL-92标准,包括事务,以及遵循ACID,但它缺失了某些特性。例如,它仅部分支持触发器,不能写入视图(但是,它提供了提供此功能的 INSTEAD OF 触发器)。尽管它支持大多数的复杂查询,但它的ALTER TABLE功能有所限制,不能修改或删除列,只能通过重新创建表的方式迂回进行。这在 3.25.0 版中发生了变化,支持 ALTER TABLE RENAME COLUMN 和 3.35.0 版中的 ALTER TABLE DROP COLUMN。
  • SQLite不进行类型检查。SQLite为 SQL 兼容的 DBMS使用了一个不寻常的类型系统:不是像大多数 SQL 数据库系统那样为列分配类型,而是将类型分配给单独的值;在语言方面,它是动态类型的。此外,它以与Perl相同的某些方式弱类型化:可以将字符串插入整数column (尽管 SQLite 会首先尝试将字符串转换为整数,如果该列的首选类型是整数)。这增加了列的灵活性,尤其是在绑定到动态类型的脚本语言时。但是,该技术不可移植到其他 SQL 产品。一个普遍的批评是 SQLite 的类型系统缺乏其他产品中静态类型列提供的数据完整性机制。SQLite 网站描述了“严格关联”模式,但尚未添加此功能。然而,它可以通过约束来实现CHECK(typeof(x)='integer')。
  • 表通常包含一个隐藏的rowid索引列,它提供了更快的访问。如果数据库包含一个整数主键列,SQLite 通常会将其视为rowid的别名来优化它,导致内容存储为严格类型的64 位有符号 整数,并将其行为更改为有点像一个自动递增的列。未来版本的 SQLite 可能包含一个命令,用于检查列是否具有类似rowid 的行为,以将这些列与弱类型、非自动递增的整数主键区分开来。
  • 具有完整Unicode功能的SQLite是可选的。
  • 多个进程或线程可以同时访问同一个数据而没有问题。可以同时平行读取同一个数据库。但同一时间只能有一个进程或线程进行数据写入;否则会写入失败并得到一个错误消息(或者会自动重试一段时间;自动重试的逻辑以及重试时间的长短是可以设置的)。
  • 程序设计者还提供了一个叫做sqlite3的独立程序用来查询和管理SQLite数据库文件。SQLite的用户可以把这个程序当作如何写SQLite应用程序的示例。

2.2 一些添加特性的版本

  • 3.7 版本中并发访问打开预写日志记录(WAL)时,限制会放宽,从而启用并发读取和写入。
  • 3.6.19 版本中增加了对外键约束的支持。2009年.
  • 3.7.4 版本中首先添加了 FTS4(全文搜索)模块,该模块对旧的 FTS3 模块进行了增强。FTS4 允许用户对文档进行全文搜索,类似于搜索引擎搜索网页的方式。
  • 3.8.2 版本中添加了对创建没有rowid 的表的支持,这可能会提供空间和性能改进。
  • 3.8.3 版本中添加了公共表表达式支持。
  • 3.9 版, 通过json1 扩展和新的子类型接口, 引入了JSON内容管理。2015年.
  • 3.33.0版, 支持的最大数据库大小为 281 TB。
  • 3.35.5版,目前最新版, 2021-4-19

https://www.sqlite.org/src/timeline?n=100&y=ci
https://www.sqlite.org/chronology.html

开发和发行 Development and distribution

  • SQLite 的代码由Fossil托管,Fossil是一个分布式版本控制系统,它本身建立在 SQLite 数据库之上。
  • SQLite 的发行版中提供了一个独立的命令行程序。它可用于创建数据库、定义表、插入和更改行、运行查询和管理 SQLite 数据库文件。它还可以作为编写使用 SQLite 库的应用程序的示例。
  • SQLite 在每次发布之前使用自动回归测试。作为发布验证的一部分,运行了超过 200 万次测试。从 2009 年 8 月 10 日发布的 SQLite 3.6.17 开始,SQLite 版本具有 100% 的分支测试覆盖率,这是代码覆盖率的组成部分之一。测试和测试工具部分是公共领域的,部分是专有的。

3. SQLite 教程

3.1 教程链接

https://www.sqlite.org/quickstart.html
https://www.tutlane.com/tutorial/sqlite
https://www.sqlitetutorial.net/
https://www.runoob.com/sqlite/sqlite-intro.html

3.2 SQLite 命令; 语法; 数据类型; 常用函数

https://www.runoob.com/sqlite/sqlite-commands.html
https://www.runoob.com/sqlite/sqlite-syntax.html
https://www.runoob.com/sqlite/sqlite-data-types.html
https://www.runoob.com/sqlite/sqlite-functions.html

类型 命令 描述
DDL
数据定义
CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。
ALTER 修改数据库中的某个已有的数据库对象,比如一个表。
DROP 删除整个表,或者表的视图,或者数据库中的其他对象。
DML
数据操作
INSERT 创建一条记录。
UPDATE 修改记录。
DELETE 删除记录。
DQL查询 SELECT 从一个或多个表中检索某些记录。

3.3 SQLite 局限性

在 SQLite 中,
SQL92 不支持的特性
以下内容大概基于: SQLite version 3.7.15.2 2013-01-09
来自: https://www.runoob.com/sqlite/sqlite-intro.html
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 在 SQLite 中,视图是只读的。不可以在视图上执行 DELETE、INSERT 或 UPDATE 语句。
GRANT 和 REVOKE 可以应用的唯一的访问权限是底层操作系统的正常文件访问权限。

4. SQLite 工具

$ sudo pacman -Ss sqlite
core/sqlite 3.35.5-1 [installed]
A C library that implements an SQL database engine
core/sqlite-analyzer 3.35.5-1 [installed]
An analysis program for sqlite3 database files
core/sqlite-doc 3.35.5-1 [installed]
most of the static HTML files that comprise this website, including all of the SQL Syntax and
the C/C++ interface specs and other miscellaneous documentation
community/sqlitebrowser 3.12.1-1 [installed]
SQLite Database browser is a light GUI editor for SQLite databases, built on top of Qt

$ sudo pacman -Fl sqlite |grep bin
sqlite usr/bin/showdb
sqlite usr/bin/showjournal
sqlite usr/bin/showstat4
sqlite usr/bin/showwal
sqlite usr/bin/sqldiff
sqlite usr/bin/sqlite3

  • sqlite3, 命令行 Shell → 该界面可用于创建、修改和查询任意 SQLite 数据库文件。https://www.sqlite.org/cli.html
  • sqlite3_analyzer, 数据库分析器 → 这个独立程序读取 SQLite 数据库并输出一个文件,显示每个表和索引使用的空间以及其他统计信息。使用 [dbstat 虚拟表] 构建。
  • sqldiff, 数据库差异 → 这个独立程序比较两个 SQLite 数据库文件并输出将一个转换为另一个所需的 SQL。

5. DB Browser for SQLite

https://sqlitebrowser.org/
https://github.com/sqlitebrowser/sqlitebrowser
DB Browser for SQLite (DB4S) 是一种高质量、可视化、开源的工具,用于创建、设计和编辑与 SQLite 兼容的数据库文件。
DB4S 适用于想要创建、搜索和编辑数据库的用户和开发人员。DB4S 使用熟悉的类似电子表格的界面,无需学习复杂的 SQL 命令。
用户可以使用控件和向导:

  • 创建和压缩数据库文件
  • 创建、定义、修改和删除表
  • 创建、定义和删除索引
  • 浏览、编辑、添加和删除记录
  • 搜索记录
  • 以文本形式导入和导出记录
  • 从/到 CSV 文件导入和导出表
  • 从 SQL 转储文件导入和导出数据库
  • 发出 SQL 查询并检查结果
  • 检查应用程序发出的所有 SQL 命令的日志
  • 根据表或查询数据绘制简单图形