_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。
$ 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 语句。
cars.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 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 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
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 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
表。