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

嵌入式学习之系统编程(十三)数据库

目录

一、数据库概述

1、分类

2、名词

(1)DB 数据库 select update database

(2)DBMS 数据库管理系统

(3)MIS     管理信息系统

(4)OA      办公自动化

二、嵌入式数据库—sqlite3    

(一)概述

1、优点

2、安装与使用

(1)在线安装命令

(2)验证是否安装成功

(3)启动sqlite3 

(二)sqlite命令

(三)标准SQL语句

1、创建表

2、删除表

3、插入数据

4、查询表中数据

(1)筛选条件

(2)like(针对字符串)

(3)通配符(% _)(模糊查找)

(4)模糊查找

(5)两个条件用or and

(6)where语句

(7)order by语句(排序)

(8)limit语句(数据量大时可使用)

5、修改表中数据

6、删除表中数据(一删就是一条)       

7、自动增长列

主键

8、插入时间列

datetime函数

(三)数据库的导出导入(命令行shell命令)

1、数据的导出

2、数据的导入

3、可视化工具(sqlitebrowser )

(1)安装命令

(2)shell命令

(3)按键

三、数据库手册查询

四、sqlite3数据库编程

1、需要的头文件

2、编译过程

3、编程框架

 4、sqlite3_open函数(打开数据库)

5、sqlite3_close函数(关闭数据库)

6、sqlite3_exec函数(增删改操作)

fun函数

代码示例(插入操作)

7、show函数+sqlite3_exec函数(查找操作)

代码示例(查找操作)


一、数据库概述

1、分类

        大型            中型                     小型
 ORACLE   MYSQL/MSSQL   SQLITE  DBII powdb

    SQL  struct query language(结构化查询语言) 关系型数据库    

    非关系型数据库 如:芒果db

2、名词

(1)DB 数据库 select update database
(2)DBMS 数据库管理系统
(3)MIS     管理信息系统
(4)OA      办公自动化

二、嵌入式数据库—sqlite3    

(一)概述

1、优点

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

2、安装与使用

(1)在线安装命令

sudo apt-get install sqlite3 //安装数据库
sudo apt-get install libsqlite3-dev//安装数据库软件安装包

注:调用数据库编译命令:gcc test.c -lsqlite3

(2)验证是否安装成功

sqlite3 --version
sqlite3 --help

(3)启动sqlite3 

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

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

注:sqlite> 表示进入控制台

可在 sqlite> 后执行SQL语句(C语言中也可写)(增删改查操作)

也可在 sqlite> 后执行sqlite命令(以“.”开头的命令)(只能在控制台写入)。

(二)sqlite命令

出现所有相关的系统维护命令,都是以 "."开头。

.help  查询命令

.database  列出当前库和系统中哪个文件在关联
.tables    列出当期数据库中的所有表
.schema xxx 列出当前指定的xxx表结构
.dump user   ===>导出数据库

.exit  退出到shell命令终端

.headers on||off  显示表头

.quit  退出
重定向
sqlite3 test.db .dump > 123.sql
sqlite3 xxx.db < test.sql ===>导入数据库

(三)标准SQL语句

struct query language; 通用语法在其他平台可以直接使用。

注意:所有的sql语句都以';'结尾

1、创建表

create table  表名(表字段1,表字段2,...);

create table关键字进入控制台不区分大小;

表名符合C语言标识符规则;

列名用纯英文;

eg:create table user(id,name,age); 

create table 表名 (表字段 类型,表字段 类型,...);

类型:

char(短文本) int text(长文本) real(C中的float和double类型)

blob(二进制数据(如照片、文件路径))

eg:create table user(id int  ,name char,age int);

ctrl c//退出                ctrl d//保存表

2、删除表

drop table  表名;
eg:drop table user;

3、插入数据

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);

4、查询表中数据

 select 列名 from 表名  条件;
   eg:select * from user ;//表中所有数据都刷出来
           select id from user;
           select id,name from user where not  age <30(筛选条件);

注:列也可进行相关数学操作(eg:select id+age,name from user;)

(1)筛选条件

        age < > = != == num(数字类型支持C中的数字运算符)

(2)like(针对字符串)

eg:select * from user where name like 'zhangsan';

        select * from user where name = 'zhangsan';

(3)通配符(% _)(模糊查找)

注:通配符可放在任意位置;

%:可代表0-任意多个的任意字符;

_:代表一个任意字符(只能是一个)

(4)模糊查找

