目录
一、安装sqlite3数据库以及sqlite3函数库
sudo apt install sqlite3 //安装数据库
sudo apt install libsqlite3-dev //安装数据库的函数库
二、数据库的结构
数据库是一种存放数据的的文件,但是拥有特殊的结构
第一层结构:数据库本身
第二层结构:数据库中存放了若干张表单
每一张表单的字段结构各不相同
第三次结构:一张表单中,所有字段都能存放信息
一组字段中的所有数据,就是一条记录
三、常用数据库类型
1、sqlite3
一个允许部署在本地的轻量级数据库,特别合适嵌入式开发
2、mysql
一个部署在服务端的,需要网络连接的数据库。如果要部署在本地,夜需要安装一个mysql服务器。
适合一些应用层程序开发
四、sqlite3数据库的使用
1、打开数据库
输入指令:sqlite3 数据库名.db
2、sqlite3数据库中指令的使用
1)界面指令
以点“.”开头,回车确认输入
.table:查看当前数据库中所有表单的名字
.
.schema 表单名:查看当前数据库中指定的表单中的字段结构
若没有指定,则查看所有
.head(er) on 在查看表单时打开抬头
.mode column 字段对齐
.quit 保存并退出sqlite3
2)操作指令
以分号“;”为指令结束的标志,再键入回车,否则sqlite3不认为这条指令结束了
3)大小写敏感性
sqlite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。
3、创建表单
create table 表单名
{
字段名1 数据类型1 约束类型1
... ... ...
字段名n 数据类型n 约束类型n
}
字段名:变量名
数据类型:
整型 INTERFGER
浮点型 REAL
字符串 TEXT
...
约束类型:对数据进行规定
4、约束类型相关
1)主键约束:primary key
键:用于比较大小,确定数据存放位置的关键数据。这个数据不能重复,不能修改
被主键约束的字段,成为了表单中的“键”,剩下的都是“值”
被主键约束的字段,可以用 auto_increment/auto increment/auto increment 修饰
auto_increment/auto increment
功能
2)默认约束:default
在添加新纪录的时候,如果没有为拥有默认约束的字段,填充数据的话,数据库会选用默认值填充
3)非空约束:not null
在添加新记录的时候,如果没有为 非空约束 所修饰的字段,填充数据的话,则本次记录添加失败
4)检测约束:check
在添加记录的时候,会检查被检查约束的字段所填充的数据,是否满足"检查条件",如果不满足则添加失败
5、向表单中添加数据
insert into 表单名(字段1,字段2...,字段n)values(数据1,数据2,...,数据n)
向表单中添加 字段1——字段n 的数据
如果有任意一个数据违反了约束,则添加失败
6、查看表单数据
查看指定
select 字段1,字段2,...字段n from 表单名
查看所有
select * from 表单名
insert指令 和 select指令可以配合使用实现拷贝
insert into 表单1(字段1,字段2,....,字段n) select 字段1,字段2,...,字段n from 表单2
先查询出表单2中的所有指定字段的数据,再将这些数据,对应的添加到表单1中的每一个字段中去
7、查看特定数据
通过where子句限制
select * from 表单名 where 条件定位
比如说,想要查看 姓名(字段)为"张三"(数据)的所有信息
select * from stu where 姓名="张三"
8、修改表单中指定数据
update 表单名 set 字段名 = 新数据 where 条件定位
例如:将姓名为"张三"的成绩,改成50分
update stu set 成绩=50 where 姓名="张三"
9、删除表单中指定的数据
delete from 表单名 where 条件定位
如果不写 where 条件定位,会将表单中的所有数据删除
为防止数据的误删,基本不用delete指令
一般会在表单中加上一个字段叫做“delete”,值只有0或非0
查询的时候,只要在最后加上 where delete=0,被标记删除的数据(delete= 1)就不会显示
10、排序显示所有数据
order by 字段名
默认升序
order by 字段名 desc
降序
11、范围查看
limit x offset y
从第y行开始,显示x条记录,y从0开始
若无offset,则默认从0开始
select、limit、order可配合使用查看某一表单中某一字段数据最高/最低的几个
select * from 表单名 order by 字段名 desc limit 3
12、模糊查询
like子句 % _ * ? like 子句 % _ (* ?)
使用like的时候,使用 _ 表示1个字符的站位,使用 % 表示 0~n个字符的占位
例如:
select * from stu where name like "徐_"
查询姓徐的,并且名字只有1个字的
select * from stu where name like "_徐_"
查询名字3个字的,并且中间那个字是 徐
select * from stu where name like "徐%"
查询姓徐的,名字有几个字无所谓,哪怕只有徐,没有名字也行
select * from stu where name like "%徐%"
查询所有名字中带 徐 的
13、给字段表单添加新的字段
alter table 表单名 add column 字段名 数据类型 约束类型
14、表单重命名
alter table 原表单名 rename 同 新表单名
15、删除表单
drop table 表单名
16、字段名重命名
sqlite3不支持直接重命名字段,mysql支持
sqlite3要实现字段重命名需要通过逻辑实现
1)修改原表单名为一个任意的名字
2)以原表单原名创建一个新的表单,除要修改的字段名外,其余皆与原表单相同
3)使用 insert + select 将原表单的数据拷贝到新表单中去
4)删除原表单
17、删除字段
sqlite3不支持直接删除字段,mysql支持
sqlite3要实现字段删除需要通过逻辑实现
1)修改原表单名为一个任意的名字
2)以原表单原名创建一个新的表单,除要删除的字段名外,其余皆与原表单相同
3)使用 insert + select 将原表单的需要数据拷贝到新表单中去
4)删除原表单
五、数据库函数(API)
sqlite3函数库对应头文件:#include<sqlite3.h>
编译时链接数据库:-l sqlite3
1、打开数据库:sqlite3_open
原型:int sqlite3_open(const char* pathname,sqlite3** db)
调用: sqlite3* db;
sqlite3_open("./test.db",&db)
功能描述:打开pathname数据库,如果不存在,则创建后打开
参数分析:
参数 pathname:准备打开的数据库的路径名
参数 db:sqlite3*变量 db的地址,说明db会在函数内部发生改变,该变量在open函数内部用来接受打开的数据库的描述符
未来操作该数据库,都要通过这个db变量来操作
返回值:成功打开返回 SQLITE_OK,失败打开返回一个错误码(SQLITE_XXXX)关闭数据库:
sqlite3_close(sqlite3* db)
2、操作数据库:sqlite_exec
原型:int sqlite3_exec(sqlite3* db,const char* cmd,int(*callback)(void*,int,char**,char**),void* arg,char** errmsg);
调用:
功能描述:让数据库db执行 sql语句 cmd
参数分析:
参数 db:数据库描述符
参数 cmd:sql语句
到此为止:如果只是执行将数据写入数据库的操作,只用前2个参数就够了,后面的所有参数写0就行了
参数 callback:一个函数指针,指向了一个 int(void*,int,char**,char**) 这样的一个函数的指针
参数 arg:单纯的给callback函数传递一个地址,方便callback函数能够将读取到的数据库的数据,存放到指定地址上去,以便主函数能够访问这些数据
参数 errmsg:传一个char*字符串的地址,该字符串会在exec函数内部发生改变,变成sql语句执行时候的错误
注意:sqlite3_exec 只要 sql 语句是正确的情况,就会执行成功
原型:int callback(void* arg,int argc,char** argv,char** column)
功能描述:当sqlite3_exec函数,执行的是 select 语句的时候,从数据库获取的数据(包括字段的名字),会第一时间进入callback函数
例如:执行语句 select * from stu2;
查询到的数据如下:
姓名 score张三 100
李四 150
王五 90
赵六 120
王五 125
这些所有的内容,都会以参数的形式,进入callback函数
每一条记录,都会单独的调用一次callback函数
上面查到了5条记录,所以callback函数会在 sqlite3_exec函数内,被回调5次每条记录有2个字段:argc = 2
当第一条记录 {"张三",100} 回调 callback的时候
argv[2] = {"张三","100"}
column[2] = {"姓名","score"}
当第二条记录 {"李四",150} 回调callback的时候
argv[2] = {"李四","150"}
column[2] = {"姓名","score"}
返回值:返回1表示不再接受下一条记录,返回0表示继续接受下一条记录,直到没有记录可接受为止
3、读取数据库数据:teble
原型:int sqlite3_get_table(sqlite3* db,const char* cmd,char*** buf,int* recordno,int* columnno,char** errmsg)
功能描述:获取数据库中所有数据,以及获取到底有几条记录以及每一条记录有多少个字段
参数分析:
参数 db:数据库描述符
参数 cmd:sql语句
参数 buf:要传一个 char** 指针的地址,从数据库获取到的所有数据,包括字段名,都会存入这个指针指向的地址里面去
参数 recordno:用来存放读取到的记录的条数
参数 columnno:用来存放读取到的每一条记录,有几个字段
参数 errmsg:同sqlite3_exec中的errmsg
例如:数据库查询结果为
姓名 score张三 100
李四 150
王五 90
赵六 120
王五 125
最终,buf结构如下:buf[n] = {"姓名","score","张三","100","李四","150","王五","90","赵六","120","王五","125"}