数据库的基本概念
什么是数据库
数据库(database)是用来组织、存储和管理数据的仓库。
为了方便管理互联网世界中的数据,就有了数据库管理系统的概念。用户可以对数据库中的数据进行新增、查询、更新、删除等操作。
数据库的分类
1.关系库数据
1.1Oracle
1.2MySQL
1.3sqlserver
1.4sqlite...
2.非关系型数据库
Redis....
SQL语句
数据库数据类型
创建
create table(if not exists) 表名称(列1 数据类型, 列2 数据类型, ...);
插入
insert into 表名称 values(值1, 值2, ...);
查看
select 列1,列2,... from 表名称 where 匹配条件 order by 列名称 asc/desc;
select * from 表名称;
select 姓名,成绩 from student;
删除(按照行删除)
delete from student where 匹配条件;
更新
update 表名称 set 列1=值1,列2=值2... where 匹配条件;
删除表
drop table 表名称;
数据库文件格式
数据库文件.db -> 表 -> 列1 列2 列3
多表联合查询
内连接:选择两个表中,数据重复的部分
当表A中的一条记录对应表B中的多条记录时,会以重复的方式对应多条表B记录出现在结果集中。
当表B中的一条记录对应表A中的多条记录时,会以重复的方式对应多条表A记录出现在结果集中。
外连接
左外连接,会以左边的表A为主表,返回所有行,即使右表B中没有匹配的行。
如果左边的表A在右表B中找不到一条记录,则返回表A所有记录并且表B相应的字段设为null。
如果左边的表A在右表B中找到多条记录,则以相同表A记录和不同表B记录多条显示在结果集中。
这种情况下,其实是把表A中所有记录都查询出来了,包括不满足条件的记录
交叉连接
交叉连接(Cross Join)是一种数据库连接操作, 将两个表的每一行都与另一个表的每一行进行配对,生成的结果集称为笛卡尔积 。 交叉连接不基于任何条件进行连接,它只是简单地将一个表的每一行与另一个表的每一行进行组合,产生的结果是两个表的行数相乘的结果
数据库编程
函数接口
1.sqlite3_open
2.sqlite3_exec
sqlite3* : open 打开的数据库
const char* sql, : 执行的sql功能语句
*callback, : sql语句对应的回调函数
void* data, : 传递给回调函数的 指针参数
char **errmsq : 错误信息
回调函数:回调函数的意思是,会先执行*sql对应的功能命令,然后将结果传递给回调函数,回调函数根据结果再进一步执行。这代表着,这个 “回调函数”才是最有意义的,我们要讲我们需要的功能,通过回调函数来实现,不管是获取数据库表中有效信息,还是其他动作。
sqlite3_exec参数解读
第1个参数是打开数据库时得到的指针。
第2个参数const char *sql 是一条 sql 语句,以/0结尾。
第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。
第4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。
第5个参数char ** errmsg 是错误信息。注意是指针的指针。
回调函数参数解读
int callback(void *arg, int column, char** pcontent,char** ptitle)
/********************************************************
* 函数名:callback
* 功 能:
* 处理找到的数据
* 参 数:
* arg:sqlite3_exec给函数的传参
* column:找到的这一条数据的列数(与SQL语句select后面选择的列数有关)
* pcontent:指针数组的数组名(指向该条数据每一列字符串首地址的指针数组)
* ptitle:指针数组的数组名(指向每一列名称字符串首地址的指针数组)
* 返回值:
* 成功返回0
* 失败返回-1
* 注意事项:
* 1.函数返回0成功,返回非0会使sqlite3_exec出错
* 2.每找到一条匹配的数据,则会调用一次callback,所以callback可能被调多次
********************************************************/