SQLite - 快速指南


SQLite - 概述

本章帮助您了解什么是 SQLite、它与 SQL 有何不同、为什么需要它以及它处理应用程序数据库的方式。

SQLite 是一个软件库,它实现了独立、无服务器、零配置、事务性 SQL 数据库引擎。SQLite 是增长最快的数据库引擎之一,但这只是受欢迎程度的增长,与其规模无关。SQLite 的源代码属于公共领域。

什么是 SQLite?

SQLite 是一个进程内库,它实现了独立、无服务器、零配置、事务性 SQL 数据库引擎。它是一个零配置的数据库,这意味着像其他数据库一样,您不需要在系统中配置它。

SQLite 引擎不像其他数据库那样是一个独立的进程,您可以根据您的应用程序的要求将其静态或动态链接。SQLite 直接访问其存储文件。

为什么选择 SQLite?

  • SQLite 不需要单独的服务器进程或系统来运行(无服务器)。

  • SQLite 具有零配置功能,这意味着无需设置或管理。

  • 完整的 SQLite 数据库存储在单个跨平台磁盘文件中。

  • SQLite 非常小且轻,完全配置时小于 400KiB,省略可选功能时小于 250KiB。

  • SQLite 是独立的,这意味着没有外部依赖项。

  • SQLite 事务完全符合 ACID,允许从多个进程或线程安全访问。

  • SQLite 支持 SQL92 (SQL2) 标准中的大多数查询语言功能。

  • SQLite 采用 ANSI-C 编写,提供简单易用的 API。

  • SQLite 可在 UNIX(Linux、Mac OS-X、Android、iOS)和 Windows(Win32、WinCE、WinRT)上使用。

SQLite 简史

  • 2000 年 - D. Richard Hipp 设计了 ​​SQLite,其目的是无需管理即可运行程序。

  • 2000 年 - 8 月,SQLite 1.0 与 GNU 数据库管理器一起发布。

  • 2011年-Hipp宣布为SQLite DB添加UNQl接口并开发UNQLite(面向文档的数据库)。

SQLite 的限制

SQLite 中有一些不支持的 SQL92 功能,如下表所列。

先生。 特点及描述
1

右外连接

仅实现了 LEFT OUTER JOIN。

2

全外连接

仅实现了 LEFT OUTER JOIN。

3

修改表

支持 ALTER TABLE 命令的 RENAME TABLE 和 ADD COLUMN 变体。不支持 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT。

4

触发支持

支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器。

5

视图

SQLite 中的视图是只读的。您不能对视图执行 DELETE、INSERT 或 UPDATE 语句。

6

授予和撤销

唯一可以应用的访问权限是底层操作系统的正常文件访问权限。

SQLite命令

与关系数据库交互的标准 SQLite 命令与 SQL 类似。它们是创建、选择、插入、更新、删除和删除。这些命令可以根据其操作性质分为几组 -

DDL - 数据定义语言

先生。 命令与说明
1

创造

创建新表、表视图或数据库中的其他对象。

2

改变

修改现有数据库对象,例如表。

3

降低

删除整个表、表的视图或数据库中的其他对象。

DML - 数据操作语言

先生。 命令与说明
1

插入

创建记录

2

更新

修改记录

3

删除

删除记录

DQL - 数据查询语言

先生。 命令与说明
1

选择

从一个或多个表中检索某些记录

SQLite - 安装

SQLite 以其强大的零配置功能而闻名,这意味着不需要复杂的设置或管理。本章将带您完成在 Windows、Linux 和 Mac OS X 上设置 SQLite 的过程。

在 Windows 上安装 SQLite

  • 步骤 1 - 转到SQLite 下载页面,然后从 Windows 部分下载预编译的二进制文件。

  • 步骤 2 - 下载 sqlite-shell-win32-*.zip 和 sqlite-dll-win32-*.zip 压缩文件。

  • 步骤 3 - 创建一个文件夹 C:\>sqlite 并解压该文件夹中的两个压缩文件,这将给你 sqlite3.def、sqlite3.dll 和 sqlite3.exe 文件。

  • 步骤 4 - 在 PATH 环境变量中添加 C:\>sqlite,最后转到命令提示符并发出 sqlite3 命令,该命令应显示以下结果。

C:\>sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

在 Linux 上安装 SQLite

