SQLite 简介
最后修改于 2020 年 7 月 6 日
这是 SQLite 教程。它涵盖了 SQLite 数据库引擎、sqlite3 命令行工具以及数据库引擎涵盖的 SQL 语言。这是一个面向初学者的入门教程。它涵盖了 SQLite 3.16.2 版本。
SQLite 数据库
SQLite 是一个嵌入式关系数据库引擎。它的开发者称它为自包含、无服务器、零配置和事务性 SQL 数据库引擎。它非常流行,今天全球有数亿份副本在使用。SQLite 用于 Solaris 10 和 Mac OS 操作系统,以及 iPhone 和 Skype。Qt4 库内置了对 SQLite 的支持,以及 Python 和 PHP 语言。许多流行的应用程序在内部使用 SQLite,例如 Firefox、Google Chrome 或 Amarok。
SQLite 实现了 SQL-92 SQL 标准的大部分内容。SQLite 引擎不是一个独立的进程。相反,它被静态或动态地链接到应用程序中。SQLite 库很小。它可能只需要不到 300 KiB。一个 SQLite 数据库是一个普通的磁盘文件,可以位于目录层次结构的任何位置。它是一个跨平台文件。它可以在各种操作系统上使用,包括 32 位和 64 位架构。SQLite 用 C 编程语言编写。它有许多语言的绑定,包括 C++、Java、C#、Python、Perl、Ruby、Visual Basic 和 Tcl。SQLite 的源代码是公共领域的。
定义
一个关系数据库是组织在表中的数据集合。表之间存在关系。这些表被正式描述。它们由行和列组成。SQL(结构化查询语言)是一种数据库计算机语言,旨在用于管理关系数据库管理系统中的数据。一个表是一组使用垂直列和水平行模型组织的值。列由它们的名称标识。数据库系统的模式是用正式语言描述的其结构。它定义了表、字段、关系、视图、索引、过程、函数、队列、触发器和其他元素。数据库行表示表中单个、隐式结构化的数据项。它也被称为元组或记录。
一个列是特定简单类型的数据值的集合,每行一个。列提供了构成行的结构。一个字段是存在于一行和一列相交处的单个项目。一个主键唯一地标识表中的每条记录。一个外键是两个表之间的引用约束。外键标识一个(引用)表中的一个列或一组列,这些列引用另一个(被引用)表中的一个列或一组列。一个触发器是自动执行的程序代码,用于响应数据库中特定表上的某些事件。一个视图是来自一个或多个表的数据的特定外观。它可以按某种特定顺序排列数据,突出显示或隐藏某些数据。一个视图由一个存储的查询组成,该查询可作为由查询的结果集组成的虚拟表访问。与普通表不同,视图不构成物理模式的一部分。它是一个动态的虚拟表,从数据库中的数据计算或整理。
事务是针对一个或多个数据库中的数据执行的数据库操作的原子单元。事务中所有 SQL 语句的效果可以要么全部提交到数据库,要么全部回滚。SQL 结果集是从 SELECT 语句返回的数据库中的一组行。它还包含有关查询的元信息,例如列名以及每个列的类型和大小。一个索引是一种数据结构,可提高数据库表上数据检索操作的速度。
从源代码安装 SQLite
要获取最新版本的 SQLite,我们可以从源代码安装 SQLite。安装很简单,只需一会儿。以下说明在 Linux 上构建和安装 SQLite。
$ sudo apt-get install libreadline-dev
要在 sqlite 命令行工具中启用命令历史记录,我们需要安装 readline 开发库。
$ wget https://www.sqlite.org/2017/sqlite-autoconf-3160200.tar.gz
从 SQLite 下载页面,我们获取最新的源代码。这些是 SQLite 3.16.2 版本的源代码。
$ tar -xzvf sqlite-autoconf-3160200.tar.gz
我们解压缩压缩文件。
$ cd sqlite-autoconf-3160200/
我们进入 sqlite-autoconf-3160200 目录。
$ ./configure
我们运行 configure 脚本。它告诉我们是否已准备好构建 SQLite。
$ make
使用 make,我们构建 SQLite。
$ sudo make install
使用 sudo make install,我们在系统上安装 SQLite。
$ which sqlite3 /usr/local/bin/sqlite3
默认情况下,SQLite 命令行工具安装在 /usr/local/bin 目录中。
$ sqlite3 SQLite version 3.16.2 2017-01-06 16:32:41 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite>
/usr/local/bin 目录在 PATH 变量中,因此我们可以运行 sqlite3 而无需完整的路径。
使用的表
在这里,我们将列出本教程中使用的最重要的表。 sqlite3 工具的 .read 命令用于从文件中执行 SQL 语句。
sqlite> .read cars.sql
在这里,我们执行位于 cars.sql 文件中的 SQL 语句。
-- SQL for the Cars table BEGIN TRANSACTION; DROP TABLE IF EXISTS Cars; CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER); INSERT INTO Cars VALUES(1, 'Audi', 52642); INSERT INTO Cars VALUES(2, 'Mercedes', 57127); INSERT INTO Cars VALUES(3, 'Skoda', 9000); INSERT INTO Cars VALUES(4, 'Volvo', 29000); INSERT INTO Cars VALUES(5, 'Bentley', 350000); INSERT INTO Cars VALUES(6, 'Citroen', 21000); INSERT INTO Cars VALUES(7, 'Hummer', 41400); INSERT INTO Cars VALUES(8, 'Volkswagen', 21600); COMMIT;
这是 Cars 表。
-- SQL for the Orders table
BEGIN TRANSACTION;
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders(Id INTEGER PRIMARY KEY,
OrderPrice INTEGER CHECK(OrderPrice>0), Customer TEXT);
INSERT INTO Orders(OrderPrice, Customer) VALUES(1200, "Williamson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(200, "Robertson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(40, "Robertson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(1640, "Smith");
INSERT INTO Orders(OrderPrice, Customer) VALUES(100, "Robertson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(50, "Williamson");
INSERT INTO Orders(OrderPrice, Customer) VALUES(150, "Smith");
INSERT INTO Orders(OrderPrice, Customer) VALUES(250, "Smith");
INSERT INTO Orders(OrderPrice, Customer) VALUES(840, "Brown");
INSERT INTO Orders(OrderPrice, Customer) VALUES(440, "Black");
INSERT INTO Orders(OrderPrice, Customer) VALUES(20, "Brown");
COMMIT;
这是 Orders 表。
-- SQL for the Friends table
BEGIN TRANSACTION;
DROP TABLE IF EXISTS Friends;
CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT UNIQUE NOT NULL,
Sex TEXT CHECK(Sex IN ('M', 'F')));
INSERT INTO Friends VALUES(1, 'Jane', 'F');
INSERT INTO Friends VALUES(2, 'Thomas', 'M');
INSERT INTO Friends VALUES(3, 'Franklin', 'M');
INSERT INTO Friends VALUES(4, 'Elisabeth', 'F');
INSERT INTO Friends VALUES(5, 'Mary', 'F');
INSERT INTO Friends VALUES(6, 'Lucy', 'F');
INSERT INTO Friends VALUES(7, 'Jack', 'M');
COMMIT;
这是 Friends 表。
BEGIN TRANSACTION;
DROP TABLE IF EXISTS Reservations;
DROP TABLE IF EXISTS Customers;
CREATE TABLE IF NOT EXISTS Customers(CustomerId INTEGER PRIMARY KEY, Name TEXT);
INSERT INTO Customers(Name) VALUES('Paul Novak');
INSERT INTO Customers(Name) VALUES('Terry Neils');
INSERT INTO Customers(Name) VALUES('Jack Fonda');
INSERT INTO Customers(Name) VALUES('Tom Willis');
CREATE TABLE IF NOT EXISTS Reservations(Id INTEGER PRIMARY KEY,
CustomerId INTEGER, Day TEXT);
INSERT INTO Reservations(CustomerId, Day) VALUES(1, '2009-22-11');
INSERT INTO Reservations(CustomerId, Day) VALUES(2, '2009-28-11');
INSERT INTO Reservations(CustomerId, Day) VALUES(2, '2009-29-11');
INSERT INTO Reservations(CustomerId, Day) VALUES(1, '2009-29-11');
INSERT INTO Reservations(CustomerId, Day) VALUES(3, '2009-02-12');
COMMIT;
这些是 Customers 和 Reservations 表。
-- SQL for the Authors & Books tables
BEGIN TRANSACTION;
DROP TABLE IF EXISTS Books;
DROP TABLE IF EXISTS Authors;
CREATE TABLE Authors(AuthorId INTEGER PRIMARY KEY, Name TEXT);
INSERT INTO Authors VALUES(1, 'Jane Austen');
INSERT INTO Authors VALUES(2, 'Leo Tolstoy');
INSERT INTO Authors VALUES(3, 'Joseph Heller');
INSERT INTO Authors VALUES(4, 'Charles Dickens');
CREATE TABLE Books(BookId INTEGER PRIMARY KEY, Title TEXT, AuthorId INTEGER,
FOREIGN KEY(AuthorId) REFERENCES Authors(AuthorId));
INSERT INTO Books VALUES(1,'Emma',1);
INSERT INTO Books VALUES(2,'War and Peace',2);
INSERT INTO Books VALUES(3,'Catch XII',3);
INSERT INTO Books VALUES(4,'David Copperfield',4);
INSERT INTO Books VALUES(5,'Good as Gold',3);
INSERT INTO Books VALUES(6,'Anna Karenia',2);
COMMIT;
这些是 Authors 和 Books 表。
来源
SQLite 的 文档 用于创建本教程。
本章介绍了 SQLite 数据库。