当前位置: 首页 > 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.dtcms.com/a/357927.html

相关文章:

  • 【电力电子】MCP602运算放大器测交流电压(120VAC/230VAC),带直流偏置2.5V,比例:133.5:1
  • 【杂谈】-混沌理论能否赋予机器差异化思考能力?
  • 华为 HarmonyOS 代表未来
  • 初学者如何学习项目管理
  • Citrix 零日漏洞自五月起遭积极利用
  • 爱普生L3255打印机故障记录
  • Pregel 与 LangGraph:从分布式图计算到现代 AI 智能体的架构演进与 API 深度解析
  • 多教师语言感知知识蒸馏:提升多语种语音情绪识别的新方法
  • 区块链存证技术:如何让电子证据成为“铁证
  • HarmonyOS应用的多Module设计机制:构建灵活高效的应用程序
  • IPv6过渡技术6VPE
  • Kotlin Android 水印功能实现指南:使用 Watermark 库
  • java agent 字节码增强demo实现,无修改增强服务
  • 从零开始的python学习——注释与运算符
  • Codeforces Round 1033 (Div. 2) and CodeNite 2025 vp补题
  • Oracle 数据库性能调优:从瓶颈诊断到精准优化之道
  • DeepSeek应用技巧-通过MCP打造数据分析助手
  • 现代 Linux 发行版为何忽略Shell脚本的SUID位?
  • 深入 MySQL SELECT 查询
  • windows 谷歌浏览器把英文改成中文
  • 面试 八股文 经典题目 - Mysql部分(一)
  • 数据结构--栈(Stack) 队列(Queue)
  • 从单机到分布式:Python 爬虫架构演进
  • kmp 算法
  • 【MLLM】多模态理解Ovis2.5模型架构和训练流程
  • 模式组合应用-组合模式
  • 加速智能经济发展:如何助力“人工智能+”战略在实时视频领域的落地
  • 时间轴组件开发:实现灵活的时间范围选择
  • More Effective C++ 条款17: 考虑使用缓式评估(Consider Using Lazy Evaluation)
  • centos7.9的openssh漏洞修复脚本