Database:SQLite数据库导论

SQLite数据库导论

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-*.zipsqlite-dll-win32-*.zip这两个压缩文件;(3)在系统中选择一个安装目录,如D:\Software\sqlite,将下载的两个压缩文件解压于此处,会得到sqlite3.defsqlite3.dllsqlite3.exe这三个文件;(4)为了可以在命令行窗口中使用sqlite3命令,把SQLite的安装目录添加至PATH环境变量。如此,SQLite数据库安装完毕。

与关系数据库进行交互的标准SQLite命令类似于SQL。命令包括CREATEALTERSELECTINSERTUPDATEDELETEDROP。这些命令基于它们的操作性质可分为三类:(1)数据定义语言(DDL),CREATE:创建一个新的数据表,一个数据表的视图,或者数据库中的其它对象;ALTER:修改数据库中的某个已有的数据库对象,比如一个数据表;DROP:删除整个数据表,或者数据表的视图,或者数据库中的其它对象。(2)数据操作语言(DML),INSERT:往数据表插入一条记录;UPDATE:修改记录;DELETE:删除记录。(3)数据查询语言(DQL),SELECT:从一个或多个数据表中检索某些记录。

下面分别从创建数据库,附加数据库,分离数据库,创建数据表,删除数据表,数据添加,数据查询这七个方面对SQLite数据库的基本操作进行介绍。

创建数据库(sqlite3 dbname.db)

SQLite使用sqlite3 命令在当前目录创建新的数据库。和其它数据库产品不同,SQLite不需要任何特殊的权限就可以创建一个数据库,即不需要用户名和密码。而如果当前目录存在一个数据库,则也可用此命令进入这个数据库。

语法

使用sqlite3命令创建数据库的基本语法如下:

>sqlite3 DatabaseName.db

通常情况下,数据库名称在 RDBMS 内应该是唯一的。

实例

创建一个新的SQLite数据库testDB.db
Database:SQLite数据库导论_第1张图片
命令sqlite3 testDB.db的作用是在当前目录D:\下创建一个文件testDB.db。该文件将被SQLite引擎用作数据库。在成功创建数据库文件之后,命令行窗口中将出现一个sqlite>提示符。一旦数据库被创建后,即可使用SQLite的.databases命令来检查它是否在数据库列表中。最后,可以使用.quit命令退出 sqlite 提示符。如下为在目录D:\下创建的SQLite数据库。
Database:SQLite数据库导论_第2张图片
.dump 命令

在命令行窗口中使用.dump 点命令可以导出完整的数据库到一个文本文件中,如下所示:

>sqlite3 testDB.db .dump > testDB.sql

上面的命令将转换整个 testDB.db 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 testDB.sql 中。通过简单的方式可以从生成的 testDB.sql 恢复,如下所示:

>sqlite3 testDB.db < testDB.sql

此时的 testDB.db 数据库是空的,一旦数据库中有表和数据,可以再次尝试上述的两个程序。

附加数据库(attach database)

假设这样一种情况,当在同一时间有多个数据库可用,你想使用其中的任何一个。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 命令来显示附加的数据库。
Database:SQLite数据库导论_第3张图片
数据库名称 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;

分离数据库(detach database)

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

创建数据表(create table)

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
);

删除数据表(drop table)

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>

显示结果为空,意味着已经成功从数据库删除表。

数据添加(insert into)

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];

数据查询(select)

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
)

你可能感兴趣的:(Database)