Linux应用软件编程--->数据库
一、常用数据库
1、关系型数据库
将复杂的数据结构简化为二维表格形式,如excel表。
大型:Oracle、DB2
中型:MySql、SQLServer
小型:Sqlite
2、非关系型数据库
以键值对存储,且结构不固定,如JSON数据。
Redis
MongoDB
二、sqlite数据库的特点
1)开源免费, c语言开发
2)代码量少,1万行左右,总大小10M以内
3)文件型数据库,可以移动,跨平台移植性好
4)理论数据容量最大2T
三、安装sqlite3数据库
1、安装sqlite3数据库
sudo apt-get install sqlite3
2、安装相关库
sudo apt-get install libsqlite3-dev
3、测试
创建一个名字为xxx.db的数据库:
sqlite3 xxx.db
四、sqlite3数据库的学习
1、sqlite支持的数据类型
NULL | 空值 |
INTEGER | 整形 |
REAL | 浮点型 |
TEXT | 字符串类型 |
BLOB | 根据输入进行存储 |
2、sqlite3相关命令
.help | 查看支持的命令 |
.tables | 查看当前数据库中的表 |
.headers on | 打开表头 |
.headers off | 隐藏表头 |
.mode column | 设置列左对齐 |
.quit | 退出数据库 |
3、sqlite3支持的SQL语句
注意: | 1. SQL语句后面必须要有分号;2. sqlite不区分大小写 |
运算符 | > < >= <= = != and or |
1)创建表
create table 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型); |
例如:create table class1(id INTEGER, name TEXT, age INTEGER, score REAL); |
2)数据插入
insert into 表名 values(值1, 值2, 值3); |
insert into class1 values(1, "zhangsan", 19, 88.5); |
3)查询数据
(1)查询所有列数据:
select * from 表名;
(2)查询指定列数据:关系运算符:
select 列名1,列名2,列名n form 表名;
(3)条件查询:
select * from 表名 where 列 条件;
(4)模糊查找(字符串):
select * from 表名 where 列 like "%梅";
select * from 表名 where 列 like "__梅";
% : 可以模糊匹配多个字符
_ : 只能模糊匹配一个字符
(5)排序查找:
升序排序:select * from 表名 order by 列名 ASC;
降序排序:select * from 表名 order by 列名 DESC;
4)删除数据
delete from 表名 where 删除的条件; |
delete from class1 where score < 80; |
5)修改数据
update 表名 set 列=新值 where 条件; |
update class1 set score=100 where name="wanger"; |
6)删除一张表
drop table 表名;
7)设置主键值自动增长列
注意:
(1)主键值自动增长列必须是INTEGER类型
(2)在创建表时,主键值自动增长列要增加:PRIMARY KEY AUTOINCREMENT
例如:create table class2(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, score REAL);
(3)插入数据时,主键值自动增长列给NULL,让其自动增长
例如:insert into class2 values(NULL, "张三", 90);
8)时间相关
date("now"); | 年-月-日 |
datetime("now", "+8 hours"); | 年-月-日 时:分:秒 |
4、sqlite3提供的C/C++ API(应用程序接口)接口
1)sqlite的可视化工具
sudo apt-get install sqlitebrowser
2)sqlite3_open() 接口
int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); |
功能:打开一个数据库文件 参数: filename:数据库名称 ppDb :保存数据库句柄的指针的地址 返回值: 成功:SQLITE_OK 失败:错误码 |
3)sqlite3_close() 接口
int sqlite3_close(sqlite3*); |
功能:关闭数据库 |
4)sqlite3_exec() 接口
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 失败:错误码 |
5)回调函数
int (*callback)(void*arg,int column,char**column_values,char**column_name); |
功能:执行select语句时调用的回调函数 参数: arg:sqlite3_exec传递的第四个参数 column:查询到的数据的列数 column_values:指针数组,多个指针分别指向每一列数据的字符串 column_name:指针数组,多个指针指向每一列的列名 |
注意:
(1)回调函数成功的话必须要有返回值,返回0.
否则产生错误提示: sqlite3_exec error : query aborted
(2)从数据库查询出来的数据,统统是字符串类型
(3)从数据库中查询数据,查到几条,回调函数就会被执行几次
5、应用示例
1)创建一个名为class3的sqlite3数据库,并插入数据“1, “zahngsan”,99”;
#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;
}
2)对数据库中的某个表进行遍历
#include <stdio.h>
#include <sqlite3.h>int flag = 0;int callback(void *arg, int column, char **values, char **name)
{if(flag == 0){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;";int cnt = sqlite3_exec(pdb, psql, callback, NULL, NULL);if(cnt != SQLITE_OK){fprintf(stderr, "sqlite3_exec error : %s\n", sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}sqlite3_close(pdb);return -1;
}
【END】