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

重头开始嵌入式第三十三天(数据库)

目录

数据库

数据库指令

数据库安装

sqlite3的使用

1.启动sqlite3 

2.标准SQL语句struct query language:

3.创建一个数据库

4.建表

5.删除一个表

6.向表中增加数据:

7.查询表中的数据   

8.修改表中数据 

9.删除表中数据

10.插入时间列 

11.自动增长列

12.维护命令

1、数据的导出:

2、数据的导入:

3、可视化工具安装:

数据库相关编程

3.1 打开数据库: sqlite3_open

3.2 关闭数据库: sqlite3_close

3.3 数据库操作:


数据库

数据库是一个按照数据结构来组织、存储和管理数据的仓库。

从存储角度来看,它可以将大量的数据有序地存储起来,方便进行数据的长期保存和随时访问。比如企业可以把客户信息、销售数据等存储在数据库中。

从管理角度来说,数据库提供了数据管理的功能,包括数据的插入、删除、修改和查询等操作。你可以根据特定的需求对数据库中的数据进行增删改查,以确保数据的准确性和完整性。

数据库还具有数据独立性,即数据的存储结构和逻辑结构可以独立变化,而不会影响应用程序对数据的访问。这样可以提高系统的可维护性和可扩展性。

常见的数据库有关系型数据库SQL struct query language(如 MySQL、Oracle 等)和非关系型数据库(如 MongoDB、Redis 等)。不同类型的数据库适用于不同的应用场景。还有sqlite3 mysql mssql sun solaris  gnu sun等

1、分类: 大型    中型     小型
 ORACLE   MYSQL/MSSQL   SQLITE  DBII powdb
     
2、名词:
DB 数据库 select update database
DBMS 数据库管理系统
MIS     管理信息系统
OA      办公自动化
3、嵌入式数据库:
sqlite3    www.sqlite.org  www.kernal.org
GNU   
特点:
  1、开源  C语言开发
  2、代码量少 1万行左右,总大小10M以内
  3、绿色软件无需安装
  4、文件型数据库,可以移动。
  5、数据容量最大 2T   

数据库指令


数据库的基本操作主要是:增删改查

sqlite3指令:

.databases

.exit

.headers on|off

.quit

.schema 表名

.tables 

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


数据库安装



sqlite3的安装: LTS long term support 
  1、在线安装 :
sudo apt-get install sqlite3 
sudo apt-get install libsqlite3-dev

编译时
gcc test.c -lsqlite3 -lpthread

2、验证是否安装成功:
sqlite3 --version
sqlite3 --help


sqlite3的使用

1.启动sqlite3 


sqlite3 xxx.db  
===>用sqlite3 来打开一个名称为test.db的本地数据库。
出现如下提示符:表明数据库管理系统启动。
sqlite> 
   退出数据库: 
    .q 命令
注意:如果一直出现如下符号:
...>   
则写';'结束。
以下所有命令必须在 sqlite> 后执行。


2.标准SQL语句struct query language:

===》通用语法在其他平台可以直接使用。;
注意:所有的sql语句都以';'结尾。
创建一个表:ddl
create table  表名(表字段1,表字段2,...);
eg: create table user(id,name,age);         char 
注意:以上表的表字段,支持如下数据类型。int text real blob
  默认是text类型。char
;

3.创建一个数据库


1、touch  xxx.db
2、sqlite3 xxx.db

4.建表


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


5.删除一个表


drop table  表名;
eg:drop table user;
 


6.向表中增加数据:


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


7.查询表中的数据
   

select 列名 from 表名  条件;
   eg:select * from user ;
       select id from user;
   select id,name from user where not  age <30
   where name   like '三一'   % _ 通配符
 select *from user  where age>20 or age<50 order by age desc limit 2 ;
条件语句如   && =》 and , || =》or,! =》not,== =》 like

通配符:* % _

8.修改表中数据
 

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

