嵌入式第四十三篇——数据库

一、数据库基础认知

1. 数据存储逻辑

数据库(库)→ 数据表(表):由行(记录)和列(字段)组成 → 记录(行):单条数据 → 字段(列):数据属性

2. 数据库分类(按规模)

规模 代表产品 类型
大型 ORACLE、DB2 关系型数据库
中型 MySQL、MS SQL Server 关系型数据库
小型 SQLite、powdb 关系型数据库

3. 核心名词解释

缩写 / 名词 全称 / 含义
DB Database(数据库):存储数据的集合,支持增删改查、统计等操作
DBMS Database Management System(数据库管理系统):管理数据库的软件
MIS Management Information System(管理信息系统):基于数据库的业务管理系统
OA Office Automation(办公自动化):基于数据库的办公流程系统

二、嵌入式数据库 SQLite3 核心特性

SQLite3 是专为嵌入式设备设计的轻量级关系型数据库,核心特点:

  1. 开源免费:遵循 GNU 协议,C 语言开发,可自由使用和修改;
  2. 轻量精简:核心代码仅约 1 万行,整体体积≤10M,资源占用极低;
  3. 免安装部署:绿色软件,无需配置服务,开箱即用;
  4. 文件型存储:整个数据库对应单个文件,可直接移动、备份;
  5. 容量上限:单库最大支持 2TB 数据,满足嵌入式场景海量数据存储需求;
  6. 官方地址:www.sqlite.orgwww.kernel.org(内核级支持)。

三、SQLite3 安装与编译(Linux 环境)

1. 安装依赖

复制代码
# 安装sqlite3客户端
sudo apt-get install sqlite3
# 安装开发库(编译C程序需要)
sudo apt-get install libsqlite3-dev

2. 编译 C 语言程序

复制代码
# 编译包含sqlite3的C代码(test.c为源码文件),-lsqlite3链接数据库库
gcc test.c -lsqlite3 -o sqlite_demo
# 运行程序
./sqlite_demo

四、SQLite3 常用终端指令

sqlite3 数据库文件.db进入终端后,可执行以下指令(指令无需分号结尾,SQL 语句需分号):

指令 功能说明
.database 查看当前数据库关联的物理文件
.table 列出数据库中所有数据表
.schema 显示表的创建语句(建表语法)
.q/.quit/.exit 退出 sqlite3 终端
.header on 查询时显示字段名(表头)

五、核心 SQL 语句(需分号结尾)

user表(id int, name char, age int)为例:

1. 表管理

复制代码
-- 创建表
create table user(id int, name char, age int);
-- 删除表
drop table user;

2. 数据操作(增删改查)

复制代码
-- 插入数据
insert into user values(3, "wang", 11);
-- 查询数据(年龄>20 或 <50)
select * from user where age>20 or age<50;
-- 修改数据(姓名为li的记录,id改为1)
update user set id = 1 where name = 'li';
-- 删除数据(id为1 或 2的记录)
delete from user where id = 1 or id = 2;

六、SQLite3 C 语言编程示例(核心流程)

1. 编程核心步骤

  1. 打开数据库:sqlite3_open
  2. 执行 SQL 语句:sqlite3_exec
  3. 关闭数据库:sqlite3_close

2. 完整示例代码

复制代码
#include <stdio.h>
#include <sqlite3.h>

int main(int argc, char** argv)
{
    // 1. 定义数据库句柄(核心对象)
    sqlite3* db = NULL;
    // 2. 打开数据库(不存在则自动创建123.db文件)
    int ret = sqlite3_open("123.db", &db);
    if (ret != SQLITE_OK)
    {
        // 打印错误信息
        fprintf(stderr, "打开数据库失败:%s\n", sqlite3_errmsg(db));
        sqlite3_close(db); // 失败也要关闭句柄
        return 1;
    }

    // 3. 定义要执行的SQL语句(插入数据)
    char* errmsg = NULL; // 存储执行错误信息
    char sql_cmd[512] = "insert into user values(6,'lvbu',31);";
    // 执行SQL语句(回调函数设为NULL,无返回数据处理)
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "执行SQL失败:%s\n", errmsg);
        sqlite3_free(errmsg); // 释放错误信息内存
        sqlite3_close(db);
        return 1;
    }

    // 4. 关闭数据库
    sqlite3_close(db);
    printf("数据插入成功!\n");
    return 0;
}
相关推荐
Harvey9038 分钟前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
lingggggaaaa16 分钟前
安全工具篇&动态绕过&DumpLsass凭据&Certutil下载&变异替换&打乱源头特征
学习·安全·web安全·免杀对抗
PP东26 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
学电子她就能回来吗28 分钟前
深度学习速成:损失函数与反向传播
人工智能·深度学习·学习·计算机视觉·github
Goat恶霸詹姆斯41 分钟前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草1 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程1 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
xiaowu0801 小时前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle
A星空1231 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c