SQLite 是一个进程内的软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,不需要在系统中配置。就像其它数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。最后说一下的是,SQLite 是在世界上最广泛部署的 SQL 数据库引擎,且其源代码不受版权限制。
为什么要用SQLite?理由如下:(1)不需要一个单独的服务器进程或操作的系统(无服务器的);(2)SQLite 不需要配置,这意味着不需要安装或管理;(3)一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件;(4)SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB;(5)SQLite 是自给自足的,这意味着不需要任何外部的依赖(6)SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问;(7)SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能;(8)SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API;(9)SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
为了使用SQLite数据库,首先需要安装SQLite,其下载链接为:https://www.sqlite.org/download.html
。如下为在Windows上安装SQLite的步骤:(1)进入上述的下载链接,从Windows 区下载预编译的二进制文件;(2)选择下载sqlite-tools-win32-*.zip
和sqlite-dll-win32-*.zip
这两个压缩文件;(3)在系统中选择一个安装目录,如D:\Software\sqlite
,将下载的两个压缩文件解压于此处,会得到sqlite3.def
、sqlite3.dll
和sqlite3.exe
这三个文件;(4)为了可以在命令行窗口
中使用sqlite3
命令,把SQLite的安装目录添加至PATH环境变量。如此,SQLite数据库安装完毕。
与关系数据库进行交互的标准SQLite命令
类似于SQL。命令包括CREATE
、ALTER
、SELECT
、INSERT
、UPDATE
、DELETE
和DROP
。这些命令基于它们的操作性质可分为三类:(1)数据定义语言(DDL),CREATE
:创建一个新的数据表,一个数据表的视图,或者数据库中的其它对象;ALTER
:修改数据库中的某个已有的数据库对象,比如一个数据表;DROP
:删除整个数据表,或者数据表的视图,或者数据库中的其它对象。(2)数据操作语言(DML),INSERT
:往数据表插入一条记录;UPDATE
:修改记录;DELETE
:删除记录。(3)数据查询语言(DQL),SELECT
:从一个或多个数据表中检索某些记录。
下面分别从创建数据库,附加数据库,分离数据库,创建数据表,删除数据表,数据添加,数据查询这七个方面对SQLite数据库的基本操作进行介绍。
SQLite使用sqlite3 命令
在当前目录创建新的数据库
。和其它数据库产品不同,SQLite不需要任何特殊的权限就可以创建一个数据库,即不需要用户名和密码
。而如果当前目录存在一个数据库,则也可用此命令进入这个数据库。
语法
使用sqlite3
命令创建数据库的基本语法如下:
>sqlite3 DatabaseName.db
通常情况下,数据库名称在 RDBMS 内应该是唯一的。
实例
创建一个新的SQLite数据库testDB.db
:
命令sqlite3 testDB.db
的作用是在当前目录D:\
下创建一个文件testDB.db。该文件将被SQLite引擎用作数据库。在成功创建数据库文件之后,命令行窗口中将出现一个sqlite>
提示符。一旦数据库被创建后,即可使用SQLite的.databases
命令来检查它是否在数据库列表中。最后,可以使用.quit
命令退出 sqlite 提示符。如下为在目录D:\
下创建的SQLite数据库。
.dump 命令
在命令行窗口中使用.dump 点命令
可以导出完整的数据库到一个文本文件中,如下所示:
>sqlite3 testDB.db .dump > testDB.sql
上面的命令将转换整个 testDB.db 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 testDB.sql 中。通过简单的方式可以从生成的 testDB.sql 恢复,如下所示:
>sqlite3 testDB.db < testDB.sql
此时的 testDB.db 数据库是空的,一旦数据库中有表和数据,可以再次尝试上述的两个程序。
假设这样一种情况,当在同一时间有多个数据库可用,你想使用其中的任何一个。SQLite 的 ATTACH DATABASE 语句是用来选择一个特定的数据库,使用该命令后,所有的 SQLite 语句将在附加的数据库下执行。
语法
SQLite 的 ATTACH DATABASE 语句的基本语法如下:
ATTACH DATABASE file_name AS database_name;
如果数据库尚未被创建,上面的命令将创建一个数据库,如果数据库已存在,则把数据库文件名称与逻辑数据库 ‘Alias-Name’ 绑定在一起。
实例
如果想附加一个现有的数据库 testDB.db,则 ATTACH DATABASE 语句将如下所示:
sqlite> ATTACH DATABASE 'testDB.db' as 'TEST';
使用 SQLite .databases 命令
来显示附加的数据库。
数据库名称 main 和 temp 被保留用于主数据库和存储临时表及其他临时数据对象的数据库。这两个数据库名称可用于每个数据库连接,且不应该被用于附加,否则将得到一个警告消息,如下所示:
sqlite> ATTACH DATABASE 'testDB.db' as 'TEMP';
Error: database TEMP is already in use
sqlite> ATTACH DATABASE 'testDB.db' as 'main';
Error: database main is already in use;
SQLite的 DETACH DTABASE 语句是用来把命名数据库从一个数据库连接分离和游离出来,连接是之前使用 ATTACH 语句附加的。如果同一个数据库文件已经被附加上多个别名,DETACH 命令将只断开给定名称的连接,而其余的仍然有效。您无法分离 main 或 temp 数据库。
如果数据库是在内存中或者是临时数据库,则该数据库将被摧毁,且内容将会丢失。
语法
SQLite 的 DETACH DATABASE ‘Alias-Name’ 语句的基本语法如下:
DETACH DATABASE 'Alias-Name';
在这里,‘Alias-Name’ 与您之前使用 ATTACH 语句附加数据库时所用到的别名相同。
实例
假设在前面的章节中您已经创建了一个数据库,并给它附加了 ‘test’ 和 ‘currentDB’,使用 .database 命令,我们可以看到:
sqlite>.databases
seq name file
--- --------------- ----------------------
0 main /home/sqlite/testDB.db
2 test /home/sqlite/testDB.db
3 currentDB /home/sqlite/testDB.db
现在,让我们尝试把 ‘currentDB’ 从 testDB.db 中分离出来,如下所示:
sqlite> DETACH DATABASE 'currentDB';
现在,如果检查当前附加的数据库,您会发现,testDB.db 仍与 ‘test’ 和 ‘main’ 保持连接。
sqlite>.databases
seq name file
--- --------------- ----------------------
0 main /home/sqlite/testDB.db
2 test /home/sqlite/testDB.db
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
语法
CREATE TABLE 语句的基本语法如下:
CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype,
);
CREATE TABLE 是告诉数据库系统创建一个新表的关键字。CREATE TABLE 语句后跟着表的唯一的名称或标识。您也可以选择指定带有 table_name 的 database_name。
实例
下面是一个实例,它创建了一个 COMPANY 表,ID 作为主键,NOT NULL 的约束表示在表中创建纪录时这些字段不能为 NULL:
sqlite> CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
让我们再创建一个表,我们将在随后章节的练习中使用:
sqlite> CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
您可以使用 SQLIte 命令中的 .tables 命令来验证表是否已成功创建,该命令用于列出附加数据库中的所有表。
sqlite>.tables
COMPANY DEPARTMENT
在这里,可以看到我们刚创建的两张表 COMPANY、 DEPARTMENT。
您可以使用 SQLite .schema 命令得到表的完整信息,如下所示:
sqlite>.schema COMPANY
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
SQLite 的 DROP TABLE 语句用来删除表定义及其所有相关数据、索引、触发器、约束和该表的权限规范。
使用此命令时要特别注意,因为一旦一个表被删除,表中所有信息也将永远丢失。
语法
DROP TABLE 语句的基本语法如下。您可以选择指定带有表名的数据库名称,如下所示:
DROP TABLE database_name.table_name;
实例
让我们先确认 COMPANY 表已经存在,然后我们将其从数据库中删除。
sqlite>.tables
COMPANY test.COMPANY
这意味着 COMPANY 表已存在数据库中,接下来让我们把它从数据库中删除,如下:
sqlite>DROP TABLE COMPANY;
sqlite>
现在,如果尝试 .TABLES 命令,那么将无法找到 COMPANY 表了:
sqlite>.tables
sqlite>
显示结果为空,意味着已经成功从数据库删除表。
SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行。
语法
INSERT INTO 语句有两种基本语法,如下所示:
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
在这里,column1, column2,…columnN 是要插入数据的表中的列的名称。
如果要为表中的所有列添加值,您也可以不需要在 SQLite 查询中指定列名称。但要确保值的顺序与列在表中的顺序一致。SQLite 的 INSERT INTO 语法如下:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
实例
假设您已经在 testDB.db 中创建了 COMPANY表,如下所示:
sqlite> CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
现在,下面的语句将在 COMPANY 表中创建六个记录:
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'David', 27, 'Texas', 85000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );
您也可以使用第二种语法在 COMPANY 表中创建一个记录,如下所示:
INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );
上面的所有语句将在 COMPANY 表中创建下列记录。下一章会教您如何从一个表中显示所有这些记录。
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
使用一个表来填充另一个表
您可以通过在一个有一组字段的表上使用 select 语句,填充数据到另一个表中。下面是语法:
INSERT INTO first_table_name [(column1, column2, ... columnN)]
SELECT column1, column2, ...columnN
FROM second_table_name
[WHERE condition];
SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。
语法
SQLite 的 SELECT 语句的基本语法如下:
SELECT column1, column2, columnN FROM table_name;
在这里,column1, column2…是表的字段,他们的值即是您要获取的。如果您想获取所有可用的字段,那么可以使用下面的语法:
SELECT * FROM table_name;
实例
假设 COMPANY 表有以下记录:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
下面是一个实例,使用 SELECT 语句获取并显示所有这些记录。在这里,前三个命令被用来设置正确格式化的输出。
sqlite>.header on
sqlite>.mode column
sqlite> SELECT * FROM COMPANY;
最后,将得到以下的结果:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
如果只想获取 COMPANY 表中指定的字段,则使用下面的查询:
sqlite> SELECT ID, NAME, SALARY FROM COMPANY;
上面的查询会产生以下结果:
ID NAME SALARY
---------- ---------- ----------
1 Paul 20000.0
2 Allen 15000.0
3 Teddy 20000.0
4 Mark 65000.0
5 David 85000.0
6 Kim 45000.0
7 James 10000.0
设置输出列的宽度
有时,由于要显示的列的默认宽度导致 .mode column,这种情况下,输出被截断。此时,您可以使用 .width num, num… 命令设置显示列的宽度,如下所示:
sqlite>.width 10, 20, 10
sqlite>SELECT * FROM COMPANY;
上面的 .width 命令设置第一列的宽度为 10,第二列的宽度为 20,第三列的宽度为 10。因此上述 SELECT 语句将得到以下结果:
ID NAME AGE ADDRESS SALARY
---------- -------------------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
Schema 信息
因为所有的点命令只在 SQLite 提示符中可用,所以当进行带有 SQLite 的编程时,您要使用下面的带有 sqlite_master 表的 SELECT 语句来列出所有在数据库中创建的表:
sqlite> SELECT tbl_name FROM sqlite_master WHERE type = 'table';
假设在 testDB.db 中已经存在唯一的 COMPANY 表,则将产生以下结果:
tbl_name
----------
COMPANY
列出关于 COMPANY 表的完整信息,如下所示:
sqlite> SELECT sql FROM sqlite_master WHERE type = 'table' AND tbl_name = 'COMPANY';
假设在 testDB.db 中已经存在唯一的 COMPANY 表,则将产生以下结果:
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
)