【数据库】SQLite 数据库

参考文档:sqlite 官方文档:https://www.sqlite.org/docs.html

一、简介

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

就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

1. 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)中运行。

2. 命令分类

与关系数据库进行交互的标准 SQLite 命令类似于 SQL。命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。这些命令基于它们的操作性质可分为以下几种:

DDL - 数据定义语言 DML - 数据操作语言 DQL - 数据查询语言
CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。 INSERT 创建一条记录。 SELECT 从一个或多个表中检索某些记录。
ALTER 修改数据库中的某个已有的数据库对象,比如一个表。 UPDATE 修改记录。
DROP 删除整个表,或者表的视图,或者数据库中的其他对象。 DELETE 删除记录。

二、SQLite 命令

 # sqlite3 安装
 # 大部分 Linux 安装有 sqlite3 
 sudo apt install sqlite3

1. 简单的 SQLite 命令

提示符与点命令之间没有空格,否则将无法正常工作。

# 1. 启动 sqlite3
sqlite3

启动 sqlite3

# 2. 查看命令清单
.help

.help

# 3. 查看 SQLite 命令提示符的默认设置
.show

.show

# 4. 更改设置
# 例如:
.header on
.mode column
.timer on
# 5. 
# .schema + 表名
.schema flightplan
# sqlite_master 是SQLite内部使用的一个特殊表,它存储了数据库元数据信息,包括所有的表、索引、触发器、视图和存储过程的详细信息。当你执行 .schema sqlite_master 命令时,SQLite将返回创建 sqlite_master 表的SQL语句。这通常看起来像一个 CREATE TABLE 语句,它会告诉你这个表的列名、数据类型以及任何约束条件(如主键、唯一性、默认值等)。

.shema sqlite_master

2. SQLite 语法

1. 大小写敏感性

SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。

2. 注释

SQLite 注释是附加的注释,可以在 SQLite 代码中添加注释以增加其可读性,可以出现在任何空白处,包括在表达式内和其他 SQL 语句的中间,但不能嵌套。

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

也可以使用 C 风格的注释,以 “/" 开始,并扩展至下一个 "/” 字符对或直到输入结束,以先到者为准。SQLite的注释可以跨越多行。

3. SQLite 语句 — 待更新

所有的 SQLite 语句可以以任何关键字开始,如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP 等,所有的语句以分号 ; 结束。

PS: 这里可以用作简单快速的查询,下一章会有具体示例。

1. ANALYZE 语句

在 SQLite 中,ANALYZE 命令用于收集关于数据库内容的统计信息。这些信息被存储在特殊的表 sqlite_stat1, sqlite_stat2, 和 sqlite_stat3 中(具体取决于 SQLite 的版本和你的数据库模式),并被查询规划器用来做出更优的决策,决定如何执行 SQL 查询。

# 1,
# 当不指定数据库或表而运行 ANALYZE 命令时,它会分析整个数据库: 
ANALYZE;
# 2.
# 如果想要针对特定的数据库进行分析
# 由于 SQLite 通常不按照传统意义上的多个数据库工作(每个 SQLite 数据库通常都包含在一个单独的文件中)
# 这种形式的命令通常没有必要,除非正在处理附加的数据库。
ANALYZE database_name;
# 3.
# 要针对特定的表进行分析
ANALYZE database_name.table_name;
# 如果只涉及到一个数据库,你可以省略 database_name 部分
ANALYZE table_name;
2. AND/OR 子句
SELECT column1, column2....columnN  --- 
FROM   table_name
WHERE  CONDITION-1 {
   AND|OR} CONDITION-2;
3. ALTER TABLE 语句
# 1.
ALTER TABLE table_name ADD COLUMN column_def...;
# 2.
ALTER TABLE table_name RENAME TO new_table_name;
4. ATTACH DATABASE 语句

4. SQLite 数据类型

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

在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。

1. 存储类

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

存储类 描述
NULL 值是一个 NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。

SQLite 的存储类稍微比数据类型更普遍。INTEGER 存储类,例如,包含 6 种不同的不同长度的整数数据类型。

2. 亲和(Affinity)类型及类型名称

SQLite支持列的亲和类型概念。任何列仍然可以存储任何类型的数据,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式。SQLite目前的版本支持以下五种亲缘类型:

亲和类型 描述
TEXT 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。
NUMERIC 当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式 。
INTEGER 对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。
REAL 其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。
NONE 不做任何的转换,直接以该数据所属的数据类型进行存储。

下表列出了当创建 SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的亲和类型:

数据类型 亲和类型
INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
INTEGER
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
TEXT
BLOB
未指定类型
BLOB
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
REAL

NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
NUMERIC
3. Boolean 数据类型

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

4. Date 与 Time 数据类型

SQLite 没有一个单独的用于存储日期和/或时间的存储类,但 SQLite 能够把日期和时间存储为 TEXT、REAL 或 INTEGER 值。

存储类 日期格式
TEXT 格式为 “YYYY-MM-DD HH:MM:SS.SSS” 的日期。
REAL 从公元前 4714 年 11 月 24 日格林尼治时间的正午开始算起的天数。
INTEGER 从 1970-01-01 00:00:00 UTC 算起的秒数。