如今,几乎所有版本的 Linux 操作系统都附带 SQLite。因此,您只需发出以下命令来检查您的计算机上是否已安装 SQLite。

$sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

如果您没有看到上述结果,则意味着您的 Linux 计算机上没有安装 SQLite。以下是安装 SQLite 的以下步骤 -

  • 步骤 1 - 转到SQLite 下载页面并从源代码部分下载 sqlite-autoconf-*.tar.gz。

  • 步骤 2 - 运行以下命令 -

$tar xvfz sqlite-autoconf-3071502.tar.gz
$cd sqlite-autoconf-3071502
$./configure --prefix=/usr/local
$make
$make install

上面的命令将以在 Linux 计算机上安装 SQLite 结束。您可以按照上面的说明进行验证。

在 Mac OS X 上安装 SQLite

虽然最新版本的 Mac OS X 预装了 SQLite,但如果您没有可用的安装,则只需按照以下步骤操作 -

  • 步骤 1 - 转到SQLite 下载页面,然后从源代码部分下载 sqlite-autoconf-*.tar.gz。

  • 步骤 2 - 运行以下命令 -

$tar xvfz sqlite-autoconf-3071502.tar.gz
$cd sqlite-autoconf-3071502
$./configure --prefix=/usr/local
$make
$make install

上述过程将以在 Mac OS X 计算机上安装 SQLite 结束。您可以通过发出以下命令来验证 -

$sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

最后,您有 SQLite 命令提示符,您可以在其中为练习发出 SQLite 命令。

SQLite - 命令

本章将带您了解 SQLite 程序员使用的简单且有用的命令。这些命令称为 SQLite 点命令,这些命令的例外是它们不应以分号 (;) 结尾。

让我们首先在命令提示符处键入一个简单的sqlite3命令,该命令将为您提供 SQLite 命令提示符,您可以在其中发出各种 SQLite 命令。

$sqlite3
SQLite version 3.3.6
Enter ".help" for instructions
sqlite>

要获取可用点命令的列表,您可以随时输入“.help”。例如 -

sqlite>.help

上面的命令将显示各种重要的 SQLite 点命令的列表,如下表所列。

先生。 命令与说明
1

.备份?数据库?文件

备份数据库(默认“主”)到文件

2

.保释开|关

遇到错误后停止。默认关闭

3

.数据库

列出附加数据库的名称和文件

4

.dump?表?

以 SQL 文本格式转储数据库。如果指定了 TABLE,则仅转储与 LIKE 模式 TABLE 匹配的表

5

.echo 开|关

打开或关闭命令回显

6

。出口

退出 SQLite 提示符

7

.解释开|关

打开或关闭适合 EXPLAIN 的输出模式。如果没有参数,它会打开 EXPLAIN

8

.headerON|OFF

打开或关闭标题显示

9

。帮助

显示此消息

10

.导入文件表

将数据从 FILE 导入到 TABLE

11

.索引?表?

显示所有索引的名称。如果指定了 TABLE,则仅显示与 LIKE 模式 TABLE 匹配的表的索引

12

.加载文件?条目?

加载扩展库

13

.log 文件|关闭

打开或关闭日志记录。文件可以是标准错误/标准输出

14

.模式 MODE

设置输出模式,其中 MODE 是以下之一 -

  • csv - 逗号分隔值

  • - 左对齐的列。

  • html - HTML <table> 代码

  • insert - TABLE 的 SQL 插入语句

  • line - 每行一个值

  • list - 由 .separator 字符串分隔的值

  • tabs - 制表符分隔值

  • tcl - TCL 列表元素

15

.nu​​llvalue STRING

打印 STRING 代替 NULL 值

16

.输出文件名

将输出发送到 FILENAME

17 号

.输出标准输出

将输出发送到屏幕

18

.打印字符串...

打印文字 STRING

19

.提示主要继续

替换标准提示

20

。辞职

退出 SQLite 提示符

21

.读取文件名

在FILENAME中执行SQL

22

.schema?表?

显示 CREATE 语句。如果指定了 TABLE,则仅显示与 LIKE 模式 TABLE 匹配的表

23

.分隔符 STRING

更改输出模式和.import 使用的分隔符

24

。展示

显示各种设置的当前值

25

.stats 开|关

打开或关闭统计

26

.tables?模式?

列出与 LIKE 模式匹配的表名称

27

