数据库:
1.概念:
文件:存放数据,掉电数据不会丢失,软件的配置及想要持续保存的数据放入文件中
大批量数据存储和管理时使用数据库
2.类型:
1.关系型数据库
1.Oracle
DB2
2.MySQL
开源
3.sqlserver
4.sqlite
小型数据库
2.非关系型数据库
1.Redis
3.SQL语言
数据库支持的编程语言,主要对表完成:增、删、改、查相关功能
4.安装sqlite数据库
5.sqlite3命令:.quit 等
6.SQL语句:
create table
创建表
使用形式:
create table 表名称(列1 数据类型, 列2 数据类型, ...);
示例:
create table student(姓名 text, 性别 text, 年龄 integer, 成绩 double);
insert into
插入表
使用形式:
insert into 表名称 values(值1, 值2, ...);
示例:
insert into student values("张三", "男", 19, 89.5);
insert into student values("李四", NULL, NULL, 99.99);
insert into student (姓名, 年龄) values ("王二", 18);
select
查看表
使用形式:
select 列1,列2,... from 表名称 where 匹配条件 order by 列名称 asc/desc;
示例:
select * from 表名称;
select 姓名,成绩 from student;
select 姓名,成绩 from student where 姓名 like "%张%";
select 姓名,成绩 from student order by 成绩 desc;
select 姓名 from student where 成绩 > 85 order by 成绩 desc;
delete from
删除表
使用形式:
delete from student where 匹配条件;
示例:
select 姓名 from student where 成绩 > 85 order by 成绩 desc;
update
更新表
使用形式:
update 表名称 set 列1=值1,列2=值2 where 匹配条件;
示例:
update student set 性别="女", 成绩=86.3 where 姓名="王二";
drop table
删除表
使用形式:
drop table 表名称;
7.数据库文件格式:
数据库文件 -> 表 -> 列1 列2 列3
filename.db ...
8.内键:
1.一般为整形
2.区分一张表中不同的数据(内键的值不允许重复)
9.与外部关联的键值
与外部表关联的键值
学生信息表/
成绩表/
课程表
10.多表联合查询
1.cross join:
交叉连接
将表1中的每一项都与表2中所有项连接获得一张新表
示例:
select student.name as 姓名, lesson.subject as 科目 from student cross join lesson;
select student.name as 姓名, lesson.subject as 科目 from student cross join lesson where 科目 like "语文";
2.inner join:
内连接
将表1和表2中所有同时满足条件的数据关联在一起
3.outer join
外连接
数据库编程:
1.安装sqlite3库文件
sudo apt-get install libsqlite3-dev
2.sqlite3函数接口:
1.sqlite3_open
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能:
打开一个数据库文件
参数:
filename:数据库文件名称
ppDb:数据库句柄
返回值:
成功返回SQLITE_OK
失败返回错误码
sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3*);
获得出错原因
2.sqlite3_exec
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
功能:
执行SQL语句
参数:
sqlite3*:数据库句柄
sql:要执行的SQL语句字符串的首地址
callback:回调函数(只有在select语句时会使用,其余SQL语句只需传入NULL),对找到的数据要完成的操作
void *:给回调函数的参数
char **:存放错误信息空间首地址
返回值:
成功返回SQLITE_OK
失败返回错误码
3.sqlite3_close
int sqlite3_close(sqlite3*);
功能:
关闭sqlite3数据库
#include <sqlite3.h>
#include <stdio.h>
typedef struct student
{
char name[32];
char sex[4];
int age;
double score;
}stu_t;
/********************************************************
* 函数名:callback
* 功 能:
* 处理找到的数据
* 参 数:
* arg:sqlite3_exec给函数的传参
* column:找到的这一条数据的列数(与SQL语句select后面选择的列数有关)
* pcontent:指针数组的数组名(指向该条数据每一列字符串首地址的指针数组)
* ptitle:指针数组的数组名(指向每一列名称字符串首地址的指针数组)
* 返回值:
* 成功返回0
* 失败返回-1
* 注意事项:
* 1.函数返回0成功,返回非0会使sqlite3_exec出错
* 2.每找到一条匹配的数据,则会调用一次callback,所以callback可能被调多次
********************************************************/
int callback(void *arg, int column, char** pcontent,char** ptitle)
{
int i = 0;
for (i = 0; i < column; i++)
{
printf("%s = %10s ", ptitle[i], pcontent[i]);
}
printf("\n");
return 0;
}
int main(void)
{
sqlite3 *pDb = NULL;
int ret = 0;
char cmdbuf[1024] = {0};
char *perrmsg = NULL;
stu_t s[3] = {
{"张三", "男", 19, 80},
{"李四", "女", 18, 60},
{"王二", "男", 20, 75},
};
int i = 0;
ret = sqlite3_open("student.db", &pDb);
if (ret != SQLITE_OK)
{
fprintf(stderr, "sqlite3_open failed! : %s\n", sqlite3_errmsg(pDb));
return -1;
}
sprintf(cmdbuf, "create table if not exists student(id integer primary key asc, name text, sex text, age integer, score double);");
ret = sqlite3_exec(pDb, cmdbuf, NULL, NULL, &perrmsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "sqlite3_exec failed! : %s\n", perrmsg);
sqlite3_free(perrmsg);
sqlite3_close(pDb);
return -1;
}
for (i = 0; i < 3; i++)
{
sprintf(cmdbuf, "insert into student values(NULL, \"%s\", \"%s\", %d, %lf);", s[i].name, s[i].sex, s[i].age, s[i].score);
ret = sqlite3_exec(pDb, cmdbuf, NULL, NULL, &perrmsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "sqlite3_exec failed! : %s\n", perrmsg);
sqlite3_free(perrmsg);
sqlite3_close(pDb);
return -1;
}
}
sprintf(cmdbuf, "select * from student;");
ret = sqlite3_exec(pDb, cmdbuf, callback, NULL, &perrmsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "sqlite3_exec failed! : %s\n", perrmsg);
sqlite3_free(perrmsg);
sqlite3_close(pDb);
return -1;
}
sqlite3_close(pDb);
return 0;
}