常用数据库
1.关系型数据库:将复杂的数据结构简化为二维表格形式
- 大型:Oracle、DB2
- 中型:MySql、SQLServer
- 小型:Sqlite
2.非关系型数据库:以键值对存储,且结构不固定 (JSON、Redis、MongoDB)
sqlite3:stu.db
优势:1.开源免费, c语言开发
2.代码量少,1万行左右,总大小10M以内
3.文件型数据库,可以移动
4.数据容量最大2T
一、sqlite相关命令
.tables | 查看数据库中的表 |
.headers on/off | 开启或关闭表头 |
.mode column | 列对齐 |
.width 列宽1 列宽2 | 设置每一列的列宽 |
.schema 表名 | 查看表的结构 |
二、sqlite的SQL语句
每各SQL语句之后必须有一个;
INTEGER | 整形 |
REAL | 浮点型 |
TEXT | 文本类型 |
NULL | 空 |
1.create table 创建表
表不存在,则创建,存在不创建
create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
2.insert into 插入表
INSERT INTO 表名称 VALUES(值1, 值2,....);
3.select 查表
SELECT * FROM 表名称;
SELECT 列名称 FROM 表名称;
SELECT *FROM 表名; 查看所有
SELECT *FROM 表名 WHERE 列名 关系运算符 值; 条件查找
关系运算符:> < = != and or
SELECT *FROM 表名 WHERE 列名 LIKE 值; 模糊查找
- 百分号(%)代表零个、一个或多个数字或字符。
- 下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。
SELECT *FROM 表名 ORDER BY 列名 ASC(升序)/DESC(降序);
4.删除
DELETE FROM 表名 WHERE 列名 关系运算符 值; 删除一行
DROP TABLE 表名; 删除表
5.修改
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
6. 设置主键值自动增长列
create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);
7.datetime 增加时间
datetime('now', '+8 hours');
select datetime('now', '+8 hours');查询当前东八区时间
三、sqlite3 提供的c/c++ API 接口
1.sqlite3_open
int sqlite3_open(const char *filename, sqlite3 **ppDb);
(1)功能:打开一个数据库文件获得操作数据库文件的句柄,如果数据库存在,则打开;不存在,则创建
(2)参数: filename:数据库文件路径
ppDb:存放句柄指针空间的首地址
(3)返回值: 成功返回SQLITE_OK,失败:错误码
sqlite3 *pdb;
int ret = sqlite3_open("./stu.db", &pdb);
if (ret != SQLITE_OK)
{
fprintf(stderr,"sqlite3_open fail : %s\n", sqlite3_errmsg(pdb));
return -1;
}
2.sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3*);
功能:获得出错原因
3.sqlite3_close
int sqlite3_close(sqlite3*);
功能:关闭数据库句柄,释放空
4.sqlite3_exec
int sqlite3_exec(sqlite3* pDb,const char *sql,int (*callback)(void*,int,char**,char**), void *arg, char **errmsg;
(1)功能:在数据库中执行SQL语句
(2)参数: sqlite3*:数据库句柄
sql :SQL语句字符串首地址
callback:回调函数(只有select时使用)
void * :回调函数的传参(只有select时使用)
char **errmsg:出错信息存放空间首地址
(3)返回值: 成功返回SQLITE_OK 0,失败:错误码
回调函数类型:
int fun(void* para,int n_column,char** column_value,char** column_name);
(1)功能:在使用sqlite3_exec函数时,每查找到一条数据,调用一次回调。
(2)参数: para : sqlite3_exec传递的第四个参数
n_column :查询到数据的列数
column_value:查询结果每个字段的首地址集合
column_name :查询结果每个字段的字段名称首地址集合
(3)返回值:0
注意: 1. 回调函数查询到几行数据就执行几次;
2.回调函数必须要返回0,否则sqlite3_exec调用失败
3.数据库中查出的数据均为字符串
int flag = 0;
int callback(void *arg, int column_cnt, char **column_value, char **column_name)
{
if (0 == flag)
{
for (int i = 0; i < column_cnt; i++)
{
printf("%s ", column_name[i]);
}
printf("\n");
flag = 1;
}
for (int i = 0; i < column_cnt; i++)
{
printf("%s ", column_value[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 fail : %s\n", sqlite3_errmsg(pdb));
return -1;
}
char *sql = "select name from class2;";
ret = sqlite3_exec(pdb, sql, callback1, NULL, NULL);
if (ret != SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec fail : %s\n", sqlite3_errmsg(pdb));
sqlite3_close(pdb);
return -1;
}
sqlite3_close(pdb);
return 0;
}
5.sqlite3_free
void sqlite3_free(void*);
功能:释放保存出错信息的空间