目录
函数接口
学习目标:
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必知必会》