SQLite 学习笔记2 - 常用命令和示例

news2024/11/25 9:43:54

————————————————
版权声明:本文为CSDN博主「网易智企」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/netease_im/article/details/123741168
————————————————

SQLite常用命令和示例

在命令行中使用SQLite命令,需要先执行sqlite3命令,进入SQLite提示符。

创建或打开数据库

有两种方法可以创建或打开数据库, 一个是在sqlite3命令后面加上数据库路径, 另一个是使用点命令.open。

  1. sqlite3 /…/xxx.db 方法
    通过执行这个命令进入SQLite提示符时,如果数据库文件已经存在,则直接打开对应数据库,否则不会立即在对应路径创建xxx.db文件。要等到执行了添加数据表,视图等数据库对象的命令之后

?如果路径不存在,是否也会创建?

示例

先执行如下命令,此时没有创建出comms_ease.db文件

sqlite3 comms_ease.db

​ 再执行如下命令创建一张表,在当前目录出现comms_ease.db文件(已创建

  1. .open /…/xxx.db法
    使用.open是一个点命令,使用它需要先执行sqlite3命令进入SQLite提示符。.open命令的使用方式也是在命令后面追加数据库路径,不过和sqlite3 /…/xxx.db法不同的是,执行.open命令后,数据库文件会被直接创建出来,不需要再创建数据库对象。

创建表

SQLite的创建语句为CREATE TABLE,完整的创建表语句内容丰富,除了创建普通表外,还能具备判断表是否已经存在,创建临时表等能力。常见的创建普通表的句式为。

CREATE TABLE 表名 (
        列1名称 列类型 以空格隔开的一个或多个列约束, 
        列2名称 列类型 以空格隔开的一个或多个列约束,
        ...
);

默认情况下,一张表的最大列数为2000,每一行能存下的最大字节数为十亿,能满足绝大多数的需求,创建普通表的示例如下

CREATE TABLE table_comms_ease (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    value VARCHAR
);

例子中,创建了一个名为table_comms_ease的数据表,包含两列,第一列是id,类型是整形,不能为空,而且是表的主键,并可以自动生成; 第二列是value,类型为字符串

在表名已经存在的情况下,调用CREATE TABLE 表名语句会报错,要避免,可以使用CREATE TABLE IF NOT EXISTS 表名语句。如果不存在,则创建表,如果存在,则什么都不做。示例如下

推荐用法

CREATE TABLE IF NOT EXISTS table_comms_ease (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    value VARCHAR
);

如果希望临时存储一些数据,而且只对当前连接有效,可以试试临时表。临时表的创建语句为CREATE TEMP TABLE。临时表只对当前数据库连接有效,重新建立连接或者同时存在的其他连接都无法访问到。示例如下

CREATE TEMP TABLE temp_table_comms_ease (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    value VARCHAR
);

其它常用点命令

点命令是SQLite数据库独特的命令形式,它们通常比较简单,而且不需要以分号结尾,常见的点命令如下表所示

命令描述使用示例
.backup备份数据库到文件.backup comms_ease_backup
.databases列出数据库的名称及其所依附的文件.databases
.exit退出SQLite提示符.exit
.help帮助.help
.quit退出SQLite提示符.quit
.show各种设置的值.show
.schema查看创建命令。以LIKE`的模式匹配参数,如果没有参数,则查看所有表格的创建命令.schema .schema table%
.tables搜索表名。以LIKE`的模式匹配参数,如果没有参数,则搜索所有表名(临时表不会出现在结果中).tables .tables table%

新增记录

向表内添加一行,即为每一列构建一个值,并填入新的一行中。添加行的命令是INSERT,添加方式有三种,一种是指定值添加;二是添加Select语句的结果;三是默认添加。

  1. 指定值添加
    就是指定部分或者所有列的值,剩下列使用默认值的方式,对于没有通过DEFAULTE,AUTOINCREMENT等方式声明默认值的列,如果没有指定NOT NULL则填入NULL,否则报错。至少需要指定一列的值,如需全部填写默认值,可以使用默认添加方式。需要注意的是,值的顺序要和列的顺序保持一致。示例如下:
INSERT INTO table_comms_ease (value) VALUES ('value of 1');      // ID项有默认值,因此可以不填
INSERT INTO table_comms_ease (value, id) VALUES ('value of 2', 2);

如果需要指定填入所有列的值,也可以不把列名列举出来,将值按创建表时各个列的顺序列举出来即可。示例如下:

INSERT INTO table_comms_ease VALUES (3, 'value of 3');
  1. 通过添加加Select语句的结果添加
    通过添加加Select语句的结果添加一行的格式为INSERT INTO 表名 SELECT …通过此方法添加一行时,默认值不会被自动填充,SELECT语句查出的数据量必须和表的列数一致
    假设已经存在表operator包含列key和description,而且某一行的key为’.backup’,description为备份数据库到文件,给出示例如下:
INSERT INTO table_comms_ease SELECT  4, description FROM operator WHERE key IS '.backup';     // ?
  1. 默认添加的格式
    默认添加的格式为INSERT INTO 表名 DEFAULT VALUES; 为每一列都填入默认值,如果没有特别声明默认值,则填入NULL。示例如下:
INSERT INTO table_comms_ease DEFAULT VALUES;

通过创建表章节的示例语句创建出数据表,再依次调用上述示例语句,则数据表内会出现5行数据,如下

idvalue
1value of 1
2value of 2
3value of 3
4备份数据库到文件
5

删除记录

删除表内的一行,命令是DELETE,常用格式为

DELETE FROM 表名 WHERE 过滤语句

删除命令本身比较简单,指定表名和删除条件即可删除一列,如下示例表示如果value列中的值有value of开头,则删除。

DELETE FROM table_comms_ease WHERE value LIKE 'value of %';

如上命令操作后,table_comms_ease表还剩的数据为

idvalue
4备份数据库到文件
5

修改记录

修改表内数据的命令为UPDATE,其常用格式为

UPDATE 表名 SET 一个或多个列的赋值 WHERE 过滤语句

修改多列内容时可以采用先写出列名,再按顺序赋值的方式,也可以采用一列一列修改的方式。
如果要更新id为4的所在行的值,设置id为123,value为new value,两种修改方式分别如下

UPDATE table_comms_ease SET (id, value)= (123, 'new value') WHERE id = 4;

或者

UPDATE table_comms_ease SET id=123, value='new value' WHERE id = 4;

修改后,table_comms_ease表中的数据为

idvalue
5
123new value

修改单列的方法和修改多列的方法相似,比如将id为5这一行的value也修改为new value,可以如下操作

UPDATE table_comms_ease SET (value)=('new value') WHERE id = 5;

或者

UPDATE table_comms_ease SET value='new value' WHERE id = 5;

修改后,table_comms_ease表中的数据为

idvalue
5new value
123new value

查询

查询语句的命令是SELECT,它不会修改数据库,结果的行数在自然数范围内,每一行代表一个查询结果。SELECT命令的常用格式为

SELECT 去重策略 列名列表 FROM 表名或者子查询语句 WHERE 过滤语句 ORDER BY 排序策略 LIMIT 数量限制

查询语句中可用的配置比较多,但是大都不是必须的。查询table_comms_ease表的所有内容只需要如下命令即可

SELECT * FROM table_comms_ease;

// 上面命令中的*表示所有列,命令相当于

SELECT id,value FROM table_comms_ease;

结果为

idvalue
5new value
123new value

另外,可以通过VALUES语句构建一个查询结果,结果的列名为column1, column2, column3等等。比如

VALUES (1,2,3),('a','b','c');

的结果为

column1column2Column3
123
abc

去重策略

去重策略有两种,一种是默认策略ALL,代表不去重;另一种是DISTINCT,代表去重。table_comms_ease表中value列的值相同,使用ALL和DISTINCT分别查询value列时,命令和结果如下:

ALL命令

SELECT ALL * FROM table_comms_ease;

结果为

value
new value
new value

DISTINCT命令

SELECT DISTINCT value FROM table_comms_ease;

结果为

value
new value

可以看出在有重复结果时,ALL策略会保留所有结果,而DISTINCT策略只保留其中一个

表名或者子查询语句

查询语句的FROM关键字后面可以跟表名或者子查询语句,用于限制查询范围。当填写表名时,可以填写多个表名,用逗号或者连接运算符分隔。当填写查询语句时,可以视为先查询出一张表,再从此表中查询出数据。
注意:多个表的列信息要相同!!

假设还有一张表table_comms_ease_1,列信息和table_comms_ease表相同,值为

idvalue
1value of 1 in table_comms_ease_1
2value of 2 in table_comms_ease_1

则此字段填写table_comms_ease,table_comms_ease_1时得到如下命令

SELECT * FROM table_comms_ease, table_comms_ease_1;

结果为

table_comms_ease.idtable_comms_ease.valuetable_comms_ease_1.idtable_comms_ease_id.value
5new value1value of 1 in table_comms_ease_1
5new value2value of 2 in table_comms_ease_1
123new value1value of 1 in table_comms_ease_1
123new value2value of 2 in table_comms_ease_1

当此字段填写两个子查询语句,如一个是id为5,另一个是id为123时,则得到如下命令

SELECT * FROM (SELECT * FROM table_comms_ease WHERE iD=5), (SELECT * FROM table_comms_ease WHERE iD=123);

结果为

table_comms_ease.idtable_comms_ease.valuetable_comms_ease.idtable_comms_ease.value\
5new value123new value

将子查询语句的结果视为一张表,则可以统一对两种填写格式的理解。另外查询命令也支持混合填写表名和查询语句。

排序条件

排序条件决定了结果的排列顺序,常用格式如下

ORDER BY 列名 COLLATE 比较方式 排序方式 NULL值的排序方式

比较方式有三种,分别为 BINARY, NOCASE和RTRIM

  1. BINARY:使用标准C库中的memcmp()函数逐字节比较
  2. NOCASE:先把ASC II码中的大写字母转为小写字母,再按照BINARY方式比较
  3. RTRIM:去掉末尾空格后按照BINARY方式比较

通过下面命令为表table_comms_ease添加几条数据,

INSERT INTO table_comms_ease VALUES (6, 'A'), (7, 'new value '), (8, 'Z');

则表中的数据变为

idvalue
5new value
6A
7new value
8Z
123new value

注意:id为7的一行对应的value的末尾有一个空格

如下示例展示了三种不同比较方式的区别

BINARY命令

SELECT * FROM table_comms_ease ORDER BY table_comms_ease.value COLLATE BINARY;

结果:

idvalue
6A
8Z
5new value
123new value
7new value

NOCASE命令

SELECT * FROM table_comms_ease ORDER BY table_comms_ease.value COLLATE NOCASE;

结果:

idvalue
6A
5new value
123new value
7new value
8Z

RTRIM命令

SELECT * FROM table_comms_ease ORDER BY table_comms_ease.value COLLATE RTRIM;

结果:

idvalue
6A
8Z
5new value
7new value
123new value

数量限制

数量限制语句可以限制查询结果的行数,常用格式如下

LIMIT 数量 OFFET 偏移量

设数量为n,偏移量为o,则上面格式的意义是从第o+1条开始,取最多n条数据,如果没有符合条件的数据,则结果为空。

限制数量为3,得到如下表达式

SELECT * FROM table_comms_ease LIMIT 3;

结果为

idvalue
5new value
6A
7new value

由于表的总行数是5,所以如果限制数量≥5,则会查出整张表。

如果限制数量为3,同时指定偏移量为1,得到如下表达式

SELECT * FROM table_comms_ease LIMIT 3 OFFSET 1;

结果过滤掉第一条数据(5, new value),并向后取3条,得到

idvalue
6A
7new value
8Z

如果限制数量为3,同时指定偏移量为3,得到如下表达式

SELECT * FROM table_comms_ease LIMIT 3 OFFSET 3;

结果过滤掉前三条数据,并向后取3条,但是后面只有2条,所以得到

idvalue
8Z
123new value

如果偏移量≥5,则什么都查不到

SQLite常见限制

类别限制备注
字符串长度1亿由宏SQLITE_MAX_LENGTH定义,可以提高或降低限制,最大到231-1
单行最大字节数1亿由宏SQLITE_MAX_LENGTH定义
最大列数2000由宏SQLITE_MAX_COLUMN定义,可以提高或降低限制,最大到32767
语句最大长度10亿由宏SQLITE_MAX_SQL_LENGTH定义,可以降低限制
连接中最大表数64不可改变
表达式树的最大深度1000由宏SQLITE_MAX_EXPR_DEPTH定义,可以降低或消除限制
函数的最大参数数100由宏SQLITE_MAX_FUNCTION_ARG定义,可以提高,最大到 127
复合 SELECT 语句中的SELECT数500由宏SQLITE_MAX_COMPOUND_SELECT定义,可以降低
库文件最大页数1073741823由宏SQLITE_MAX_PAGE_COUNT定义,可以提高或降低限制,最大到4294967294。
最大数据库大小281TB结合最大页数4294967294和最大页面大小65536,得到最大数据库大小为281TB,但是这是个理论值,未经官方验证过。
表中的最大行数2^64无法达到,会先达到281TB的数据库大小限制

数据库中的B树

B树与B+树简介

B树是一种平衡多路查找树,每个结点包含三个部分:键,值,指向子结点的指针。
假设一个B树结点中有n个键,则它同时有n个值。如果这是一个叶子结点,则它没有指向子结点的指针,否则有n+1个指向子结点的指针。下图为n==2时的结点情况。
在这里插入图片描述
在这里插入图片描述

图中键1和键2两个值需要满足键1<键2。 值1和值2分别与键1和键2对应;三个指向子结点的指针,分别指向具有不同范围的键的子结点。子结点1中的键都小于键1;子结点2中的键都大于键1,且小于键2;子结点3中的键都大于键2。如下图提供了一个3路B树的示例。

上图中每个结点有三排,第一排是键;第二排是值;第三排是指向子结点的指针。根节点有50和100两个键,因此它的左子树中结点的键都小于50;中子树中结点的键都大于50且小于100;右子树中结点的键都大于100。

B+树和B树类似,但是B+树的内部结点中只有键和指向子结点的指针,而叶子结点具有键、值和指向下一组值的指针,即只在叶子结点上存储数据。因此父结点中的键还会再出现在子结点上。而且B+树的叶子结点的指向下一组值的指针,将所有值都串成了一个链表。由于内部结点不需要存储值,B+树可以存储更多的键。下图用5路B+树存储了上面3路B树的内容。
在这里插入图片描述

B树页
数据库文件由一页或多页组成。同一个数据库中,每页的大小相同,都是 在512 和 65536 之间,并且为2的整数次幂。数据库的页分为锁定字节(lock-byte)页、freelist页、B树页、负载溢出页和指针映射页。

B树算法为SQLite提供了键值存储模式,而且保证了键的有序性和唯一性。SQLite数据库中B树的结点就是一个页面,所以指向的子结点的指针实际上是对应页面的页码。SQLite数据库使用了两种B树变体,在叶子节点存储数据的表B树和不存储数据的索引B树。一颗完整的树只能是完全的表B树或者完全的索引B树。

表B树和索引B树
表B树类似B+树,只将值存放在叶子结点中;索引B树是一颗没有值的树,键就是数据本身,因此索引B树其实类似于B树。下表列出了它们之间的一些差异。

对比项表B树索引B树
键长度(byte)8最长2147483647的随机值
值存放点叶子结点没有值,键就是数据
值长度最长2147483647没有值,键就是数据
叶子结点结构键和值
主要使用场景rowid表索引、WITHOUT_ROWID表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1024137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的健身房管理系统设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

ASEMI代理瑞萨R7S721021VCFP#AA0芯片介绍

编辑-Z 型号&#xff1a;R7S721021VCFP#AA0 特性&#xff1a; 指令缓存大小&#xff1a;32 KB 数据缓存大小*2:32 KB TLB条目&#xff1a;128个条目 Jazelle架构扩展&#xff1a;完整 采用NEON技术的媒体处理引擎&#xff1a;包括在内 FPU&#xff1a;包括 PTM接口&am…

gpt扣款失败,openai扣款失败无法使用-如何解决gpt扣款失败的问题?

gpt扣款失败&#xff0c;openai扣款失败无法使用。毕竟你花了钱却无法使用你所期待的服务&#xff0c;这种情况确实令人不快。但是&#xff0c; 为什么gpt扣款失败&#xff1f; 可能是由于支付问题导致的扣款失败。这包括信用卡额度不足、支付信息错误等等。如果你的支付信息…

RocketMQ高性能核心原理与源码架构剖析(上)

这⼀部分主要是理解 RocketMQ ⼀些重要的⾼性能核⼼设计。我们知道&#xff0c;在 MQ 这个领域&#xff0c; RocketMQ 实际上是属于⼀个后起之秀。RocketMQ 除了能够⽀撑 MQ 的业务功能之外&#xff0c;还有更重要的⼀部分就是对于⾼吞吐、⾼性能、⾼可⽤的三⾼架构设计。这些设…

【Stm32】【Lin通信协议】Lin通信点亮灯实验

Lin通信点亮灯实验 通过STM32的串口发送数据&#xff0c;然后通过串口转换模块将数据转换成LIN&#xff08;Local Interconnect Network&#xff09;协议&#xff0c;最终控制点亮灯。需要工程和入门资料的可以私信我&#xff0c;看到了马上回。 入门书本推荐&#xff1a; 一…

spring boot 3 + spring cloud sleuth 无法注入Tracer问题

1.背景&#xff1a; 由于升级springboot版本到3.1.0后&#xff0c;导致原先的plumelog的traceId获取方式失败。 Autowiredprivate Tracer tracer; 项目启动报错&#xff0c;无法找到tracer bean实例。 2.解决&#xff1a; 前往spring cloud sleuth官网&#xff0c;发现此项…

Python入门自学进阶-Web框架——41、初步了解Celery 分布式队列、识堡垒机、自动发布、配置管理系统

Celery是一个基于Python开发的分布式异步消息任务队列&#xff0c;可以轻松的实现任务的异步处理 实例场景: 对100台机器执行一条批量命令&#xff0c;可能会花很长时间 &#xff0c;但不想让你的程序等着结果返回&#xff0c;而是给你返回 一个任务ID,经过一段时间只需要拿着…

adb操作及常用命令

问题&#xff1a;no devices/emulators found&#xff1a;adb devices 没有连接的设备 解决方案&#xff1a; 大概率是因为usb调试功能没有打开&#xff0c;可以查看手机设备是否开启usb调试功能 Android若未开启&#xff0c;可通过设置-关于手机&#xff0c;连续点击版本号7…

以矩阵的形式,对点或线段或多边形绕固定点旋转方法

一、仅旋转 &#xff0c;其中x,y旋转前横纵坐标&#xff0c;x’,y’为旋转后横纵坐标。θ旋转角度&#xff0c;单位为弧度。 等价于&#xff1a;x’ xcosθysinθ&#xff0c;y’-xsinθycosθ 注&#xff1a;此矩阵仅为旋转矩阵&#xff0c;不包含平移和缩放。 二、旋转平…

【IDEA】解决使用Terminal窗口按ESC键无法退出Vi的问题

背景 我们经常在IDEA中使用Terminal终端操作命令行&#xff0c;一般来说没问题&#xff0c;但使用与vi有关的命令时&#xff0c;需要按ESC键退出编辑&#xff0c;但在IDEA中会跳到编辑窗口&#xff0c;造成这个问题的原因是与IDEA的快捷键有关。 打开Setting设置 在左上角搜…

Spring Boot2.7生成用于登录的图片验证码

先在 pom.xml 注入依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version> </dependency>然后 需要在配置文件中声明一下DefaultKaptcha 的 bean对象 然后 我们…

[NPUCTF2020]ReadlezPHP 反序列化简单反序列

题目还是挺简单的 看代码 访问一下 一看就是反序列化 看看执行主要是 echo $b($a) 那就是$b是命令 $a是参数 这里还要fuzz一下 因为system不能执行 所以我们可以使用其他命令执行 函数 例如 assert 我们看看如何构造 public $a;public $b;public function __construct(){…

Android12之强弱智能指针sp/wp循环引用死锁问题(一百六十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

使用香橙派学习 Linux的守护进程

Q&#xff1a;什么是守护进程 A&#xff1a;Linux Daemon&#xff08;守护进程&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行 某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个…

MacOS如何降级旧版本?macOS降级,从 Ventura 13.0至Monterey 12

MacOS系统卡怎么办❓降级安装详细教程来了&#x1f495;&#xff0c;超详细的MacOS系统降级教程 如何使用Time Machine Backup&#xff08;时间机器备份&#xff09;降级macOS 如果您有备份&#xff0c;则此方法适合您。否则&#xff0c;您可以尝试下面提到的其他方法。 1.将…

Mybatis深度解析:从起源到现代应用的全景视角

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

web自动化测试 —— cypress测试框架

一、cypress简介 基于 JavaScript 的前端测试工具可以对浏览器中运行的任何内容进行快速、简单、可靠的测试对每一步操作都支持回看覆盖了测试金字塔模型的所有测试类型【界面测试&#xff0c;集成测试&#xff0c;单元测试】底层协议不采用 WebDriver > Cypress官网&#…

Apache shenyu,Java 微服务网关的首选

微服务网关的产生背景 当我们系统复杂度越来越高&#xff0c;团队协作效率越来越低时&#xff0c;我们通常会想到通过"拆分"来应对&#xff0c;这是典型的"化繁为简&#xff0c;分而治之"的思想。在落地过程中&#xff0c;我们通常会引入"SOA"或…

uqrcode+uni-app 微信小程序生成二维码

使用微信小程序需要弹出动态二维码的需求&#xff0c;从插件市场选了一个下载次数较多的组件引入到项目中uqrcode&#xff0c;使用步骤如下&#xff1a; 1、从插件市场下载 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287&#xff0c;若你是跟我一样是用uni-…

用PHP异步协程控制python爬虫脚本,实现多协程分布式爬取

背景 公司需要爬取指定网站的产品数据。但是个人对python的多进程和协程不是特别熟悉。所以&#xff0c;想通过php异步协程&#xff0c;发起爬取url请求控制python爬虫脚本&#xff0c;达到分布式爬取的效果。 准备 1.准备一个mongodb数据库用于存放爬取数据2.引入flask包&a…