嵌入式学习笔记DAY35(数据库)
一、数据库简介
1. 概念
数据库是一个软件,在所提供的功能上它类似于文件,可以把数据存储进去,但是和文件不一样的是,它可以对数据进行管理和操作(例如:增删改查等),一般数据库是配合服务器使用的。
2. 工具
此处,我们使用的是sqlite3;
在PC端,还有mysql,sqlsever等软件;
下面是一张表,一行数据就被称为一条记录,一条记录由若干列组成;
列在数据库中被称为——字段;
能够存储多张表的就称为库;
3. 类别
数据库被分为关系型数据库和非关系型数据库
关系型数据库:表和表之间是有关系的,可以认为数据是由行和列组成的
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
典型的——SQL (struct query language 结构化查询语言)
SQL就类似于命令,更复杂一些,只要你是关系型数据库,就支持结构化查询语言。
SQL再细分:
ddl data defination language 建表
dml 新增 修改 删除一行 data modifty
dql 查询 data query language 查询 select
非关系型数据库:可以认为是把数据传到onenet云上去使用的
非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
4. 相关术语
- 分类
大型 ORACLE
中型 MYSQL/MSSQL
小型 SQLITE DBLL powdb
- 名词
DB 数据库 select update database
DBMS 数据库管理系统(对数据进行增删改查操作的控制台)
MIS 管理信息系统 (与数据库搭配起来的一些相关的管理系统)
OA 办公自动化
- 嵌入式数据库
sqlite3
5. sqlite3
特点:
- 开源 C语言开发(效率比较快)
- 代码量少 1万行左右,总大小10M以内
- 绿色软件无需安装
- 文件型数据库,可以移动。
- 数据容量最大 2T
sqlite3的安装:
- 在线安装 :
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
gcc test.c -lsqlite3 -lpthread
- 验证是否安装成功:
sqlite3 --version
sqlite3 --help
- sqlite3的使用:
启动sqlite3
sqlite3 xxx.db ===> 用sqlite3 来打开一个名称为test.db的本地数据库。
出现如下提示符:表明数据库管理系统启动。
sqlite>
退出数据库:
.q 命令
注意:如果一直出现如下符号:
...>
则写';'结束。
6. 创建和删除数据库
创建一个数据库:
- touch xxx.db
- sqlite3 xxx.db
系统维护命令:===> .help
出现所有相关的系统维护命令,都是以 "."开头。
.database 列出当前库和系统中那个文件在关联
.tables 列出当期数据库中的所有表
.schema xxx 列出当前指定的xxx表结构
.dump user ===>导出数据库
重定向:
sqlite3 test.db .dump > 123.sql
sqlite3 xxx.db < test.sql ===>导入数据库
标准SQL语句:===》通用语法在其他平台可以直接使用。struct query language;
注意:所有的sql语句都以';'结尾。
创建一个表:ddl
create table 表名(表字段1,表字段2,......);
eg: create table user(id,name,age); //默认是字符串类型
注意:以上表的表字段,支持如下数据类型 ==> int text real blob
默认是text类型。
create table 表名 (表字段 类型,表字段 类型,......);
eg: create table user(id int ,name char,age int);删除一个表:
drop table 表名;
eg:drop table user;
7. 基本操作——增删改查
向表中增加数据:
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);
查询表中的数据:
select 列名 from 表名 条件;
eg: select * from user ; //* 表示打印出表中所有的内容
select id from user;
不仅可以查询单纯的列,还能进一步去运算,添加条件 :
- 数字类型,c语言里的所有运算方式都适用
- 模糊查找——查找其中个别的字符
会列出含有这个字的内容
- where name like '三一' 条件子句
- like 针对字符串
- %通配符(可以放在任意位置,表示0~任意多个字符)
- 如果只想张字后面接一个字符的话,使用通配符_
- 如果想把两个条件结合在一起,用and or 连接,相当于&&和||
- order by 排序
- desc 默认升序
- 如果两个条件都要出现 先where再order by 语法规定
- limit 比如说数据比较海量 我想限制前多少条
注意三个语法的顺序 (如果它们要出现在同一个语句里),先where再order by 再 limit
修改表中数据:
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";
删除表中数据:
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;
自动增长列:
sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime); 主键
数据库里的NULL啥都没有 与c语言的还有一些区别
会报错 唯一性失败 与主键的特性违背了——唯一性
所以yao
插入时间列 int int;
unicode
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'));
8. 维护命令
- 数据的导出
sqlite3 xxx.db .dump > xxx.sql //将数据库名称为xxx的数据库整体导出到脚本(文件)中。
eg:sqlite3 test.b .dump > 1.sql
- 数据的导入
sqlite3 xxx.db < xxx.sql // < 输入重定向
eg:sqlite3 1.db < 1.sql //1.sql导入到1.db中
- 可视化工具
二、数据库手册查询
- 头文件:#include <sqlite3.h>
- 编译: gcc -lsqlite3
- 编译框架:打开数据库 ==》读写数据库(增,删,改,查) ==》关闭数据库
- sqlite3_open函数(打开数据库)
函数原型:int sqlite3_open(char * path,sqlite3 ** db);
功能:打开指定path路径+文件名称的数据库,并将
打开的地址指向db变量的句柄。
参数:path 要打开的数据库路径+名称
db 要打开的数据库地址指针
返回值:成功 0;失败 -1
- sqlite3_close函数(关闭数据库)
函数原型:int sqlite3_close(sqlite3 *db);
功能:关闭指定的数据库
参数:要关闭的数据库地址
返回值:成功 0;失败 -1
- 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
注意:该回调函数必须有返回值,否则可能导致查询异常。
- show函数+sqlite3_exec函数(查找操作)
show函数为回调函数,调用次数与结果集有关;
在sqlite3_exec函数内部调用show函数;
-
插入操作
#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;
}
-
查找操作
#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;
}