学习嵌入式第四十一天

数据库

一、概览

  • 涵盖内容:数据库基础概念、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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值