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

一、数据库基础认知

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;
}
相关推荐
q行2 小时前
java学习日志--内部类
java·学习·内部类
淡忘_cx2 小时前
Ubuntu 24 飞牛虚拟机 ens2 网卡自动获取 IP(DHCP)配置文档
linux·tcp/ip·ubuntu
好奇龙猫2 小时前
【AI学习-comfyUI学习-第二十九节-instantID+IP加载器预工作流-各个部分学习】
人工智能·学习
TDengine (老段)2 小时前
TDengine 客户端负载均衡与 failover
大数据·数据库·负载均衡·时序数据库·tdengine·涛思数据
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之split命令(实操篇)
linux·运维·服务器·网络·笔记
西敏寺的乐章2 小时前
ZooKeeper 系统学习总结
分布式·学习·zookeeper
d111111111d2 小时前
STM32定时器中断配置详解:以TIM2为例
笔记·stm32·单片机·嵌入式硬件·学习
musk12122 小时前
在 Win11 PowerShell 中通过 SSH 密钥实现无密码访问 Linux 服务器,公钥使用 方法2 手动复制
linux·ssh·win11
松涛和鸣2 小时前
42、SQLite3 :字典入库与数据查询
linux·前端·网络·数据库·udp·sqlite