.超时 MS

尝试打开锁定的表 MS 毫秒

28

.宽度 NUM NUM

设置“列”模式的列宽

29

.定时器开|关

打开或关闭 CPU 计时器测量

让我们尝试使用.show命令来查看 SQLite 命令提示符的默认设置。

sqlite>.show
     echo: off
  explain: off
  headers: off
     mode: column
nullvalue: ""
   output: stdout
separator: "|"
    width:
sqlite>

确保 sqlite> 提示符和点命令之间没有空格,否则它将无法工作。

格式化输出

您可以使用以下点命令序列来格式化输出。

sqlite>.header on
sqlite>.mode column
sqlite>.timer on
sqlite>

上述设置将产生以下格式的输出。

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
CPU Time: user 0.000000 sys 0.000000

sqlite_master 表

主表保存有关数据库表的关键信息,称为sqlite_master。您可以看到其架构如下 -

sqlite>.schema sqlite_master

这将产生以下结果。

CREATE TABLE sqlite_master (
   type text,
   name text,
   tbl_name text,
   rootpage integer,
   sql text
);

SQLite - 语法

SQLite 遵循一组称为语法的独特规则和指南。本章列出了所有基本的 SQLite 语法。

区分大小写

需要注意的一点是,SQLite 不区分大小写,但有些命令区分大小写,例如GLOBglob在 SQLite 语句中具有不同的含义。

评论

SQLite 注释是额外的注释,您可以将其添加到 SQLite 代码中以增加其可读性,它们可以出现在任何地方;空格可能出现,包括表达式内部和其他 SQL 语句中间,但不能嵌套。

SQL 注释以两个连续的“-”字符 (ASCII 0x2d) 开始,一直延伸到并包括下一个换行符 (ASCII 0x0a) 或直到输入结束,以先到者为准。

您还可以使用 C 样式注释,它以“/*”开头,一直延伸到并包括下一个“*/”字符对,或者直到输入结束(以先到者为准)。C 风格的注释可以跨越多行。

sqlite> .help -- This is a single line comment

SQLite 语句

所有 SQLite 语句都以任何关键字开头,例如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP 等,并且所有语句都以分号 (;) 结尾。

SQLite 分析语句

ANALYZE;
or
ANALYZE database_name;
or
ANALYZE database_name.table_name;

SQLite AND/OR 子句

SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION-1 {AND|OR} CONDITION-2;

SQLite ALTER TABLE 语句

ALTER TABLE table_name ADD COLUMN column_def...;

SQLite ALTER TABLE 语句(重命名)

ALTER TABLE table_name RENAME TO new_table_name;

SQLite 附加数据库语句

ATTACH DATABASE 'DatabaseName' As 'Alias-Name';

SQLite BEGIN TRANSACTION 语句

BEGIN;
or
BEGIN EXCLUSIVE TRANSACTION;

SQLite BETWEEN 子句

SELECT column1, column2....columnN
FROM table_name
WHERE column_name BETWEEN val-1 AND val-2;

SQLite COMMIT 语句

COMMIT;

SQLite CREATE INDEX 语句

CREATE INDEX index_name
ON table_name ( column_name COLLATE NOCASE );

SQLite CREATE UNIQUE INDEX 语句

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);

SQLite CREATE TABLE 语句

CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

SQLite CREATE TRIGGER 语句

CREATE TRIGGER database_name.trigger_name 
BEFORE INSERT ON table_name FOR EACH ROW
BEGIN 
   stmt1; 
   stmt2;
   ....
END;

SQLite CREATE VIEW 语句

CREATE VIEW database_name.view_name AS
SELECT statement....;

SQLite CREATE VIRTUAL TABLE 语句

CREATE VIRTUAL TABLE database_name.table_name USING weblog( access.log );
or
CREATE VIRTUAL TABLE database_name.table_name USING fts3( );

SQLite COMMIT TRANSACTION 语句

COMMIT;

SQLite COUNT 子句

SELECT COUNT(column_name)
FROM table_name
WHERE CONDITION;

SQLite DELETE 语句

DELETE FROM table_name
WHERE {CONDITION};

SQLite DETACH DATABASE 语句

DETACH DATABASE 'Alias-Name';

SQLite DISTINCT 子句

SELECT DISTINCT column1, column2....columnN
FROM table_name;

SQLite DROP INDEX 语句

