数据库,用来保存信息,和文件有同样的作用,但是却有别于文件;
文件掉电不会消失,一般用来存储软件配置,想要保存的东西,他在查找的时候是一行一行的去查找,效率不高;
数据库存储可以理解为表格,查找时很是方便快捷,用于对表的增删改查;
数据库的分类:
关系型数据库:
1.Oracle;
2.MYSQL;
3.sqlite;
非关系型数据库;
Redis;
SQL语言:
现在我们来创建一个student.db 的数据库;
sqlite3 student.db
接下来创建一个学生表(student);
create table student(id intger primary key asc, 姓名 text, 性别 text, 年龄 intger);
每个语句结束后都需要加上分号,表示语句的结束;id 后面的 intger 是id的类型,为整形,primary key 是一个约束,表示主键值,是唯一的,可以理解为给每次输入的内容从1开始的排序,asc 表示按升序排列,text表示文本字符串;
接下来给这张学生表里插入数据;
insert into student values (NULL,"小王","男",20);
insert into student values (NULL,"小李","女",22);
insert into student values (NULL,"小猫","猫",8);
insert into student values (NULL,"小狗","狗",3);
insert into student values (NULL,"小金","鱼",2);
insert into student values (NULL,"大猩猩","猴",12);
对于字符型的需要用引号引起来, 里面用到的所有标点符号都必须为英文形式;
接下来查看一下我们生成的表;
.header on
.mode column //前两句对表的格式化输出
select * from student;
接下来对大猩猩的年龄进行更改;
update student set 年龄 = 17 where 姓名 = "大猩猩";
删除小王的信息;
delect from student where 姓名 = "小王";
多表联合查询:
1.交叉连接 cross join;//将表A和表B中想要查询的信息都列出来
2. 内连接 inner join; //将表A和表B中想要查询的信息的共同信息列出来 ,就像A和B的交集
3,.外连接 outer join;// 将外连接表的想要的信息都列出来
数据库编程:
数据库编程语句有很多,可以访问此链接进行查看:https://www.sqlite.org/c3ref/funclist.html
最基础的只有三个,打开->执行语句->关闭;
1.sqlite3_open(const char *filename, sqlite3 **ppDb);
// filename要打开的数据库;
ppDb句柄;
成功返回SQLITE_OK,失败返回错误码;
2.sqlite3_exec( sqlite3*,const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg );
//sql 要执行的语句的空间首地址(一般用sprintf拼成字符串放入一个字符型数组里);callback(回调函数)只有在select语句时用,用于选择后对数据的处理,打印等等;
void*是callback的参数;
errmsg错误信息的空间首地址(出错处理时一定要释放掉申请的空间);
if(ret != SQLITE_OK) { fprintf(stderr,"fail to creat :%s\n",perrmsg); sqlite3_free(perrmsg); //释放掉错误信息申请的空间 sqlite3_close(pdb); //关闭数据库 return -1; }
3.sqlite3_close(sqlite3*);
这里需要注意一个点,为什么之前用perror打印出错信息,因为perror是调用系统函数,打印错误信息并将错误码置位,而sqlite3_exec中调用的是sqlite3中的库函数,需要自己从错误流中打印;
还有一点,在调用回调函数时,返回值为0,非零值会使sqlite3_exec函数错误使用;