数据存储——数据库
数据存储有许多方式:变量存储、数组存储、数据存储结构,这些存储方式存在内存上,不可避免最大的弊端就是掉电或程序运行结束数据会丢失;
还可以存储在文件、数据库中,这些存储在硬盘中,在掉电或程序运行结束数据不会丢失;
这些是专业的存储数据结果;今天我们将学习数据库。
1.常用数据库
(1)关系型数据库:
将复杂的数据结果简化为二维表格形式;
大型:Oracle(甲骨文)、DB2(IBM);
中型:MySql(Python)、SQLServer(Mircosoft);
小型:Sqlite(嵌入式)
(2)非关系型数据库
以键值对存储,且结构不固定
Redis(服务器式)
MongoDB
2. sqlite 数据库
(1)开源免费,c语言开发;
(2)代码量少,1万行左右,总大小10M以内;
(3)文件型数据库,可以移动,跨平台移植性好;、
(4)数据容量最大2T;
3.安装sqlite3数据库
linux系统下安装sqlite3的指令:
安装相关内容的指令:
创建xxxx.db的数据库
4.sqlite3学习
sqlite支持的数据类型:
NULL:空置;
INTEGER:带符号的整型;
REAL:浮点型;
TEXT:字符串类型;
BLOB:根据输入进行存储;
(1)指令
.help查看支持的命令
.tables查看当前数据库中的表
.headers on/off打开或者隐藏表头
.mode column 设置左对齐
.quit退出数据库
(2)sqlite3支持的SQL语句
注意:
每个语句后面都要有分号;不区分大小写
1.创建表
create table 表名(列名1 数据类型, 列名2 数据类型,····,列名n 数据类型);
2.数据插入
insert into 表名 value(值1,值2,····,值n);
3.查询数据
查询所有列数:
select *from 表名;
查询指定列数据:
select 列名1, 列名2, ···, 列名n from 表名;
条件查询:
select *from 表名 where 列 条件;
关系运算符:并且 and 或者 or > < >= <= != =
模糊查找:
select *from 表名 where 列 like “%梅”;%可以匹配多个字符;
select *from 表名 where 列 like “_ _梅”;_可以匹配多个字符;
排序查找
select *from class1 order by 列名 ASC;升序
select *from class1 order by 列名 DESC;降序
4.删除数据
delete *from class where name=”zhangsan“;
5.修改数据
update class(表名) set score=100(条件) where 列名 ="内容"
6.删除一张表
drop table 表名;MENT
7.设置主键值自动增长列
注意:
(1)主键值自动增长列必须是INTEGER类型;
(2)在创建表时添加说明(PRIMARY KEY AUTO INCREMENT);
(3)插入数据时,主键值自动增长列给NULL,让其自动增长;
8.时间相关
data("now"); 年-月-日
datatime("now", "+8 hours"); 年-月-日 时:分:秒
3.sqlite3申请的c API接口
int sqlite3_open(const char * filename, sqlite **ppDb);
功能:打开一个数据库文件;
参数:
filename:数据库名称;
ppDb:保存数据库句柄指针的地址;
返回值:
成功:SQLITE_OK;
失败:-1;
close
exec
功能:执行SQL语句;
参数:
pdb:数据库句柄;
sql:要执行的sql语句;
callback:回调函数
void *arg:回调函数传参;
errmsg :保存出错信息;
返回值:
成功;SQLITE_OK;
失败:-1;
int (*callback)(void *arg,int , char **, char **);
功能:执行select语句时调用的回调函数;
参数:
arg:sqlite3_exec传递的第四个参数
column:查询到的数据的列数;
column_values:指针数组,多个指针分别指向每一列数据的字符串的指针;
column_name:指针数据,指向每一列的列名;
注意:
1.回调函数成功的话必须要有返回值,返回0;
2.从数据库查询的数据,统统是字符串类型;
3.从数据库中查询数据,查到几条,回调函数就被掉了几次;