C语言/Sqlite3数据库

目录

学习内容:

数据库简介

数据库的分类

相关名词

sqlite3特点:

数据库中各种单位的关系

数据库语言的划分

软件安装

库的使用

编程使用

函数接

学习产出:


学习目标:

1.了解数据库的类型

2.学会使用数据库的增删查改操作

3.通过C语言实现数据库的增删查改操作


学习内容:

数据库简介

数据库的分类

按数据关系分类

关系型数据库;SQL struct query language

非关系型数据库:芒果db

按功能强弱分类

大型数据库:ORACLE

中型数据库: MYSQL(支持linux和window)/MSSQL(只支持window)

小型数据库:SQLITE

注意:以上举例均为关系型数据库

相关名词

DB 数据库 select update database

DBMS 数据库管理系统

MIS 管理信息系统

OA 办公自动化

sqlite3特点:

1、开源 C语言开发

2、代码量少 1万行左右,总大小10M以内

3、绿色软件无需安装

4、文件型数据库,可以移动。

5、数据容量最大 2T

数据库中各种单位的关系

sql 复制代码
库
{
    表
    {
        字段,字段,字段;//记录
        字段,字段,字段;//记录
    }
    表
    {
        字段,字段,字段;//记录
        字段,字段,字段;//记录
        字段,字段,字段;//记录
    }
}

以上为方便理解的表达,并非规范形式 。字段是数据库中的最小单位,若干字段组成一条记录,若干记录组成一张表格,若干表格组成一个数据库。

数据库语言的划分

ddl 建表语言

data defination language 建表

dml

新增 修改 删除一行 data modifty

dq

查询 data query language 查询 select

软件安装

cpp 复制代码
sudo apt-get install sqlite3 //sqlite3管理工具
sudo apt-get install libsqlite3-dev//sqlite3开发库
sudo apt-get install sqlitebrowser //可视化工具
sqlite3 --version//查看sqlite3版本信息
whereis sqlite3//查看可执行文件位置

库的使用

1、库的打开

cpp 复制代码
sqlite3 test.db  

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

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

2、库的创建

cpp 复制代码
touch  xxx.db//或 sqlite3 xxx.db

3、输入输出

cpp 复制代码
sqlite3 xxx.db .dump > xxx.sql//将数据库名称为xxx的数据库整体导出到脚本中。
sqlite3 xxx.db < xxx.sql//将脚本名称为xxx的数据库整体导入到数据库中

4、创建表格

cpp 复制代码
create table user(id int  ,name char,age int);//创建一个user表

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

5、插入数据

cpp 复制代码
 insert into user (id,age) values (1,10);
 insert into user values(3,"wang",11);
 insert into user (age) values ( 12);

insert into 表名 (字段名称 ) values (值名称);

6、查询数据

cpp 复制代码
  select * from user ;//查询user表的所有信息
  select id from user;/查询user表的id信息
  select id,name from user where age <30//查询user表中年龄小于30岁的ID,name信息 

select 列名 from 表名 where从句:条件;

7、修改数据

cpp 复制代码
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";

update 表名 set 表字段 = 值 满足条件:

8、删除数据

cpp 复制代码
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;

delete from 表名 满足条件:

9、删除表格

cpp 复制代码
drop table user;//删除user表   

drop table 表名;

10、约束主键

cpp 复制代码
CREATE TABLE users (
    id INTEGER PRIMARY KEY,//使用PRIMARY KEY约束将其设置为主键
    username TEXT NOT NULL//使用NOT NULL约束确保它不能为空。
);

11、自动增长列

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

插入时间列 int int;

unicode

cpp 复制代码
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'));

12、help命令

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

13、库的结束

cpp 复制代码
.q//退出sqlite3

编程使用

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

函数接口

打开数据库
sqlite3_open

函数原型:int sqlite3_open(char * path,sqlite3 ** db);

功能:打开指定path路径+文件名称的数据库,并将打开的地址指向db变量的句柄。

参数:path 要打开的数据库路径+名称;

db 要打开的数据库地址指针

返回值:成功 0;失败 -1;

操作数据库
sqlite3_get_table()

函数原型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;

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

注意:该回调函数必须有返回值,否则可能导致查询异常。

关闭数据库
sqlite3_close

函数原型:int sqlite3_close(sqlite3 *db);

功能:关闭指定的数据库

参数:要关闭的数据库地址

返回值:成功 0失败 -1;


学习产出:

字典查询

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>
//#define DEBUG
int show(void*arg ,int col ,char**result ,char**title)
{

    *(int*)arg = 1;
    return 0;
}
int main(int argc, char *argv[])
{
    sqlite3* db;
    int ret = sqlite3_open("aaa.db",&db);
    if(SQLITE_OK != ret)
    {
        fprintf(stderr,"open db error:%s\n",sqlite3_errmsg(db));
        sqlite3_close(db); 
        return  1;
    }


    char * errmsg;
    int flag = 0;
    char sql_cmd[256]={0};

    strcpy(sql_cmd,"CREATE TABLE if not exists dict(id INTEGER PRIMARY KEY ASC, word char , mean text);");
    ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);
    if(SQLITE_OK != ret)
    {
        fprintf(stderr,"exec sqlcmd cmd  %s error: %s\n",sql_cmd,errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db); 
        return  1;
    }

    bzero(sql_cmd,sizeof(sql_cmd));
    strcpy(sql_cmd,"delete from dict");
     ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);// (void*)0
    if(SQLITE_OK != ret)
    {
        fprintf(stderr,"exec sqlcmd cmd  %s error: %s\n",sql_cmd,errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db); 
        return  1;
    }

    FILE* fp = fopen("/home/linux/dict.txt","r");
    if(NULL == fp)
    {
        perror("fopen");
        exit(1);
    }

    while(1)
    {
        char buf[512]={0};
        
        if(NULL == fgets(buf,sizeof(buf),fp))
            break;
        char* word = strtok(buf," ");
        char * mean =strtok(NULL,"\r");
        bzero(sql_cmd,sizeof(sql_cmd));
        sprintf(sql_cmd,"insert into dict values(NULL,\"%s\",\"%s\");",word,mean);
        ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);// (void*)0
        if(SQLITE_OK != ret)
        {
            fprintf(stderr,"exec sqlcmd cmd  %s error: %s\n",sql_cmd,errmsg);
            sqlite3_free(errmsg);
            sqlite3_close(db); 
            return  1;
        }
    }
    sqlite3_close(db);
    return 0;
}

注:本博客仅供学习和参考;参考资料《mysql必知必会》

相关推荐
LKID体4 分钟前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
刘大浪29 分钟前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
A.A呐29 分钟前
【Linux第一章】Linux介绍与指令
linux
Gui林30 分钟前
【GL004】Linux
linux
ö Constancy34 分钟前
Linux 使用gdb调试core文件
linux·c语言·vim
lb363636363635 分钟前
介绍一下strncmp(c基础)
c语言·知识点
tang_vincent35 分钟前
linux下的spi开发与框架源码分析
linux
无敌岩雀36 分钟前
MySQL中的索引
数据库·mysql
xiaozhiwise39 分钟前
Linux ASLR
linux
wellnw39 分钟前
[linux] linux c实现共享内存读写操作
linux·c语言