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

days34:零基础学嵌入式之数据存储——数据库

一、数据存储

1.数据库文件与普通文件区别:


   (1)普通文件对数据管理(增删改查)效率低
   (2)数据库对数据管理效率高,使用方便
 

2.常用数据库:

(1)关系型数据库:
        将复杂的数据结构简化为二维表格形式
        大型:Oracle、DB2(IMB)
        中型:MySql(嵌入式、python)、SQLServer(微软,仅用于windows)
        小型:Sqlite(多用于物联网,跨移植能力好、支持c的都可数据存储);

    (2)非关系型数据库:
        以键值对存储,且结构不固定 //JSON、Redis、MongoDB

3.嵌入式数据库:sqlite3:

  stu.db
   (1)开源免费, c语言开发;
   (2)代码量少,1万行左右,总大小10M以内;
   (3)文件型数据库,可以移动;
   (4)数据容量最大2T(理论情况下);

二、数据库sqlite3(不区分大小写)

SQLite 教程 | 菜鸟教程

1.sqlite命令:

(1).help

 查看sqlite3支持的相关命令      
(2).quit
      退出sqlite3数据库
(3).tables
      查看数据库中的所有表      
(4).schema tablename
      查看tablename创建时的SQL语句(表的结构)     
(5).headers on/off
      开启关闭列名称    
(6).mode column 
      以左对齐列宽显示数据 
(7).width 第一列宽度 第二列宽度 第三列宽度 ...
      设置column模式显示下的每列的宽度

2.sqlite3存储类型

  • 还有其他亲和类型,查询上面网站具体查询

3.SQL语言:“增删改查”

(1)create table :创建表
      create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);   
      表不存在,则创建,存在不创建
      create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);

(2)insert into :插入表
      INSERT INTO 表名称 VALUES(值1, 值2,....)    

(3)select  查表 
      SELECT * FROM 表名称【查全部的】
      SELECT 列名称 FROM 表名称【查列的】
      SELECT 列名称1,列名称2,列名称3 FROM 表名称【查好几列】

(4)where:
      1)条件匹配
      SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
      
       运算符: “ >“ 、 ”=“ 、 ”<“ 、 ” !=“ 、 ”and”(&&) 、 “ or”(||)......
      
      2)模糊查询
      SELECT * FROM 表名称 WHERE 列名 like '%冬梅'; 
      SELECT * FROM 表名称 WHERE 列名 like '马%';
      SELECT * FROM 表名称 WHERE 列名 like '马__';
      
      百分号(%)代表零个、一个或多个数字或字符。
      下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。
     
      3)顺序显示
        selete * form 表名称 order by 列名 ASC;  //升序查询
        selete * form 表名称 order by 列名 DESC;  //降序查询
       select * from class1 order by score ASC; 升序查询
       select * from class1 order by score DESC;降序查询

(5)delete
      删除表中信息

      DELETE FROM 表名称 +条件;
      DELETE FROM 表名称 WHERE 列名称 = 值

(6)update
      改表中信息 
      UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值;
(7)datetime
      datetime('now', '+8 hours');
      select datetime('now', '+8 hours');
      查询当前东八区时间

(8)删除整个表

        drop table 表名;
(9)设置主键值自动增长列
        create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);

        insert into 表名称 values(NULL,“zhangsan”,类名称 数据类型, .......);

  •         必须是sqlite3的数据类型,不可是亲和型,也不可是字符型;
  • 后期插入的时候,整个主键值自动增长列为NULL;

4.sqlist3提供的C的接口

(1)1.sqlite3_open ===》XXX.db文件

        int sqlite3_open(
            const char *filename,   /* Database filename (UTF-8) */
            sqlite3 **ppDb          /* OUT: SQLite db handle */
        );

   功能:
            打开一个数据库文件获得操作数据库文件的句柄
            如果数据库存在,则打开;不存在,则创建
参数:
            filename:数据库文件路径 
            ppDb:存放句柄指针空间的首地址
返回值:
            成功返回SQLITE_OK

(2)sqlite3_exec

int sqlite3_exec(
            sqlite3* pDb,                                  /* An open database */
            const char *sql,                           /* SQL to be evaluated */
            int (*callback)(void*,int,char**,char**),  /* Callback function */
            void *arg,                                    /* 1st argument to callback */
            char **errmsg                              /* Error msg written here */
        );
 

1)功能:
            在数据库中执行SQL语句
2)参数:
            sqlite3*:数据库句柄 
            sql     :SQL语句字符串首地址
            callback:回调函数(只有select时使用)
            void *  :回调函数的传参(只有select时使用)
            char **errmsg:出错信息存放空间首地址
3)返回值:
            成功返回SQLITE_OK 0
        
4)回调函数类型:
        int fun(void* arg,int n_column,char** column_value,char** column_name);
        参数:
            arg         : sqlite3_exec传递的第四个参数
            n_column    :查询到数据的列数,查了几列
            column_value:查询结果每个字段的首地址集合;保存查询到的每行的每列的数据的指针数组;
            column_name :查询结果每个字段的字段名称首地址集合;查询道德每列名字的指针数组;
        
        注意: 
              1. select查询几行数据,回调函数就执行几次;
              2.回调函数必须要返回0,否则sqlite3_exec调用失败
              3.数据库中查出的数据均为字符串

     错误原因,回调函数没有给返回值;

   二级指针用法:

                1.被调函数中,修改主调函数的指针变量;

                        &p ——》cha**;

                2.指针数组作为参数传递的时候:数组里面保存了多个指针

                        char *a[5] :数组 ====》char **;

http://www.lryc.cn/news/603094.html

相关文章:

  • Sentinel 不同层面的流控保护
  • Java中实现定时任务执行的方式总结
  • 反欺诈系统:Oracle 到 ES 迁移实战
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博文章数据可视化分析-点赞区间实现
  • Java类加载机制详解
  • AI coding汇总持续更新
  • STM32启动流程
  • 【学习路线】Android开发2025:从入门到高级架构师
  • Unity_UI_NGUI_锚点组件
  • 【java面试day7】redis分布式锁
  • SpringBoot 发送邮件
  • 五自由度磁悬浮轴承转子不平衡质量的高性能控制策略全解析
  • 算法训练营day34 动态规划② 62.不同路径、63. 不同路径 II、343整数拆分、96.不同的二叉搜索树
  • Java响应式编程
  • ATF 运行时服务
  • ros2的package.xml和rosdep
  • 基于深度学习的医学图像分析:使用3D CNN实现肿瘤检测
  • 第十天:字符菱形
  • 一个Pycharm窗口添加多个项目来满足运行多个项目的需求
  • DDoS攻击防御:从5G到T级防护方案全对比
  • 企业级日志分析系统ELK
  • Python动态规划:从基础到高阶优化的全面指南(3)
  • 历史版本的vscode下载地址
  • 实验-静态路由
  • 智慧工地系统:科技赋能建筑新未来
  • 学习dify:一个开源的 LLM 应用开发平台
  • 【GitHub Workflows 基础(二)】深入理解 on、jobs、steps 的核心语法与执行逻辑
  • 【2025/07/28】GitHub 今日热门项目
  • 【iOS】类和分类的加载过程
  • LNMP架构+wordpress实现动静分离