eg:select * from user where name like 'zhang%';//查找姓张的人员(名字长度不定)

        select * from user where name like 'zhang_';//查找张X

(5)两个条件用or and

        两个条件之间用and or连接,相当于&&和||,但&&  ||不可出现

(6)where语句

条件子句,后接筛选条件

(7)order by语句(排序)

注:如果where语句与order by语句都要出现,order by语句只能放在where语句后面(语法要求)

eg:select * from user order by age;//默认升序排序

        select * from user order by age;//逆序排序(降序)

(8)limit语句(数据量大时可使用)

eg:select * from user limit 10;//表中存储的前10项

注:3种语句同时出现有顺序要求:where——>order by——>limit

5、修改表中数据

 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";

6、删除表中数据(一删就是一条)       

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;

7、自动增长列

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

eg:create table user2(id INTEGER PRIMARY KEY ASC,name char);

主键

主键是向某一列设置的不能重复,select查时用主键搜索速度快;

eg :insert into user2 values(10,"zhangsan");//从10开始增长

      insert into user2 values(NULL,"lisi");//建议第一次就写NULL

8、插入时间列

CREATE TABLE user1(id int,name char,age int,dt datetime);

eg:insert into user1 values (2,'张三',23,‘2025-6-10 14:26’);

datetime函数

eg:select datetime('now');

        insert into user1 values (2,'张三',23,datetime('now','+8 hours'));

(三)数据库的导出导入(命令行shell命令)

1、数据的导出

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

                                                  把已有数据库导出为标准sql(数据备份)

                                                > 输出重定向

eg : sqlite3 test.db .dump > 1.sql //test.db导出到1.sql

2、数据的导入

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

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

3、可视化工具(sqlitebrowser )

(1)安装命令

sudo apt-get install sqlitebrowser 

(2)shell命令

sqlitebrowser teat.db//(进入图形界面看数据库中的数据)

(3)按键

浏览数据

增加数据

删除数据

保存

还原

写入SQL语句

三、数据库手册查询

1、在线查询:www.sqlite.org(官网)

2、离线查询(文档所在处):note/sec4_sqlite/01sqlite3/sqlite-doc-3080403文档

-Documentation

--SQLite Programming Interfaces//编程接口

---C/C++ API Reference//函数参考

---SQLite In 5 Minutes Or Less//相关代码示例参考

---SQL_Syntax//语法相关查询

四、sqlite3数据库编程

1、需要的头文件

#include<sqlite3.h>

2、编译过程

gcc后加-lsqlite3

3、编程框架

打开数据库 ==》读写数据库(增,删,改,查) ==》关闭数据库

 4、sqlite3_open函数(打开数据库)

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

5、sqlite3_close函数(关闭数据库)

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

6、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
注意:该回调函数必须有返回值,否则可能导致查询异常。

代码示例(插入操作)

#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;
}

7、show函数+sqlite3_exec函数(查找操作)

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

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

代码示例(查找操作)

#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;
}

相关文章:

  • Python模拟滑块验证码轨迹的深度实践指南
  • Leetcode 3576. Transform Array to All Equal Elements
  • 从DVD租赁小店到流媒体巨擘:Netflix传奇之路
  • 【面向对象】1. 原型与原型链的概念
  • RNN做中文分词
  • HTML实现的2048游戏
  • 【JVM】- 垃圾回收
  • C++学习-入门到精通【17】自定义的模板化数据结构
  • 亚马逊云科技 Amazon Pinpoint 解决方案:构建智能全渠道互动平台,重塑用户增长体验
  • Leetcode 3577. Count the Number of Computer Unlocking Permutations
  • 特殊工业镜头百科
  • Java单列模式总结及实现
  • 高考志愿填报,如何查询高校历年录取分数线?
  • 哈希表与unordered_set和unordered_map的实现
  • ESP8266自动浇水系统
  • 寄存器被改写问题总结
  • 408第一季 - 数据结构 - 折半查找与二叉排序树
  • 校园导航系统核心技术解析:高精度定位与 AR 实景导航的应用实践
  • 【Pandas】pandas DataFrame isna
  • 多光谱图像技术在苗期作物与杂草识别中的研究进展
  • python做软件的网站/seo优化排名怎么做
  • 做挂件的网站/搜索大全引擎入口
  • 对网站做综合搜索引擎优化分析/自媒体平台app下载
  • 2022年新闻热点事件/关键词优化推广公司排名
  • 免费psd模板网站/关键词排名优化公司外包
  • wordpress网站响应速度插件/游戏推广文案