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

嵌入式学习笔记DAY35(数据库)

一、数据库简介

1. 概念

       数据库是一个软件,在所提供的功能上它类似于文件,可以把数据存储进去,但是和文件不一样的是,它可以对数据进行管理和操作(例如:增删改查等),一般数据库是配合服务器使用的。

2. 工具

      此处,我们使用的是sqlite3;

      在PC端,还有mysql,sqlsever等软件;

下面是一张表,一行数据就被称为一条记录,一条记录由若干列组成;

列在数据库中被称为——字段;

能够存储多张表的就称为库;

               

3. 类别

数据库被分为关系型数据库和非关系型数据库

关系型数据库:表和表之间是有关系的,可以认为数据是由行和列组成的

关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

典型的——SQL   (struct query language  结构化查询语言)

SQL就类似于命令,更复杂一些,只要你是关系型数据库,就支持结构化查询语言。

SQL再细分:

    ddl  data defination language 建表
    dml 新增 修改 删除一行 data modifty 
    dql 查询 data query language    查询  select 

非关系型数据库:可以认为是把数据传到onenet云上去使用的

非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。

 4. 相关术语

  • 分类

        大型    ORACLE

        中型     MYSQL/MSSQL

        小型     SQLITE   DBLL   powdb

  • 名词

         DB          数据库 select update database

         DBMS     数据库管理系统(对数据进行增删改查操作的控制台)

         MIS         管理信息系统  (与数据库搭配起来的一些相关的管理系统)

         OA           办公自动化

  • 嵌入式数据库

         sqlite3   

5. sqlite3

特点:

  • 开源  C语言开发(效率比较快)
  • 代码量少 1万行左右,总大小10M以内
  • 绿色软件无需安装
  • 文件型数据库,可以移动。
  • 数据容量最大 2T   

 sqlite3的安装:

  • 在线安装 :

             sudo apt-get install sqlite3 
             sudo apt-get install libsqlite3-dev
   

             gcc test.c -lsqlite3 -lpthread

  • 验证是否安装成功:

             sqlite3 --version
             sqlite3 --help

  • sqlite3的使用:

            启动sqlite3 
            sqlite3 xxx.db  ===> 用sqlite3 来打开一个名称为test.db的本地数据库。

           出现如下提示符:表明数据库管理系统启动。
           sqlite> 

           退出数据库: 
            .q 命令

注意:如果一直出现如下符号:
...>   
则写';'结束。

 

 6. 创建和删除数据库

  创建一个数据库:

  •  touch  xxx.db
  • sqlite3 xxx.db

系统维护命令:===> .help
    出现所有相关的系统维护命令,都是以 "."开头。
    .database  列出当前库和系统中那个文件在关联
    .tables    列出当期数据库中的所有表
    .schema xxx 列出当前指定的xxx表结构
    .dump user   ===>导出数据库
    重定向:
        sqlite3 test.db .dump > 123.sql
        sqlite3 xxx.db < test.sql ===>导入数据库

  标准SQL语句:===》通用语法在其他平台可以直接使用。struct query language;
  注意:所有的sql语句都以';'结尾。

创建一个表:ddl
    create table  表名(表字段1,表字段2,......);
    eg: create table user(id,name,age);         //默认是字符串类型
    注意:以上表的表字段,支持如下数据类型 ==>   int  text  real  blob
    默认是text类型。

    create table 表名 (表字段 类型,表字段 类型,......);
    eg:    create table user(id int  ,name char,age int);

删除一个表:
    drop table  表名;
    eg:drop table user;

 7. 基本操作——增删改查

向表中增加数据:
    insert into 表名 (字段名称 ) values (值名称);
    eg:   insert into user (id,age) values (1,10);
            insert into user values(3,"wang",11);
            insert into user (age) values (12);

查询表中的数据:
   select 列名 from 表名  条件;
   eg: select * from user ;     //* 表示打印出表中所有的内容
            select id from user;

            

不仅可以查询单纯的列,还能进一步去运算,添加条件 :

  • 数字类型,c语言里的所有运算方式都适用

            

            

  • 模糊查找——查找其中个别的字符

        会列出含有这个字的内容

  • where name   like '三一'      条件子句
  • like 针对字符串
  • %通配符(可以放在任意位置,表示0~任意多个字符)

       

  • 如果只想张字后面接一个字符的话,使用通配符_

      

  • 如果想把两个条件结合在一起,用and  or 连接,相当于&&和||
  • order  by  排序
  • desc   默认升序
  • 如果两个条件都要出现  先where再order by    语法规定

      

      

  • limit 比如说数据比较海量 我想限制前多少条

      

注意三个语法的顺序 (如果它们要出现在同一个语句里),先where再order by 再 limit

修改表中数据:
   update 表名 set 表字段 = 值  满足条件:
   eg: update user set id = 1 where name = 'li';
            update user set id = 1 where name = "li" and passwd = "123";
            update user set id = 2 where name = "li" or  name = "zhao";
            

 删除表中数据:
   delete from 表名  满足条件:
   eg: delete from user ;         ///删除表中所有数据
            delete from user where id  = 1;          ///删除id=1 的数据;
            delete from user where id =1 and name = "zhang";
            delete from user where id = 1 or id  = 2;

自动增长列:

    sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime);                                                          主键 

        

数据库里的NULL啥都没有 与c语言的还有一些区别

会报错 唯一性失败 与主键的特性违背了——唯一性

