当前位置: 首页 > news >正文

学习嵌入式第四十一天

文章目录

  • 数据库
    • 一、概览
    • 二、基础概念
    • 三、常用数据库(举例)
    • 四、SQLite CLI(命令行)基础
    • 五、SQL 基本操作(CRUD)(以创建学生信息表为例)
      • 1. 创建表(Create)
      • 2. 插入(Insert)
      • 3. 删除(Delete)
      • 4. 更新(Update)
      • 5. 查询(Select)
    • 六、补充技巧与细节
    • 七、SQLite C 接口(编程)
    • 八、编译与依赖
    • 附:常用示例命令
  • 习题

数据库

一、概览

  • 涵盖内容:数据库基础概念、SQLite3 常用命令与 SQL 增删改查(CRUD)、SQLite C 语言接口使用示例、工具与编译注意事项、以及课堂项目(学生管理、词典导入、天气查询等)。

二、基础概念

  • 数据库(Database):将数据集合化并存放,便于管理与查询。
  • 数据库管理系统(DBMS):软件,负责数据存储、管理与访问;相关角色包括数据库管理员、数据库应用软件、操作系统。
  • 关系型数据库(RDBMS):以表格(类似 Excel)组织数据,常用字段示例:姓名、性别、年龄、分数。
  • 非关系型数据库(NoSQL):如 JSON 格式的键值对(key = value)。

三、常用数据库(举例)

  • SQL Server、Oracle、SQLite(轻量级、单文件数据库)等。

四、SQLite CLI(命令行)基础

常见命令:

sqlite3 stu.db    -- 打开/创建数据库文件
.tables            -- 列出表
.schema            -- 查看表结构
.headers on         -- 显示查询列名
.mode column        -- 以列对齐模式显示查询结果
.quit / .exit       -- 退出
.help               -- 帮助

注意:SQL 语句必须以分号 ; 结尾。


五、SQL 基本操作(CRUD)(以创建学生信息表为例)

1. 创建表(Create)

CREATE TABLE stu (name TEXT,sex TEXT,age INTEGER,score REAL,PRIMARY KEY(name)  -- 示例主键
);
-- 或者:
CREATE TABLE stu1 (name TEXT, sex TEXT, age INT, score REAL);

说明PRIMARY KEY 用于唯一标识记录;如果希望实现自增长,字段类型应写为 INTEGER PRIMARY KEY

2. 插入(Insert)

-- 插入整行
INSERT INTO stu VALUES ("tom","male",19,99.5);
-- 插入部分列
INSERT INTO stu (name, sex) VALUES ("jack","male");

3. 删除(Delete)

-- 删除记录
DELETE FROM 表名 WHERE 条件;
-- 删除表
DROP TABLE 表名;

4. 更新(Update)

-- 添加字段
ALTER TABLE stu ADD COLUMN sno;
-- 修改数据
UPDATE stu SET sno=110 WHERE name="tom";

5. 查询(Select)

SELECT * FROM stu;                      -- 显示所有列
SELECT name FROM stu WHERE score>80;    -- 查询部分字段
SELECT * FROM stu WHERE age IN (18,19);
SELECT * FROM stu WHERE age>18 AND score>80;
SELECT * FROM stu WHERE name LIKE "%tom%";  -- 模糊匹配
SELECT * FROM user WHERE id<10 ORDER BY id LIMIT 2;
SELECT * FROM user WHERE age BETWEEN 19 AND 20;

常用关键字:IN, AND, OR, BETWEEN ... AND ..., LIKE, ORDER BY, LIMIT


六、补充技巧与细节

  • 时间列插入:可使用 datetime('now','+8 hours')(UTC 调整为 +8 小时)。
CREATE TABLE user1 (id INT, name CHAR, age INT, dt DATETIME);
INSERT INTO user1 VALUES (2, '张三', 23, datetime('now','+8 hours'));
  • 自动增长列:必须把字段类型写为 INTEGER PRIMARY KEY 才能实现自动增长,例如:
CREATE TABLE user3 (id INTEGER PRIMARY KEY ASC, name CHAR, age INT, dt DATETIME);
INSERT INTO user3 (NULL, '李四', 23, datetime('now'));
  • ASC 表示升序,DESC 表示降序。

七、SQLite C 接口(编程)