DROP INDEX database_name.index_name;

SQLite DROP TABLE 语句

DROP TABLE database_name.table_name;

SQLite DROP VIEW 语句

DROP INDEX database_name.view_name;

SQLite DROP TRIGGER 语句

DROP INDEX database_name.trigger_name;

SQLite EXISTS 子句

SELECT column1, column2....columnN
FROM table_name
WHERE column_name EXISTS (SELECT * FROM   table_name );

SQLite EXPLAIN 语句

EXPLAIN INSERT statement...;
or 
EXPLAIN QUERY PLAN SELECT statement...;

SQLite GLOB 子句

SELECT column1, column2....columnN
FROM table_name
WHERE column_name GLOB { PATTERN };

SQLite GROUP BY 子句

SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name;

SQLite HAVING 子句

SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name
HAVING (arithematic function condition);

SQLite INSERT INTO 语句

INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);

SQLite IN 子句

SELECT column1, column2....columnN
FROM table_name
WHERE column_name IN (val-1, val-2,...val-N);

SQLite Like 子句

SELECT column1, column2....columnN
FROM table_name
WHERE column_name LIKE { PATTERN };

SQLite NOT IN 子句

SELECT column1, column2....columnN
FROM table_name
WHERE column_name NOT IN (val-1, val-2,...val-N);

SQLite ORDER BY 子句

SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION
ORDER BY column_name {ASC|DESC};

SQLite PRAGMA 语句

PRAGMA pragma_name;

For example:

PRAGMA page_size;
PRAGMA cache_size = 1024;
PRAGMA table_info(table_name);

SQLite RELEASE SAVEPOINT 语句

RELEASE savepoint_name;

SQLite REINDEX 语句

REINDEX collation_name;
REINDEX database_name.index_name;
REINDEX database_name.table_name;

SQLite ROLLBACK 语句

ROLLBACK;
or
ROLLBACK TO SAVEPOINT savepoint_name;

SQLite SAVEPOINT 语句

SAVEPOINT savepoint_name;

SQLite SELECT 语句

SELECT column1, column2....columnN
FROM table_name;

SQLite更新语句

UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE  CONDITION ];

SQLite VACUUM 语句

VACUUM;

SQLite WHERE 子句

SELECT column1, column2....columnN
FROM table_name
WHERE CONDITION;

SQLite - 数据类型

SQLite 数据类型是指定任何对象的数据类型的属性。SQLite 中的每个列、变量和表达式都有相关的数据类型。

您将在创建表时使用这些数据类型。SQLite 使用更通用的动态类型系统。在 SQLite 中,值的数据类型与值本身相关联,而不是与其容器相关联。

SQLite 存储类

SQLite 数据库中存储的每个值都具有以下存储类别之一 -

先生。 存储类别和描述
1

无效的

该值为 NULL 值。

2

整数

该值是一个有符号整数,根据值的大小存储在 1、2、3、4、6 或 8 个字节中。

3

真实的

该值为浮点值,存储为 8 字节 IEEE 浮点数。

4

文本

该值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储

5

BLOB

该值是一团数据,完全按照输入时的方式存储。

SQLite 存储类比数据类型稍微通用一些。例如,INTEGER 存储类包括 6 种不同长度的不同整数数据类型。

SQLite 亲和类型

SQLite 支持列上类型关联的概念。任何列仍然可以存储任何类型的数据,但列的首选存储类称为其关联性。SQLite3 数据库中的每个表列都被分配以下类型关联之一 -

先生。 亲和力和描述
1

文本

该列使用存储类 NULL、TEXT 或 BLOB 存储所有数据。

2

数字

此列可能包含使用所有五个存储类别的值。

3

整数

Behave与具有 NUMERIC 亲和力的列相同,但 CAST 表达式中存在例外。

4

真实的

Behave类似于具有 NUMERIC 关联性的列,只不过它强制将整数值转换为浮点表示形式。

5

没有任何

具有关联性 NONE 的列不会优先选择一种存储类而不是另一种存储类,并且不会尝试将数据从一种存储类强制到另一种存储类。

SQLite 关联性和类型名称

下表列出了在创建具有相应应用关联性的 SQLite3 表时可以使用的各种数据类型名称。

数据类型 亲和力
  • INT
  • 整数
  • 天音
  • 小智
  • 中薄荷
  • BIGINT
  • 无符号大整型
  • INT2
  • INT8
