SQLite3学习笔记2:SQL 基础语法

1. 创建 / 打开数据库

SQLite3 的数据库是单文件 存储,sqlite3命令后紧跟文件名即可实现 "不存在则创建、存在则打开",这是嵌入式场景的核心特性(无需配置服务,直接操作文件)。

打开终端,执行以下命令创建 / 打开名为embedded_db.db的数据库:

bash 复制代码
sqlite3 embedded_db.db

执行后终端会进入sqlite>提示符,说明已成功打开 / 创建该数据库文件。

SQLite3 仅执行sqlite3 embedded_db.db时不会立即创建空文件,只有执行CREATE TABLE等实际写入操作后才生成文件,这是 SQLite3 的延迟写入特性,能最大程度节省嵌入式设备的存储资源。

2. 创建 / 删除数据表

2.1 创建数据表

数据表是存储数据的核心载体,嵌入式场景中常用 "设备参数 / 传感器数据 / 日志" 等表,以下是贴合嵌入式的表结构设计。

表结构设计(嵌入式设备参数表device_params

字段名 类型 约束 嵌入式场景含义
id INTEGER PRIMARY KEY AUTOINCREMENT 自增主键(唯一标识每条记录,便于查询 / 修改)
param_name TEXT NOT NULL 参数名(如 temp / 湿度 / 电压,非空避免无效数据)
param_value REAL NOT NULL 参数值(REAL 支持浮点,适配传感器数据)
update_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP 更新时间戳(自动记录数据修改时间,便于溯源)

SQL 语法详解

sql 复制代码
-- 创建表的核心语法:CREATE TABLE IF NOT EXISTS 表名 (字段1 类型 约束, 字段2 类型 约束,...);
-- 关键语法点:
-- 1. IF NOT EXISTS:避免重复创建表报错(嵌入式程序重启时很重要)
-- 2. PRIMARY KEY:主键,保证记录唯一性
-- 3. AUTOINCREMENT:整数主键自增(嵌入式中无需手动维护ID)
-- 4. NOT NULL:字段不能为空,避免无效数据
-- 5. DEFAULT CURRENT_TIMESTAMP:默认值为当前时间,无需手动插入
CREATE TABLE IF NOT EXISTS device_params (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    param_name TEXT NOT NULL,
    param_value REAL NOT NULL,
    update_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

操作步骤

  1. sqlite>提示符下,输入上述完整的 CREATE TABLE 语句,执行后按回车。

  2. 验证表是否创建成功:执行以下命令查看数据库中的表列表:

sql 复制代码
.tables

输出包含device_params,证明表创建成功。

  1. 查看表结构(验证字段和约束):
sql 复制代码
PRAGMA table_info(device_params);

会输出表的字段列表、类型、约束等信息,可核对是否和设计一致。

sql 复制代码
0|id|INTEGER|0||1
1|param_name|TEXT|1||0
2|param_value|REAL|1||0
3|update_ts|TIMESTAMP|0|CURRENT_TIMESTAMP|0
2.2 删除数据表

删除数据表的核心 SQL 语法是DROP TABLE,嵌入式场景中必须掌握两个关键参数:

语法 作用 嵌入式场景价值
DROP TABLE 表名; 删除指定数据表(表不存在则报错) 仅调试场景用,嵌入式中易导致程序崩溃
DROP TABLE IF EXISTS 表名; 删除表(表不存在则无操作,不报错) 嵌入式首选,程序重启 / 初始化时避免报错

注意DROP TABLE永久删除表结构 + 所有数据,且嵌入式设备无回收站 / 日志回滚,数据删除后不可恢复(除非提前备份)。

场景 1:安全删除(推荐,嵌入式调试 / 初始化用)

IF EXISTS避免表不存在时报错,步骤如下:

sql 复制代码
-- 1. 打开数据库
sqlite3 embedded_db.db

-- 2. (可选)先查看当前所有表,确认要删除的表存在
sqlite> .tables
-- 输出:device_params(确认表名)

-- 3. 安全删除表(IF EXISTS是嵌入式核心)
sqlite> DROP TABLE IF EXISTS device_params;

-- 4. 验证删除结果
sqlite> .tables
-- 输出为空,说明表已删除

场景 2:普通删除(表不存在则报错,嵌入式禁止)

仅用于确认表一定存在的调试场景:

sql 复制代码
sqlite> DROP TABLE device_params;
-- 若表不存在,会报错:Error: no such table: device_params(嵌入式中会导致程序异常)

3. 插入(INSERT)+ 查询(SELECT)数据

3.1 插入数据(INSERT)

嵌入式场景中,INSERT 用于将传感器数据、设备电压 / 电流等参数写入数据库,以下是适配嵌入式的语法和操作。

INSERT 语法详解(两种方式,嵌入式优先选方式 1)

方式 语法 嵌入式场景优势
方式 1(指定字段) INSERT INTO 表名 (字段1, 字段2) VALUES (值1, 值2); 字段顺序变动时不报错,嵌入式程序迭代更健壮
方式 2(不指定字段) INSERT INTO 表名 VALUES (值1, 值2, 值3, 值4); 代码短,但依赖字段顺序,嵌入式中易出错,不推荐

关键注意点

  • param_name是 TEXT 类型,值必须用单引号包裹;
  • param_value是 REAL 类型(浮点),直接写数值即可;
  • id是自增主键、update_ts有默认时间戳,无需手动赋值(写 NULL 会自动填充)。

操作步骤(在sqlite>提示符下逐行执行)

  1. 执行方式 1 的 3 条插入语句(温度、湿度、电压):
sql 复制代码
INSERT INTO device_params (param_name, param_value) VALUES ('temp', 25.5);
INSERT INTO device_params (param_name, param_value) VALUES ('humidity', 60.2);
INSERT INTO device_params (param_name, param_value) VALUES ('voltage', 3.32);
  1. 执行方式 2 的 1 条插入语句(电流,仅作对比):
sql 复制代码
INSERT INTO device_params VALUES (NULL, 'current', 0.85, CURRENT_TIMESTAMP);
3.2 查询数据(SELECT)

SELECT 是嵌入式中读取数据的核心,支持 "全量查(调试)"、"指定字段查(省内存)"、"条件查(精准读)",完全适配嵌入式设备内存有限的特点。

SELECT 语法详解(3 种嵌入式常用场景)

场景 语法 嵌入式使用场景
全量查询 SELECT * FROM device_params; 开发调试阶段,查看所有数据
指定字段查询 SELECT param_name, param_value FROM device_params; 运行阶段,只读取需要的字段,减少内存占用
条件查询 SELECT param_value FROM device_params WHERE param_name = 'temp'; 精准读取某一个参数(如仅读温度),嵌入式最常用

操作步骤(在sqlite>提示符下执行)

  1. 全量查询(验证插入是否成功):
sql 复制代码
SELECT * FROM device_params;

输出如下:

sql 复制代码
1|temp|25.5|2026-01-26 10:15:46
2|humidity|60.2|2026-01-26 10:15:46
3|voltage|3.32|2026-01-26 10:15:46
4|current|0.85|2026-01-26 10:15:50
  1. 指定字段查询(模拟嵌入式运行时的轻量读取):
sql 复制代码
SELECT param_name, param_value FROM device_params;

输出如下:

sql 复制代码
temp|25.5
humidity|60.2
voltage|3.32
current|0.85
  1. 条件查询(精准读取温度值):
sql 复制代码
SELECT param_value FROM device_params WHERE param_name = 'temp';

输出如下:

sql 复制代码
25.5
  1. 拓展条件查询(读取值大于 10 的参数):
sql 复制代码
SELECT * FROM device_params WHERE param_value > 10;
复制代码
输出如下:
sql 复制代码
1|temp|25.5|2026-01-26 10:15:46
2|humidity|60.2|2026-01-26 10:15:46

4. 更新(UPDATE)+ 删除(DELETE)数据

4.1 更新数据(UPDATE

嵌入式场景中,UPDATE 用于实时更新传感器数据(比如温度从 25.5 变为 26.0)、校准参数等,核心是必须加 WHERE 条件,否则会更新全表数据。

UPDATE 语法详解(嵌入式必加 WHERE)

sql 复制代码
-- 核心语法:UPDATE 表名 SET 字段1=新值1, 字段2=新值2 WHERE 条件;
-- 关键注意点:
-- 1. WHERE条件:嵌入式中必须加,避免误改全表(比如只改temp的value,不改其他参数)
-- 2. 可同时更新多个字段:比如改value+手动更新时间戳
-- 3. 条件可基于param_name(嵌入式常用)或id

操作步骤(在sqlite>提示符下执行)

  1. 更新温度值(从 25.5→26.0,嵌入式场景:传感器新读数):
sql 复制代码
UPDATE device_params SET param_value = 26.0 WHERE param_name = 'temp';
  1. 验证更新结果(核对 temp 值):
sql 复制代码
SELECT param_value FROM device_params WHERE param_name = 'temp';

输出如下:

sql 复制代码
26.0
4.2 删除数据(DELETE)

嵌入式设备存储有限,DELETE 用于清理无效 / 过期参数(比如超过 7 天的日志),同样必须加 WHERE 条件,否则会删除全表数据。

DELETE 语法详解(嵌入式必加 WHERE)

sql 复制代码
-- 核心语法:DELETE FROM 表名 WHERE 条件;
-- 关键注意点:
-- 1. WHERE条件:嵌入式中绝对不能省略,否则全表数据被删
-- 2. 条件可基于param_name/id/时间戳(嵌入式常用按时间删)
-- 3. 嵌入式中删除后数据不可恢复,需谨慎

操作步骤(请在sqlite>提示符下执行)

  1. 删除 current 参数(模拟清理无用的电流数据):
sql 复制代码
DELETE FROM device_params WHERE param_name = 'current';
  1. 验证删除结果(全量查询,确认 current 记录消失):
sql 复制代码
SELECT * FROM device_params;

输出如下:

sql 复制代码
1|temp|26.0|2026-01-26 10:15:46
2|humidity|60.2|2026-01-26 10:15:46
3|voltage|3.32|2026-01-26 10:15:46
  1. 拓展:删除值小于 5 的参数(模拟清理无效的电压数据):
sql 复制代码
DELETE FROM device_params WHERE param_value < 5;
  1. 最终验证(全量查询,确认只剩 temp 和 humidity):
sql 复制代码
SELECT * FROM device_params;

输出如下:

sql 复制代码
1|temp|26.0|2026-01-26 10:15:46
2|humidity|60.2|2026-01-26 10:15:46
相关推荐
今儿敲了吗2 小时前
计算机网络第四章笔记(四)
笔记·计算机网络
子夜江寒2 小时前
OpenCV 学习:文档扫描与视频运动检测与跟踪
opencv·学习·计算机视觉·音视频
爱喝可乐的老王2 小时前
神经网络的学习
人工智能·神经网络·学习
Cathy Bryant2 小时前
softmax函数与logits
笔记·神经网络·机器学习·概率论·信息与通信
阿蒙Amon2 小时前
TypeScript学习-第2章:基础类型
javascript·学习·typescript
charlie1145141912 小时前
现代嵌入式 C++——自定义删除器(Custom Deleter)
开发语言·c++·笔记·学习·嵌入式
Wilber的技术分享2 小时前
【Transformer原理详解2】Decoder结构解析、Decoder-Only结构中的Decoder
人工智能·笔记·深度学习·llm·transformer
QiZhang | UESTC2 小时前
学习日记day70
学习
历程里程碑2 小时前
Linux 9:GCC编译全流程详解
linux·运维·服务器·c语言·笔记·编辑器·vim