Linux下的软件编程——数据库

数据存储:

变量,数组,数据存储结构 ------->内存:掉电或者程序运行结束,数据丢失

文件 -------->硬盘:掉电或者程序运行结束,数据不丢失

数据库,专业的存储数据的结构 ------>硬盘:掉电或者程序运行结束,数据不丢失

1.常用数据库:

1.关系型数据库

将复杂的数据结构简化为二维表格形式

大型:Oracle,DB2

中型:MySql,SQLServer

小型:Sqlite

2.非关系型数据库

以键值对存储,且结构不固定 JSON,Redis,MongoDB

2.sqlite数据库

1.开源免费,c语言开发

2.代码量少,1万行左右,总大小10M以内

3.文件型数据库,可以移动,跨平台移植性好

4.理论数据容量最大2T

3. 安装sqlite3数据库

sqlite3.22.0

sudo apt-get install sqlite3

安装相关库:

sudo apt-get install libsqlite3-dev

测试:

创建一个名字为xxx.db的数据库:

sqlite3 xxx.db

4. sqlite3学习:

sqlite支持的数据类型:

NULL : 空值

INTEGER : 整形

REAL: 浮点型

TEXT: 字符串类型

BLOB: 根据输入进行存储

1)sqlite3相关的命令

.help 查看支持的命令

.tables 查看当前数据库中的表

.headers on/off 打开或者隐藏表头

.mode column 设置列左对齐

.quit 退出数据库

2)sqlite3支持的SQL语句

注意:

  1. SQL语句后面必须要有分号;

  2. sqlite不区分大小写

  3. 创建表

create table 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型);

create table class1(id INTEGER, name TEXT, age INTEGER, score REAL);

  1. 数据插入

insert into 表名 values(值1, 值2, 值3);

insert into class1 values(1, "zhangsan", 19, 88.5);

  1. 查询数据

查询所有列数据:

select * from 表名;

查询指定列数据:

select 列名1,列名2,列名n form 表名;

条件查询:

select * from 表名 where 列 条件;

关系运算符:

> < >= <= = !=

and ---->&&

or ----->||

模糊查找(字符串):

select * from 表名 where 列 like "%梅";

select * from 表名 where 列 like "__梅";

% : 可以模糊匹配多个字符

_ : 只能模糊匹配一个字符

排序查找:

升序排序:

select * from 表名 order by 列名 ASC;

降序排序:

select * from 表名 order by 列名 DESC;

  1. 删除数据

delete from 表名 where 删除的条件;

delete from class1 where score < 80;

  1. 修改数据

update 表名 set 列=新值 where 条件;

update class1 set score=100 where name="wanger";

  1. 删除一张表

drop table 表名;

  1. 设置主键值自动增长列

注意:

  1. 主键值自动增长列必须是INTEGER类型

  2. 在创建表时,主键值自动增长列要增加:PRIMARY KEY AUTOINCREMENT

create table class2(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, score REAL);

  1. 插入数据时,主键值自动增长列给NULL,让其自动增长

insert into class2 values(NULL, "张三", 90);

  1. 时间相关

date("now"); 年-月-日

datetime("now", "+8 hours"); 年-月-日 时:分:秒

sqlite的可视化工具:

sudo apt-get install sqlitebrowser

sqlitebrowser xxx.db

3)sqliite3提供的C/C++ API(应用程序接口)接口

int sqlite3_open(

const char *filename, /* Database filename (UTF-8) */

sqlite3 **ppDb /* OUT: SQLite db handle */

);

功能:打开一个数据库文件

参数:

filename:数据库名称

ppDb :保存数据库句柄的指针的地址

返回值:

成功:SQLITE_OK

失败:错误码

int sqlite3_close(sqlite3*);

功能:关闭数据库

int sqlite3_exec(

sqlite3*pdb, /* An open database */

const char *sql, /* SQL to be evaluated */

int (*callback)(void*,int,char**,char**), /* Callback function */

void *arg, /* 1st argument to callback */

char **errmsg /* Error msg written here */

);

功能:执行SQL语句

参数:

pdb:数据库句柄

sql:要执行的sql语句

callback:执行select语句时使用的回调函数

arg:给回调函数传递的参数(实参)

errmsg:保存出错信息

返回值:

成功:SQLITE_OK

失败:错误码

cpp 复制代码
#include <stdio.h>
#include <sqlite3.h>

int main(int argc, const char *argv[])
{
	sqlite3 *pdb;
	int ret = sqlite3_open("./stu.db", &pdb);
	if (ret != SQLITE_OK)
	{
		fprintf(stderr, "sqlite3_open error : %s\n", sqlite3_errmsg(pdb));
		return -1;
	}
	
	char *psql = "create table if not exists class3(id INTEGER, name TEXT, score REAL);";
	ret = sqlite3_exec(pdb, psql, NULL, NULL, NULL);
	if (ret != SQLITE_OK)
	{
		fprintf(stderr, "sqlite3_exec error : %s\n", sqlite3_errmsg(pdb));
		sqlite3_close(pdb);
		return -1;
	}
	
	char sql[128] = {"insert into class3 values(1, \"zhangsan\", 99);"};
	ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
	if (ret != SQLITE_OK)
	{
		fprintf(stderr, "sqlite3_exec error : %s\n", sqlite3_errmsg(pdb));
		sqlite3_close(pdb);
		return -1;
	}


	sqlite3_close(pdb);

	return 0;
}

int (*callback)(void*arg,int column,char**column_values,char**column_name);

功能:执行select语句时调用的回调函数

参数:

arg:sqlite3_exec传递的第四个参数

column:查询到的数据的列数

column_values:指针数组,多个指针分别指向每一列数据的字符串

column_name:指针数组,多个指针指向每一列的列名

cpp 复制代码
#include <stdio.h>
#include <sqlite3.h>

int flag = 0;

int callback(void *arg, int column, char **values, char **name)
{
//	printf("column = %d\n", column);
	if (0 == flag)
	{
		for (int i = 0; i < column; i++)
		{
			printf("%s ", name[i]);
		}
		printf("\n");
		flag = 1;
	}
	for (int i = 0; i < column; i++)
	{
		printf("%s ", values[i]);
	}
	printf("\n");

	return 0;
}

int main(int argc, const char *argv[])
{
	sqlite3 *pdb;
	int ret = sqlite3_open("./stu.db", &pdb);
	if (ret != SQLITE_OK)
	{
		fprintf(stderr, "sqlite3_open error : %s\n", sqlite3_errmsg(pdb));
		return -1;
	}
	
	char *psql = "select * from data;";
	ret = sqlite3_exec(pdb, psql, callback, NULL, NULL);
	if (ret != SQLITE_OK)
	{
		fprintf(stderr, "sqlite3_exec error : %s\n", sqlite3_errmsg(pdb));
		sqlite3_close(pdb);
		return -1;	
	}

	sqlite3_close(pdb);
	return 0;
}

注意:

  1. 回调函数成功的话必须要有返回值,返回0.

sqlite3_exec error : query aborted

  1. 从数据库查询出来的数据,统统是字符串类型

  2. 从数据库中查询数据,查到几条,回调函数就会被执行几次