主要函数:

  • int sqlite3_open(const char *filename, sqlite3 **ppDb);

    • 打开数据库文件并返回 sqlite3* 句柄。成功返回 SQLITE_OK
  • int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *arg, char **errmsg);

    • 执行 SQL 语句;若结果集不为空,会调用回调函数处理每一行。

    • callback 函数原型:

      int callback(void *para, int n_column, char **column_value, char **column_name);
      
    • errmsg 可用于接收错误信息(执行失败时)。

  • int sqlite3_close(sqlite3 *db);

    • 关闭数据库并释放资源。

回调函数用于接收每一行的列值与列名,以字符串数组形式传入。


八、编译与依赖

  • 在 Linux 下安装开发包:
sudo apt-get install libsqlite3-dev
  • 编译示例:
gcc test_sqlite3.c -lsqlite3

附:常用示例命令

-- 打开数据库
sqlite3 stu.db-- 查看表与结构
.tables
.schema stu-- 查询并以列样式显示
.headers on
.mode column
SELECT * FROM stu;-- 创建示例
CREATE TABLE stu1 (name TEXT, sex TEXT, age INT, score REAL);-- 插入示例
INSERT INTO stu VALUES ("tom","male",19,99.5);-- 更新示例
ALTER TABLE stu ADD COLUMN sno;
UPDATE stu SET sno=110 WHERE name="tom";-- 删除示例
DELETE FROM stu WHERE name="tom";
DROP TABLE stu;

习题

读取一个包含单词原型和释义的文件,将其信息录入表中

代码实现:

#include<stdio.h>
#include<string.h>
#include<sqlite3.h>
#include<fcntl.h>
#include<unistd.h>int main(void){FILE* fd;fd = fopen("dict.txt","r");if(fd == NULL){printf("fopen fail\n");return -1;}sqlite3 *db = NULL;int ret = sqlite3_open("word.db",&db);if(ret != SQLITE_OK){printf("sqlite3_open fail");return -1;}sqlite3_exec(db,"create table word(id INTEGER PRIMARY KEY ASC,word,meaning);",NULL,NULL,NULL);char buf[1024];char word[64] = {0};char meaning[512] = {0};char *p = NULL;while(fgets(buf,sizeof(buf),fd) != NULL){buf[strlen(buf)-1] = '\0';p = strchr(buf,' ');int len = p - buf;strncpy(word,buf,len);word[len] = '\0';while(*p == ' '){p++;}strcpy(meaning,p);meaning[strlen(meaning)-1] = '\0';char sql[2048] = {0};sprintf(sql,"insert into word values(NULL,\"%s\",\"%s\");",word,meaning);char *errmsg = NULL;ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("sqlite3_exec fail :%s\n",errmsg);return -1;}}sqlite3_close(db);return 0;
}
http://www.xdnf.cn/news/1401895.html

相关文章:

  • nestjs连接oracle
  • WIFI模块-USB-UART-SDIO
  • Manus AI 与多语言手写识别技术全解析
  • U-Boot移植过程中的关键目录文件解析
  • fastdds qos:LifespanQosPolicy
  • 【C++】类和对象(终章)
  • 第二十六天-待机唤醒实验
  • 信息系统架构
  • v-model ,在 vue3和 vue2中的区别
  • Linux(1)|入门的开始:Linux基本指令
  • 认识Redis
  • IDM手机端,速度能提高6倍!
  • CPU的MBR寄存器和MDR寄存器
  • 联合体和枚举——嵌入式学习笔记
  • Linux IO复用
  • 优选算法:二分查找
  • 数据库攻略:“CMU 15-445”Project0:C++ Primer(2024 Fall)
  • 《Java反射与动态代理:从原理到实践》
  • SpringBoot整合Actuator实现健康检查
  • MIT 6.5840 (Spring, 2024) 通关指南——Lab 1: MapReduce
  • GitHub 热榜项目 - 日榜(2025-08-30)
  • 基于Ubuntu本地GitLab 搭建 Git 服务器
  • 解构机器学习:如何从零开始设计一个学习系统?
  • 【LeetCode】大厂面试算法真题回忆(121) —— 经典屏保
  • 并发编程——09 CountDownLatch源码分析
  • Spring Boot 后端接收多个文件的方法
  • 项目管理常用的方法有哪些
  • 三菱 PLC的中断指令/中断指针
  • 构建现代化的“历史上的今天“网站:从API到精美UI的全栈实践
  • 北方苍鹰优化算法优化的最小二乘支持向量机NGO-LSSVM多输入多输出回归预测【MATLAB】