38.md 8.8 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10
# 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。

W
wizardforcel 已提交
11
SQLite 实现了 SQL 的大多数 SQL-92 标准。 SQLite 引擎不是独立的进程。 而是将其静态或动态链接到应用程序。 SQLite 库很小。 它可能需要少于 300 KiB。 SQLite 数据库是单个普通磁盘文件,可以位于目录层次结构中的任何位置。 这是一个跨平台文件。 它可以在 32 位和 64 位体系结构的各种操作系统上使用。 SQLite 是用 C 编程语言编写的。 它具有许多语言的绑定,包括 C ++,Java,C# ,Python,Perl,Ruby,Visual Basic 和 Tcl。 SQLite 的源代码在公共领域。
W
wizardforcel 已提交
12 13 14

## 定义

W
wizardforcel 已提交
15
关系数据库 是表中组织的数据的集合。 表之间存在关系。 这些表是正式描述的。 它们由行和列组成。 _SQL(结构化查询语言)是一种数据库计算机语言,旨在管理关系数据库管理系统中的数据。 表 是使用垂直列和水平行的模型组织的一组值。 列由其名称标识。 数据库系统的 模式 是用正式语言描述的结构。 它定义了表,字段,关系,视图,索引,过程,函数,队列,触发器和其他元素。 数据库 行 _ 代表表中的单个隐式结构化数据项。 它也称为元组或记录。
W
wizardforcel 已提交
16

W
wizardforcel 已提交
17
列 是一组特定简单类型的数据值,该数据值对应于表的每一行。 列提供了构成行所依据的结构。 字段 是单个项目,存在于一行和一列之间的交点处。 主键 唯一标识表中的每个记录。 外键 是两个表之间的引用约束。 外键标识一个(引用)表中的一列或一组列,该列或表引用另一(引用)表中的一列或一组列。 触发器 是响应于数据库中特定表上的某些事件而自动执行的过程代码。 视图 是对来自一个或多个表的数据的特定外观。 它可以按特定顺序排列数据,突出显示或隐藏某些数据。 视图由存储的查询组成,该查询可作为由查询结果集组成的虚拟表访问。 与普通表不同,视图不构成物理模式的一部分。 它是根据数据库中的数据计算或整理的动态虚拟表。
W
wizardforcel 已提交
18

W
wizardforcel 已提交
19
事务 是针对一个或多个数据库中数据的数据库操作的基本单位。 事务中所有 SQL 语句的影响可以全部提交给数据库,也可以全部回滚。 SQL 结果集 是 SELECT 语句返回的数据库中的一组行。 它还包含有关查询的元信息,例如列名以及每列的类型和大小。 索引 是一种数据结构,可提高对数据库表的数据检索操作的速度。
W
wizardforcel 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

## 从源代码安装 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 语句。

W
wizardforcel 已提交
105
`cars.sql`
W
wizardforcel 已提交
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

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

W
wizardforcel 已提交
128
`orders.sql`
W
wizardforcel 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

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

W
wizardforcel 已提交
155
`friends.sql`
W
wizardforcel 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177

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

W
wizardforcel 已提交
178
`customers_reservations.sql`
W
wizardforcel 已提交
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203

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

W
wizardforcel 已提交
204
`authors_books.sql`
W
wizardforcel 已提交
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232

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

W
wizardforcel 已提交
233
## 数据来源
W
wizardforcel 已提交
234 235 236 237

SQLite 的[文档](http://sqlite.org/docs.html)用于创建本教程。

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