整数
  • 人物(20)
  • VARCHAR(255)
  • 变化的性格(255)
  • NCHAR(55)
  • 原生角色(70)
  • NVARCHAR(100)
  • 文本
  • CLOB
文本
  • BLOB
  • 没有指定数据类型
没有任何
  • 真实的
  • 双倍的
  • 双精度
  • 漂浮
真实的
  • 数字
  • 小数(10,5)
  • 布尔值
  • 日期
  • 约会时间
数字

布尔数据类型

SQLite 没有单独的布尔存储类。相反,布尔值存储为整数 0(假)和 1(真)。

日期和时间数据类型

SQLite 没有单独的存储类来存储日期和/或时间,但 SQLite 能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值。

先生。 存储类别和日期格式
1

文本

格式类似于“YYYY-MM-DD HH:MM:SS.SSS”的日期

2

真实的

公元前 4714 年 11 月 24 日格林威治中午以来的天数

3

整数

自 1970-01-01 00:00:00 UTC 以来的秒数

您可以选择以任何一种格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。

SQLite - 创建数据库

在SQLite中,sqlite3命令用于创建新的SQLite数据库。您不需要具有任何特殊权限即可创建数据库。

句法

以下是 sqlite3 命令创建数据库的基本语法: -

$sqlite3 DatabaseName.db

始终,数据库名称在 RDBMS 中应该是唯一的。

例子

如果你想创建一个新的数据库 <testDB.db>,那么 SQLITE3 语句将如下 -

$sqlite3 testDB.db
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

上面的命令将在当前目录中创建一个文件testDB.db 。该文件将被 SQLite 引擎用作数据库。如果您在创建数据库时注意到,成功创建数据库文件后, sqlite3 命令将提供sqlite>提示符。

创建数据库后,您可以使用以下 SQLite .databases命令在数据库列表中验证它。

sqlite>.databases
seq  name             file
---  ---------------  ----------------------
0    main             /home/sqlite/testDB.db

您将使用 SQLite .quit命令退出 sqlite 提示符,如下所示 -

sqlite>.quit
$

.dump 命令

您可以使用.dump dot 命令在命令提示符下使用以下 SQLite 命令将完整数据库导出到文本文件中。

$sqlite3 testDB.db .dump > testDB.sql

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

$sqlite3 testDB.db < testDB.sql

此时您的数据库是空的,因此当数据库中的表和数据很少时,您可以尝试上述两个过程。现在,让我们继续下一章。

SQLite - 附加数据库

考虑这样一种情况:您有多个可用数据库并且您想一次使用其中任何一个。SQLite ATTACH DATABASE语句用于选择特定数据库,执行此命令后,所有 SQLite 语句都将在附加数据库下执行。

句法

以下是 SQLite ATTACH DATABASE 语句的基本语法。

ATTACH DATABASE 'DatabaseName' As 'Alias-Name';

如果数据库尚未创建,上面的命令还将创建一个数据库,否则它只会附加数据库文件名和逻辑数据库“别名”。

例子

如果您想附加现有数据库testDB.db,则 ATTACH DATABASE 语句如下 -

sqlite> ATTACH DATABASE 'testDB.db' as 'TEST';

使用 SQLite .database命令显示附加的数据库。

sqlite> .database
seq  name             file
---  ---------------  ----------------------
0    main             /home/sqlite/testDB.db
2    test             /home/sqlite/testDB.db

数据库名称maintemp为主数据库和保存临时表和其他临时数据对象的数据库保留。每个数据库连接都存在这两个数据库名称,不应将其用于附件,否则您将收到以下警告消息。

sqlite> ATTACH DATABASE 'testDB.db' as 'TEMP';
Error: database TEMP is already in use
sqlite> ATTACH DATABASE 'testDB.db' as 'main';
Error: database TEMP is already in use

SQLite - 分离数据库

SQLite DETACH DATABASE语句用于将命名数据库与先前使用 ATTACH 语句附加的数据库连接分离和解除关联。如果同一个数据库文件附加了多个别名,则 DETACH 命令将仅断开给定名称,而附件的其余部分仍将继续。您无法分离数据库或临时数据库。

如果数据库是内存数据库或临时数据库,数据库将被破坏,内容将丢失。

句法

