# SQLite 简介

> 原文： [http://zetcode.com/db/sqlite/introduction/](http://zetcode.com/db/sqlite/introduction/)

这是 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 的大多数 SQL-92 标准。 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。

```sql
$ sudo apt-get install libreadline-dev

```

要在 sqlite 命令行工具中启用命令历史记录，我们需要安装`readline`开发库。

```sql
$ wget https://www.sqlite.org/2017/sqlite-autoconf-3160200.tar.gz

```

从 SQLite 下载页面，我们可以获得最新资源。 这些是 SQLite 版本 3.16.2 的来源。

```sql
$ tar -xzvf sqlite-autoconf-3160200.tar.gz

```

我们解压缩压缩文件。

```sql
$ cd sqlite-autoconf-3160200/

```

我们转到`sqlite-autoconf-3160200`目录。

```sql
$ ./configure

```

我们运行`configure`脚本。 它告诉我们是否已经准备好构建 SQLite 的所有内容。

```sql
$ make

```

使用`make`，我们构建 SQLite。

```sql
$ sudo make install

```

使用`sudo make install`，我们在系统上安装了 SQLite。

```sql
$ which sqlite3
/usr/local/bin/sqlite3

```

默认情况下，SQLite 命令行工具安装在`/usr/local/bin`目录中。

```sql
$ 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 语句。

```sql
sqlite> .read cars.sql

```

在这里，我们执行`cars.sql`文件中的 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`表。

`orders.sql`

```sql
-- 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`表。

`friends.sql`

```sql
-- 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`表。

`customers_reservations.sql`

```sql
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`表。

`authors_books.sql`

```sql
-- 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 的[文档](http://sqlite.org/docs.html)用于创建本教程。

本章是对 SQLite 数据库的介绍。