嵌入式学习 day40:数据库

一、数据库概述

1.1 什么是数据库

数据库是对大批量数据进行增删改查管理的软件。它把数据持久化存储在文件中,程序结束后数据依然保留。

1.2 数据库分类

类型 特点 代表产品
关系型数据库 数据存在文件中,支持SQL Oracle、MySQL、SQLite
非关系型数据库 数据存在内存中(高速) Redis、MongoDB

二、SQLite基本命令

2.1 安装与进入

bash

复制代码
# 安装
sudo apt-get install sqlite3

# 进入数据库(自动创建文件)
sqlite3 test.db

# 查看所有表
.tables

# 查看表结构
.schema 表名

# 开启/关闭列名显示
.headers on/off

# 设置显示模式
.mode column

2.2 SQLite支持的数据类型

类型 说明
INTEGER 整型
REAL 浮点型
TEXT 文本字符串
BLOB 二进制大对象(图片、文件等)

三、SQL语句

3.1 创建表 : CREATE TABLE

sql

复制代码
CREATE TABLE 表名 (列名1 类型1, 列名2 类型2, ...);

sql

复制代码
CREATE TABLE student (
    id INTEGER,
    name TEXT,
    sex TEXT,
    age INTEGER,
    score INTEGER
);

3.2 插入数据 : INSERT

sql

复制代码
-- 插入完整数据
INSERT INTO student VALUES (1, '张三', '男', 18, 90);

-- 插入部分数据(未指定的字段为NULL)
INSERT INTO student (id, name, sex) VALUES (2, '李四', '女');

-- 插入多条
INSERT INTO student VALUES 
    (3, '王五', '男', 19, 85),
    (4, '赵六', '女', 20, 92);

3.3 查询数据 : SELECT

sql

复制代码
-- 查询所有列
SELECT * FROM student;

-- 查询指定列
SELECT name, score FROM student;

-- 条件查询(WHERE)
SELECT name, score FROM student WHERE score >= 90;

-- 模糊查询(LIKE,%匹配任意字符)
SELECT name FROM student WHERE name LIKE '张%';

-- 排序(ORDER BY)
SELECT name, score FROM student ORDER BY score DESC;  -- 降序
SELECT name, score FROM student ORDER BY score ASC;   -- 升序

-- 条件组合
SELECT name, score FROM student 
WHERE sex = '男' AND score >= 90;

3.4 更新数据 : UPDATE

sql

复制代码
UPDATE 表名 SET 列名 = 新值 WHERE 条件;

sql

复制代码
UPDATE student SET score = 95 WHERE name = '张三';

3.5 删除数据 : DELETE

sql

复制代码
DELETE FROM 表名 WHERE 条件;

sql

复制代码
DELETE FROM student WHERE name = '李四';

3.6 删除表 : DROP TABLE

sql

复制代码
DROP TABLE 表名;

sql

复制代码
DROP TABLE student;

四、SQLite C语言接口

4.1 sqlite3_open : 打开数据库

c

复制代码
int sqlite3_open(const char *filename, sqlite3 **ppDb);
参数 说明
filename 数据库文件名(如 "test.db"
ppDb 存放数据库句柄的指针

c

复制代码
sqlite3 *db;
int ret = sqlite3_open("test.db", &db);
if (ret != SQLITE_OK) {
    fprintf(stderr, "打开失败: %s\n", sqlite3_errmsg(db));
    return -1;
}

4.2 sqlite3_exec : 执行SQL语句

c

复制代码
int sqlite3_exec(
    sqlite3 *db,              // 数据库句柄
    const char *sql,          // SQL语句
    int (*callback)(void*, int, char**, char**),  // 回调函数(SELECT用)
    void *arg,                // 回调函数的参数
    char **errmsg             // 错误信息
);

非查询语句(CREATE、INSERT、UPDATE、DELETE)不需要回调:

c

复制代码
char *errmsg = NULL;
char *sql = "INSERT INTO student VALUES (1, '张三', '男', 18, 90)";
int ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
    fprintf(stderr, "执行失败: %s\n", errmsg);
    sqlite3_free(errmsg);
}

查询语句(SELECT)需要回调函数

c

复制代码
// 回调函数:每查到一行数据就调用一次
int callback(void *arg, int column_count, char **column_value, char **column_name)
{
    for (int i = 0; i < column_count; i++) {
        printf("%s = %s\n", column_name[i], column_value[i] ? column_value[i] : "NULL");
    }
    printf("---\n");
    return 0;  // 返回0继续查询,非0终止
}