以下是 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 - 创建表

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 语句之后。或者,您可以指定database_nametable_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 表两次,因为它显示主数据库的 COMPANY 表和为 testDB.db 创建的“test”别名的 test.COMPANY 表。您可以使用以下 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 - 删除表

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 - 插入查询

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 表中创建 6 条记录。

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 和 WHERE 子句,这将在后续章节中介绍。

SQLite - 选择查询

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 列被截断输出相关的问题,这是由于要显示的列的默认宽度而发生的。您可以做的是,您可以使用.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

架构信息

由于所有点命令都可以在 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
)

SQLite - 运算符

SQLite 中的运算符是什么?

运算符是保留字或字符,主要在 SQLite 语句的 WHERE 子句中用于执行操作,例如比较和算术运算。

运算符用于指定 SQLite 语句中的条件,并充当语句中多个条件的连接词。

  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • 按位运算符

SQLite 算术运算符

假设变量a为 10,变量b为 20,则 SQLite 算术运算符将按如下方式使用 -

显示示例

操作员 描述 例子
+(加法) 在运算符两侧添加值 a + b 将得到 30
-(减法) 从左手操作数中减去右手操作数 a - b 将给出 -10
*(乘法) 将运算符两侧的值相乘 a * b 将给出 200
/ (分配) 将左手操作数除以右手操作数 b / a 将给出 2
%(模数) 将左侧操作数除以右侧操作数并返回余数 b % a 将给出 0

SQLite 比较运算符

假设变量a为 10,变量b为 20,则 SQLite 比较运算符将按如下方式使用

显示示例

操作员 描述 例子
== 检查两个操作数的值是否相等,如果相等则条件成立。 (a == b) 不成立。
= 检查两个操作数的值是否相等,如果相等则条件成立。 (a = b) 不正确。
!= 检查两个操作数的值是否相等,如果不相等,则条件成立。 (a != b) 为真。
<> 检查两个操作数的值是否相等,如果不相等,则条件成立。 (a <> b) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是,则条件为真。 (a > b) 不正确。
< 检查左操作数的值是否小于右操作数的值,如果是,则条件成立。 (a < b) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件成立。 (a >= b) 不正确。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。 (a <= b) 为真。
!< 检查左操作数的值是否不小于右操作数的值,如果是,则条件成立。 (a !< b) 为假。
!> 检查左操作数的值是否不大于右操作数的值,如果是,则条件成立。 (a !> b) 为真。

SQLite 逻辑运算符

以下是 SQLite 中可用的所有逻辑运算符的列表。

显示示例

先生。 运算符及描述
1

AND 运算符允许 SQL 语句的 WHERE 子句中存在多个条件。

2

之间

BETWEEN 运算符用于在给定最小值和最大值的情况下搜索一组值内的值。

3

存在

EXISTS 运算符用于搜索指定表中是否存在满足特定条件的行。

4

IN 运算符用于将值与已指定的文字值列表进行比较。

5

不在

IN 运算符的否定,用于将值与已指定的文字值列表进行比较。

6

喜欢

LIKE 运算符用于将值与使用通配符运算符的相似值进行比较。

7

全局

GLOB 运算符用于使用通配符运算符将值与相似值进行比较。此外,与 LIKE 不同,GLOB 区分大小写。

8

不是

NOT 运算符反转了与其一起使用的逻辑运算符的含义。例如。NOT EXISTS、NOT BETWEEN、NOT IN 等。这是否定运算符。

9

或者

OR 运算符用于组合 SQL 语句的 WHERE 子句中的多个条件。

10

一片空白

NULL 运算符用于将值与 NULL 值进行比较。

11

IS 运算符的工作方式类似于 =

12

不是

IS 运算符的工作方式类似于 !=

13

||

添加两个不同的字符串并创建新的字符串。

14

独特的

UNIQUE 运算符搜索指定表的每一行的唯一性(无重复项)。

SQLite 位运算符

位运算符作用于位并执行逐位运算。以下是&|的真值表 。

p q 质与问 p| q
0 0 0 0
0 1 0 1
1 1 1 1
1 0 0 1

假设A = 60;B = 13,那么以二进制格式,它们将如下 -

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

〜A = 1100 0011

SQLite语言支持的按位运算符如下表所示。假设变量A为 60,变量B为 13,则 -

显示示例