所以yao

  插入时间列  int int;
    unicode
    CREATE TABLE user1(id int,name char,age int,dt datetime);'2022-07-01 19:00:00'
    insert into user1 values (2,'张三',23,datetime('now','+8 hours'));

    

    

    

 8. 维护命令

  • 数据的导出

       sqlite3 xxx.db .dump > xxx.sql    //将数据库名称为xxx的数据库整体导出到脚本(文件)中。

       eg:sqlite3 test.b .dump > 1.sql

  • 数据的导入

       sqlite3 xxx.db < xxx.sql     // < 输入重定向

       eg:sqlite3 1.db < 1.sql       //1.sql导入到1.db中

  • 可视化工具

     

二、数据库手册查询

  • 头文件:#include <sqlite3.h>
  • 编译: gcc -lsqlite3
  • 编译框架:打开数据库 ==》读写数据库(增,删,改,查) ==》关闭数据库
  • sqlite3_open函数(打开数据库)

            函数原型:int sqlite3_open(char * path,sqlite3 ** db);
            功能:打开指定path路径+文件名称的数据库,并将
                       打开的地址指向db变量的句柄。
            参数:path 要打开的数据库路径+名称
                       db  要打开的数据库地址指针
            返回值:成功  0;失败  -1

  • sqlite3_close函数(关闭数据库)

            函数原型:int sqlite3_close(sqlite3 *db);
            功能:关闭指定的数据库
            参数:要关闭的数据库地址
            返回值:成功  0;失败  -1

  • sqlite3_exec函数(增删改查操作)

           函数原型:int sqlite3_exec(sqlite3 *db,char *sql,callback fun,void * arg,char ** errmsg);
           功能:在db数据库上执行sql 非查询语句,并将结果返回;
           参数:db 要执行sql的数据库
                      sql  要执行的非查询sql语句。
                      fun  如果该函数要执行查询语句,则该回调函数用来回收查询的结果。
                      arg  回调函数的参数,如果没有回调函数则该参数为NULL;
                      errmsg  执行过程中的错误信息。
            返回值:执行成功  0;失败  非0 

  • fun函数

            函数原型:int fun(void *arg ,int f_num,char ** f_value,char ** f_name)
            功能:该函数用于sqlite3_exec执行select语句的结果集返回数据。
            参数:arg 由sqlite3_exec传入的参数
                       f_num 执行该命令所返回测结果集的字段个数。
                       f_value 查询结果集中的字段的值。
                       f_name  查询结果集中的字段的名称。
             返回值:成功 0;失败 非0
             注意:该回调函数必须有返回值,否则可能导致查询异常。

  • show函数+sqlite3_exec函数(查找操作)

             show函数为回调函数,调用次数与结果集有关;

             在sqlite3_exec函数内部调用show函数;

  • 插入操作 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
int main(int argc,char **argv)
{
    sqlite3* db = NULL;
    int ret  = sqlite3_open("./test.db", &db);
    if(SQLITE_OK != ret)
    {
        fprintf(stderr,"open %s\n",sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }
    char * errmsg;//指针接返回结果
    char sql_cmd[] = "insert into user values(6,'lisi',20);";
    ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);
    if(SQLITE_OK != ret)
    {
        fprintf(stderr,"exec sql:[%s]  errmsg:%s\n",sql_cmd,errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }
    sqlite3_close(db);
    return 0;
}
 

  • 查找操作

 

#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int show(void* arg, int col, char** result, char** title)
{
  int i = 0;
  static int flag = 0;
  if (0 == flag)
    {
        flag =1;
      for (i = 0; i < col; i++)
        {
          printf("%s\t", title[i]);
        }
      printf("\n");
    }

  for (i = 0; i < col; i++)
    {
      printf("%s\t", result[i]);
    }
  printf("\n");
  return 0;
}

int main(int argc, char** argv)
{
  sqlite3* db = NULL;
  int ret = sqlite3_open("./test.db", &db);
  if (SQLITE_OK != ret)
    {
      fprintf(stderr, "open %s\n", sqlite3_errmsg(db));
      sqlite3_close(db);
      return 1;
    }

  char* errmsg;
  char sql_cmd[] = " select * from user;";
  ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg);
  if (SQLITE_OK != ret)
    {
      fprintf(stderr, "exec sql:[%s]  errmsg:%s\n", sql_cmd, errmsg);
      sqlite3_free(errmsg);
      sqlite3_close(db);
      return 1;
    }

  sqlite3_close(db);

  // system("pause");
  return 0;
}

相关文章:

  • 龙虎榜——20250610
  • 算法题(166):占卜DIY
  • Zustand 状态管理库:极简而强大的解决方案
  • 城市照明深夜全亮太浪费?智能分时调光方案落地贵州某市
  • 精读 2025 《可信数据空间标准体系建设指南》【附全文阅读】
  • ​​扩散模型调度器(Scheduler)
  • MySQL事务——博主总结
  • pycharm最近遇到的一些问题
  • 理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
  • rapidocr v3.1.0发布
  • HDFS 3.4.1 集成Kerberos 实现账户认证
  • 6月10日星期二今日早报简报微语报早读
  • 用纯.NET开发并制作一个智能桌面机器人(五):使用.NET为树莓派开发Wifi配网功能
  • Unit 2 训练你的第一个深度强化学习智能体 LunarLander-v3
  • 慢接口优化万能公式-适合所有系统
  • 1.2 git使用
  • SIP协议之NACK(Negative Acknowledgement)
  • LLMs 系列实操科普(3)
  • 智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
  • 业财融合怎么做?如何把握业务与财务的边界?
  • 淘宝如何建网站/百度推广账号登陆入口
  • 陕西住房建设部网站/南宁seo主管
  • 网站流量一般多少合适/seo关键词排名优化手机
  • 做代购有哪些网站有哪些/香港旺道旺国际集团
  • 网站如何做排名优化/国际域名注册网站
  • 厦门网站建设哪家好厦门最好的网站建设/seo工具下载