char *sql = "SELECT * FROM student";
char *errmsg = NULL;
int ret = sqlite3_exec(db, sql, callback, NULL, &errmsg);
if (ret != SQLITE_OK) {
    fprintf(stderr, "查询失败: %s\n", errmsg);
    sqlite3_free(errmsg);
}

回调函数的参数

参数 含义
arg sqlite3_exec 的第四个参数
column_count 本次查询的列数
column_value 每列的值(字符串形式)
column_name 每列的列名

4.3 sqlite3_close : 关闭数据库

c

复制代码
int sqlite3_close(sqlite3 *db);

五、完整示例

c

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

int callback(void *arg, int col_count, char **col_value, char **col_name)
{
    for (int i = 0; i < col_count; i++) {
        printf("%s = %s\n", col_name[i], col_value[i] ? col_value[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(void)
{
    sqlite3 *db;
    char *errmsg = NULL;
    
    // 1. 打开数据库
    int ret = sqlite3_open("test.db", &db);
    if (ret != SQLITE_OK) {
        fprintf(stderr, "打开失败: %s\n", sqlite3_errmsg(db));
        return -1;
    }
    
    // 2. 创建表
    char *create_sql = "CREATE TABLE IF NOT EXISTS student ("
                       "id INTEGER, name TEXT, score INTEGER)";
    ret = sqlite3_exec(db, create_sql, NULL, NULL, &errmsg);
    if (ret != SQLITE_OK) {
        fprintf(stderr, "建表失败: %s\n", errmsg);
        sqlite3_free(errmsg);
    }
    
    // 3. 插入数据
    char *insert_sql = "INSERT INTO student VALUES (1, '张三', 90), (2, '李四', 85)";
    ret = sqlite3_exec(db, insert_sql, NULL, NULL, &errmsg);
    if (ret != SQLITE_OK) {
        fprintf(stderr, "插入失败: %s\n", errmsg);
        sqlite3_free(errmsg);
    }
    
    // 4. 查询数据
    char *select_sql = "SELECT * FROM student";
    ret = sqlite3_exec(db, select_sql, callback, NULL, &errmsg);
    if (ret != SQLITE_OK) {
        fprintf(stderr, "查询失败: %s\n", errmsg);
        sqlite3_free(errmsg);
    }
    
    // 5. 关闭数据库
    sqlite3_close(db);
    return 0;
}

编译时需链接 sqlite3 库:

bash

复制代码
gcc main.c -lsqlite3 -o app

六、今日总结

今天学了数据库基础SQLite,核心要点如下:

数据库分类

  1. 关系型(MySQL、SQLite):数据持久化,支持SQL

  2. 非关系型(Redis):内存存储,速度快

SQL语句

  1. CREATE TABLE 创建表

  2. INSERT INTO 插入数据

  3. SELECT ... WHERE 查询数据

  4. UPDATE ... SET ... WHERE 更新数据

  5. DELETE FROM ... WHERE 删除数据

  6. ORDER BY 排序(ASC升序/DESC降序)

  7. LIKE 模糊查询(%匹配任意字符)

SQLite C接口

  1. sqlite3_open() 打开数据库

  2. sqlite3_exec() 执行SQL语句(非查询无需回调,查询需回调函数)

  3. sqlite3_close() 关闭数据库

  4. 回调函数每查一行调用一次,返回0继续、非0终止

相关推荐
Aloudata1 小时前
语义层 vs MCP 工具层:Agent 调用数据时,语义应该放在哪一层
数据库·数据分析·chatbi·data agent·语义层
zcmodeltech1 小时前
源网荷储一体化沙盘模型多场景控制系统设计——基于STM32与Modbus RTU的源网荷储、多能互补、冷热电三联供全场景联动方案,服务范围覆盖全国
数据库·人工智能·stm32·单片机·嵌入式硬件
一条破秋裤1 小时前
17_ADC原理与转换模式
笔记·stm32·学习
数智启示录1 小时前
PostgreSQL 执行计划实战(第 9 篇):SQL 和索引没变,计划为什么突然慢一百倍
数据库·经验分享·sql·postgresql·面试
Gent_倪1 小时前
MySQL分库、分表、分区详解
数据库·mysql
额额额对了1 小时前
Linux 数据库开发实战:使用 C 语言与 SQLite3 构建轻量级终端词典
linux·数据库·oracle
传奇开心果编程2 小时前
【Rust入门知识点学与练】第5课:函数
开发语言·学习·rust
qq_246839752 小时前
postgresql xxhash64 哈希函数实现
数据库·postgresql·哈希算法
希望奇迹很安静2 小时前
等级保护测评
网络·数据库