操作员 描述 例子
& 如果两个操作数中都存在的话,二进制 AND 运算符会将一位复制到结果中。 (A & B) 将给出 12,即 0000 1100
| 二元或运算符复制一个位(如果任一操作数中存在该位)。 (A | B) 将给出 61,即 0011 1101
二进制补码运算符是一元的,具有“翻转”位的效果。 (~A ) 将给出 -61,由于有符号二进制数,它是 2 的补码形式的 1100 0011
<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将给出 240,即 1111 0000
>> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2 将得到 15,即 0000 1111

SQLite - 表达式

表达式是一个或多个值、运算符和计算结果为某个值的 SQL 函数的组合。

SQL 表达式类似于公式,它们是用查询语言编写的。您还可以用来查询数据库中的一组特定数据。

句法

考虑 SELECT 语句的基本语法如下 -

SELECT column1, column2, columnN 
FROM table_name 
WHERE [CONDITION | EXPRESSION];

以下是不同类型的 SQLite 表达式。

SQLite - 布尔表达式

SQLite 布尔表达式基于匹配单个值来获取数据。以下是语法 -

SELECT column1, column2, columnN 
FROM table_name 
WHERE SINGLE VALUE MATCHTING EXPRESSION;

考虑具有以下记录的 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

以下是一个简单的示例,展示了 SQLite 布尔表达式的用法 -

sqlite> SELECT * FROM COMPANY WHERE SALARY = 10000;

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           James        24          Houston   10000.0

SQLite - 数字表达式

这些表达式用于在任何查询中执行任何数学运算。以下是语法 -

SELECT numerical_expression as OPERATION_NAME
[FROM table_name WHERE CONDITION] ;

这里, numeric_expression 用于数学表达式或任何公式。以下是一个显示 SQLite 数字表达式用法的简单示例。

sqlite> SELECT (15 + 6) AS ADDITION
ADDITION = 21

有几个内置函数,例如avg()、sum()、count()等,用于针对表或特定表列执行所谓的聚合数据计算。

sqlite> SELECT COUNT(*) AS "RECORDS" FROM COMPANY; 
RECORDS = 7

SQLite - 日期表达式

日期表达式返回当前系统日期和时间值。这些表达式用于各种数据操作。

sqlite> SELECT CURRENT_TIMESTAMP;
CURRENT_TIMESTAMP = 2013-03-17 10:43:35

SQLite - WHERE 子句

SQLite WHERE子句用于指定从一张表或多张表中获取数据时的条件。

如果满足给定条件,则表示 true,则返回表中的特定值。您必须使用 WHERE 子句来过滤记录并仅获取必要的记录。

WHERE子句不仅用在SELECT语句中,还用在UPDATE、DELETE语句等中,这将在后续章节中介绍。

句法

以下是带有 WHERE 子句的 SQLite SELECT 语句的基本语法。

SELECT column1, column2, columnN 
FROM table_name
WHERE [condition]

例子

您可以使用比较或逻辑运算符(例如 >、<、=、LIKE、NOT 等)指定条件。考虑具有以下记录的 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

以下是一个简单的示例,展示了 SQLite 逻辑运算符的用法。以下 SELECT 语句列出了 AGE 大于或等于 25并且薪资大于或等于 65000.00 的所有记录。

sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

下面的 SELECT 语句列出了 AGE 大于或等于 25工资大于或等于 65000.00 的所有记录。

sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

下面的 SELECT 语句列出了所有 AGE 不为 NULL 的记录,这意味着所有记录,因为没有一条记录的 AGE 等于 NULL。

sqlite>  SELECT * FROM COMPANY WHERE AGE IS NOT NULL;

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 语句列出了 NAME 以“Ki”开头的所有记录,与“Ki”后面的内容无关。

sqlite> SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%';

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
6           Kim         22          South-Hall  45000.0

下面的 SELECT 语句列出了 NAME 以“Ki”开头的所有记录,与“Ki”后面的内容无关。

sqlite> SELECT * FROM COMPANY WHERE NAME GLOB 'Ki*';

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
6           Kim         22          South-Hall  45000.0

以下 SELECT 语句列出了 AGE 值为 25 或 27 的所有记录。

sqlite> SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

下面的 SELECT 语句列出了 AGE 值既不是 25 也不是 27 的所有记录。

sqlite> SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 );

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0
6           Kim         22