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

相关推荐
余槐i4 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹4 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo4 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人5 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
遇印记5 小时前
传输层,网络层
运维·服务器·网络·windows·学习
clorinda6 小时前
PyQt5学习:从界面搭建到与机器学习实战
学习
美狐美颜SDK开放平台6 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
花间相见8 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见8 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
欣欣之王来了8 小时前
Vue3项目脚手架:Vite vs Vue CLI怎么选?
前端·学习·架构·项目·vue3教程