一、数据存储方式
1、内存存数据:当程序运行结束,掉电,数据丢失。(数组、链表、变量等)
2、硬盘存数据:程序运行结束,掉电,数据不丢失。
(1)文件:对数据管理(增删改查)效率低。
(2)数据库:专业存储数据,可存大量数据。对数据管理效率高,使用方便。
二、常用数据库
1、关系型数据库:将复杂的数据结构简化为二维表格形式。
eg:大型:Oracle、DB2;中型:Mysql、SQLserver;小型:Sqlite。
2、非关系型数据库:以键值对存储,且结构不固定。
eg:(JSON)、Redis、MongoDB。
三、SQLITE
1、相关命令
【.help】可查看所有命令;【.tables】查看数据库中的表;【.headers on/off】开启/关闭表头;
【mode column】列对齐;【.width 列宽1 列宽2】设置列宽;【.shema 表名】查看表的结构。
2、SQL语句
每句后面必须有一个分号。
sqlite数据类型:①NULL:空,无值。②INTEGER(INT):带符号整数,可变字节(1、2、3、4、6、8)。③REAL(DOUBLE、FLOAT):浮点值,8字节IEEE浮点数字。④TEXT(CHARACTER(20)):文本字符串,数据库编码存储。⑤BLOB:bolb数据,根据输入数据存储。
(1)创建表
create table 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型);
(2)插入数据
insert into 表名 values(值1,值2,值3);
(3)查询
select 列名1,列名2 from 表名;
select *(通配符 表示所有) from 表明;
条件查找
select * from 表名 where 列名 关系运算符(> = < != >= <=) 值;
select * from 表名 where 列名 关系运算符 值 and/or 列名 关系运算符 值;
模糊查找
select *from 表名 where 列名 like 已知信息%;
【_】只能通配一个字符;【%】通配多个字符。
(4)排序
select *from 表名 order by 列名 ASC(升序)/DESC(降序);
(5)删除一行
delete from 表名 where 列名 关系运算符 值;
删除表
drop 表名;
(6)修改
update 表名 set 列名 关系运算符 新值 where 列名 关系运算符 值;
(7)设置键值自动增长列
create table 表名(列名 INTEGER PRIMARY KEY AUTOINCREMENT,列名 数据类型,列名 数据类型);
(8)查询当前时间(年月日时分秒)
select datetime("now","+8 hours");
(9)多表联查
①交叉连接:CROSS JOIN; (x行、y行,产生x*y行,笛卡尔积。)
②内连接:INNER JOIN;
select */(列名1 列名2) from 表名1 INNER JOIN 表名2 ON 条件;
③外连接:OUTER JOIN。(左、右、全)
左外连接:select *from 表名1 LEFT OUTER JOIN 表名2 ON 条件;
3、sqlite函数接口
int sqlite3_open(const char *filename(数据库名称) , sqlite3 **pdb(保存数据库句柄中的地址))
功能:打开数据库,如果不存在,则创建。
返回值:成功为SQLITE_OK;失败返回错误码【sqlite3_errmsg()】。
int sqlite3_exec(sqlite3 *pdb(数据库句柄) , const char *sql(要执行的sql语句首地址) , int(*callback)(void *arg , int column_cnt , char ** column_value , char **column_name) (回调函数), void *arg , char **errmsg)
功能:执行sql语句。
返回值:成功为SQLITE_OK;失败返回错误码【sqlite3_errmsg()】。
参数:int(*callback)(void *arg(传递的参数) , int column_cnt(查找到的数据的列数) , char ** column_value(查找到的行数据的每一列值的地址的集合) , char **column_name(查找到的行数据的每一列的列名的地址的集合))
在使用sqlite3——exec执行select语句时,每查找到一条数据,则调用一次回调。
例如:1)
2)