嵌入式学习之系统编程(十三)数据库
目录
一、数据库概述
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;
}