一. 数据库基础知识
1.1 数据库与其他存储结构的区别
数据结构:
数据存于内存:速度快,掉电数据丢失
文件:
数据存于硬盘,速度慢,掉电数据可以保存
数据库:
数据存于硬盘,专业存储数据,掉电数据不丢失
1.2 数据库的分类
数据库分类:
1、关系型数据库:
一个二维表格
将复杂的数据结构简化为二维表格形式
大型:Oracle,DB2
中型:MySql, SQLServer
小型:Sqlite
2、非关系型数据库:
以键值对存储,且结构不固定
JSON
Redis
MongoDB
1.3 嵌入式数据库
sqlite3:
文件型数据库,可以移动
数据容量最大2T
代码量少,1万行左右,总大小10M以内
开源免费,c语言开发
关系型数据库
1.4 sqlite3的安装
1.在线安装
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
2.源码安装
1.sqlite-autoconf-3080403源代码.tar.gz拷贝到Ubuntu系统Desktop目录中
2.tar -zxvf sqlite-autoconf-3080403源代码.tar.gz
3.cd sqlite-autoconf-3080403
4../configure// 生成makefile
5.make// 编译源码
6.sudo make install// 安装
3. 安装可视化工具
sudo apt-get install sqlitebrowser
sqlitebrowser xxx.db
Navicat Sqlite3 Windows下图形操作接口
二. sqlite3数据库的基本操作
2.1 sqlite3基本命令
1..help
查看sqlite3支持的相关命令
- .quit
退出sqlite3数据库
3..tables
查看数据库中的所有表
- .schema tablename
查看tablename创建时的SQL语句(表的结构)
- .headers on/off
开启关闭列名称
- .mode column
以左对齐列宽显示数据
- .width 第一列宽度 第二列宽度 第三列宽度 ...
2.2 SQL语言:
1.create table创建表
**用法:**create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型....);--表不存在则创
建,存在则不创建
sqlite3数据类型:
INTEGER : int
REAL:double float
TEXT: char 字符串
NULL:值是一个 NULL值。
2.insert int 插入表
**用法:**INSERT INTO 表名称 VALUES(值1, 值2,....)
3.select 查表
SELECT * FROM 表名称
SELECT 列名称 FROM 表名称
SELECT 列名称1,列名称2,列名称3 FROM 表名称
4.where
1)条件匹配
用法: SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
运算符:> >= < <= = != and or
2)模糊查询
SELECT * FROM 表名称 WHERE 列名 like '%冬梅';
SELECT * FROM 表名称 WHERE 列名 like '马%';
SELECT * FROM 表名称 WHERE 列名 like '马__';
百分号(%)代表零个、一个或多个数字或字符。
下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。
3)顺序显示
select * from class1 order by score ASC; 升序查询
select * from class1 order by score DESC;降序查询
5.delete删除表中信息
DELETE FROM 表名称 WHERE 列名称 = 值
6.update改表中信息
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
7.datetime
datetime('now', '+8 hours');
select datetime('now', '+8 hours');
查询当前东八区时间
insert into class3 values(1, 'zhangsan', 99, datetime('now', '+8 hours'));
insert into class3 values(2, 'lisi', 100, datetime('now', '+8 hours'));
insert into class3 values(3, 'wanger', 98, datetime('now', '+8 hours'));
8. 设置主键值自动增长列
create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);
再次插入时给NULL即可
9. drop table 表名称
删除一张表
2.3 sqlite3数据库编程c/c++接口:
1.编程框架
打开数据库---》读写数据库(增,删,改,查)---》关闭数据库
sqlite3.h
-lsqlite3
2.sqlite3函数接口:
2.3.1 sqlite3_open
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能: 打开数据库,不存在则会创建
参数:
filename:数据库名称
ppDb:数据库的句柄,流指针,保存数据库句柄,二级指针
返回值:
成功打开:SQLITE_OK被返回
失败:error_code被返回
2.3.2 sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3*);
**功能:**将数据库的错误码转换成字符串,打印错误信息
2.3.3 sqlite3_close
int sqlite3_close(sqlite3*);
**功能:**关闭数据库句柄,释放空间
2.3.4 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*:数据库句柄
const char *sql:需要被执行的SQL语句
callback:回调函数,select时使用
void *:传给callback的第一个参数
errmsg :保存错误信息的指针
返回值:
成功:SQLITE_OK被返回
失败:error_code被返回
回调函数注意事项:
int (*callback)(void* arg,int column,char** data,char** name)
功能:select查询 时触发的回调函数
arg:sqlite3_exec传递的第四个参数
column:查询到的数据的列数
char** ,char** 两个指针数组:
第一个:指向查到的每一列的数据,指针数组,分别指向查找到的数据的各列
第二个:列名,指针数据,保存查找到的数据的各列的名称的地址
二级指针在什么时候用:
被调修改主调中的指针变量
指针数组的数组名
返回值: 成功0 失败非0
注意:
当select每查找的一条数据,callback就会被回调一次,回调函数查询到几行数据就执行几次
callback必须要有返回值,回调函数必须要返回值,否则sqlite3_exec调用失败
从数据库查找出来的数据均是字符串
2.3.5 sqlite3_free
void sqlite3_free(void*);
功能:释放保存出错信息的空间
2.4 示例代码
1、创建新表并插入数据
cpp
int main()
{
int ret;
sqlite3 *pdb;//数据库句柄
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 class4 \
(id INTEGER PRIMARY KEY AUTOINCREMENT,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));
}
char sql[512] = {0};
char name[64] = {0};
float score;
while(1){
scanf("%s",name);
scanf("%f",&score);
sprintf(sql, "insert into class4 values(NULL, \"%s\", %f);"
,name,score);
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、查找
cpp
int flag;
int callback(void *arg, int column, char **data, char **name)
{
if(flag == 0){
printf("column is %d\n",column);
for(int i = 0; i < column; i++){
printf("%s ",name[i]);
}
printf("\n");
flag = 1;
}
for(int i = 0; i < column; i++){
printf("%s ",data[i]);
}
printf("\n");
return 0;
}
int main()
{
int ret;
sqlite3 *pdb;//数据库句柄
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 class2 where name=\"dog\";";
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;
}
结果:
