嵌入式学习 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终止

相关推荐
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20163 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本3 天前
离散数学第六课
学习·离散数学
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备3 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远3 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
AI职业加油站3 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控