5. 创建数据库

1.sqlite3 和 .open 创建
# 通常情况下,数据库名称在 RDBMS 内应该是唯一的。
sqlite3 DatabaseName.db
# 另外我们也可以使用 .open 来建立新的数据库文件:
.open test.db

上面的命令创建了数据库文件 test.db,位于 sqlite3 命令同一目录下。

打开已存在数据库也是用 .open 命令,以上命令如果 test.db 存在则直接会打开,不存在就创建它。
sqlite3 xx.db
.oprn

2. .dump 导出
# .dump
# 可以在命令提示符中使用 SQLite .dump 点命令来导出完整的数据库在一个文本文件中
sqlite3 testDB.db .dump > testDB.sql
# 通过简单的方式从生成的 testDB.sql 恢复
sqlite3 testDB.db < testDB.sql

.dump

6. 附加 / 分离 数据库

当在同一时间有多个数据库可用, ATTACH DATABASE 语句是用来选择一个特定的数据库,附加后可以用附加名指代数据库。

# 如果数据库尚未被创建,将创建一个数据库
# 如果数据库已存在,则把数据库文件名称与逻辑数据库 'Alias-Name' 绑定在一起。
# 打开的数据库和使用 ATTACH附加进来的数据库的必须位于同一文件夹下。
ATTACH DATABASE file_name AS database_name;

DETACH DATABASE 语句是用来把命名数据库从一个数据库连接分离和游离出来。

# 如果同一个数据库文件已经被附加上多个别名,DETACH 命令将只断开给定名称的连接
# 而其余的仍然有效。无法分离 main 或 temp 数据库
DETACH DATABASE database_name

ATTACH
数据库名称 main 和 temp 被保留用于主数据库和存储临时表及其他临时数据对象的数据库。
这两个数据库名称可用于每个数据库连接,且不应该被用于附加和分离,否则将得到一个警告消息。

7. 创建表

CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
创建表

8. 删除表

DROP TABLE 语句用来删除表定义及其所有相关数据、索引、触发器、约束和该表的权限规范。
在这里插入图片描述
PS: sqlite3 以 ‘;’ 结尾,如果没有 ‘;’ 会继续输入。

9. Insert 语句

INSERT INTO 语句基本语法:

# 1.
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]  
VALUES (value1, value2, value3,...valueN);

# 2.
# 如果要为表中的所有列添加值,不需要在 SQLite 查询中指定列名称。但要确保值的顺序与列在表中的顺序一致
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

两种插入方式

10. Select 语句

SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。

# 获取所有字段
SELECT * FROM table_name;
# 查询部分数据
SELECT column1, column2, columnN FROM table_name;

查询

11. 运算符

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

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

1. 算术运算符
运算符 描述
+ 加法 - 把运算符两边的值相加
- 减法 - 左操作数减去右操作数
* 乘法 - 把运算符两边的值相乘
/ 除法 - 左操作数除以右操作数
% 取模 - 左操作数除以右操作数后得到的余数

PS: 其他的同理
算术运算符

2. 比较运算符

假设变量 a=10,变量 b=20

运算符 描述 结果
== 检查两个操作数的值是否相等,如果相等则条件为真。 (a == b) 不为真。
= 检查两个操作数的值是否相等,如果相等则条件为真。 (a = b) 不为真。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (a != b) 为真。
<> 检查两个操作数的值是否相等,如果不相等则条件为真。 a <> b) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (a > b) 不为真。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (a < b) 为真。
>= 检查左操作数的值是否大于等于右操作数的值,如果是则条件为真。 (a >= b) 不为真。
<= 检查左操作数的值是否小于等于右操作数的值,如果是则条件为真。 (a <= b) 为真。
!< 检查左操作数的值是否不小于右操作数的值,如果是则条件为真。 (a !< b) 为假。
!> 检查左操作数的值是否不大于右操作数的值,如果是则条件为真。 (a !> b) 为真。

PS: 其他的类似
比较运算符

3. 逻辑运算符
运算符 描述
AND AND 运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在。
BETWEEN BETWEEN 运算符用于在给定最小值和最大值范围内的一系列值中搜索值。
EXISTS EXISTS 运算符用于在满足一定条件的指定表中搜索行的存在。
IN IN 运算符用于把某个值与一系列指定列表的值进行比较。
NOT IN IN 运算符的对立面,用于把某个值与不在一系列指定列表的值进行比较。
LIKE LIKE 运算符用于把某个值与使用通配符运算符的相似值进行比较。
GLOB GLOB 运算符用于把某个值与使用通配符运算符的相似值进行比较。GLOB 与 LIKE 不同之处在于,它是大小写敏感的。
NOT NOT 运算符是所用的逻辑运算符的对立面。比如 NOT EXISTS、NOT BETWEEN、NOT IN,等等。它是否定运算符。
OR OR 运算符用于结合一个 SQL 语句的 WHERE 子句中的多个条件。
IS NULL NULL 运算符用于把某个值与 NULL 值进行比较。
IS IS 运算符与 = 相似。
IS NOT I
  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

育碧不配有妈妈、

创作不易,自愿投币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值