9.删除表中数据


   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;

10.插入时间列 

eg:
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'));

11.自动增长列

eg:

sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime);  主键 
sqlite> insert into user3 (NULL,'李四',23,datetime('now'));   

(void*)0 asc 
where (group by having) order by [desc] limit;
select * from user where id<10 order by id limit 2;  

12.维护命令

1、数据的导出:

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

2、数据的导入:

sqlite3 xxx.db < xxx.sql

3、可视化工具安装:

sudo apt-get install sqlitebrowser 

数据库相关编程

sqlite3 数据库编程接口:

1、需要的头文件
sqlite3.h

2、编译过程
-lsqlite3

3、编程框架:
打开数据库 ==》读写数据库(增,删,改,查) ==》关闭数据库


3.1 打开数据库: sqlite3_open


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


3.2 关闭数据库: sqlite3_close


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


3.3 数据库操作:


查询操作:sqlite3_get_table();  select 

int sqlite3_get_table(sqlite3 *db,char *sql,
char *** rest,int *nrow,int *ncol,
char ** errmsg);

功能:在db数据库上执行sql查询语句,并将执行的
  结果集返回到rest地址上,同时返回查询的行和列。
参数:db 要执行查询语句的数据库
      sql  要执行的select查询语句
  rest 查询的结果集是一个三级指针
  nrow 查询的结果的行数
  ncol 查询的结果的列数
  errmsg 如果执行有错误,则存储错误。
返回值:成功 0
失败 非0;

执行sql语句:sqlite3_exec();   insert delete update

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 ;

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 <sqlite3.h>
int show(void*arg,int col,char**result,char**title)
{
    static int flag = 0;
    int i = 0 ;
    if(0 == flag)
    {
        for(i = 0 ;i<col;i++)
        {
            printf("%s\t",title[i]);
        }
        printf("\n");
        flag = 1;
    }

    for(i = 0 ;i<col;i++)
    {
        printf("%s\t",result[i]);
    }
    printf("\n");
    return 0;
}
int main()
{
    sqlite3* db=NULL;
    int ret = sqlite3_open("/home/linux/20240812/sec4/aaa.db",&db);
    if(SQLITE_OK!=ret)
    {

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

        fprintf(stderr,"exec error,%s\n",errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }
    sqlite3_close(db);
    printf("Hello World!\n");
    return 0;
}


 


http://www.kler.cn/a/291807.html

相关文章:

  • Oracle OCP认证考试考点详解082系列19
  • 【MySQL】MySQL数据库入门:构建你的数据基石
  • 怎样在软件设计中选择使用GOF设计模式
  • 《C++设计模式:重塑游戏角色系统类结构的秘籍》
  • Excel SUMIFS
  • 使用win32com将ppt(x)文件转换为pdf文件
  • jmeter 梯度测试 如何查看TPS、RT指标
  • [SWPUCTF 2021 新生赛]crypto解题思路
  • Redis主从复制原理,设计的很巧妙
  • IP/TCP/UDP协议的关键知识点
  • 2024年高教社杯全国大学生数学建模竞赛B题思路(2024数学建模国赛B题思路)
  • adb remount Now reboot your device for settings to take effect
  • DS18B20温度传感器详解(STM32)
  • 鸿蒙OS试题(2)
  • 【#第三期实战营闯关作业##LMDeploy 量化部署进阶实践 】
  • MySQL 字符串操作详解和案例示范
  • vue ts as断言处理
  • 自定义 ConsoleAppender 实现日志预处理
  • tcp如何保证可靠性传输
  • 数据资产入表元年,企业如何抓住数据资产增值的机遇?
  • 核心交换机的六个基础知识
  • 智慧体育馆如何区别于传统场馆?
  • 选择高性能服务器租用的优势有哪些?
  • vulhub xxe靶机通关教程
  • 编译FFmpeg动态库
  • 深入Redis:事务的理解