- 数据库
数据库是一个按数据结构来存储、管理和检索数据的计算机软件系统。它是存储数据的电子仓库,旨在以高效、有组织的方式处理大量信息。
- SQLite
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。
- SQLite命令
3.1 .databases
列出附加数据库的名称和文件
3.2 .dump
以SQL文本格式转储数据库
3.3 exit
退出SQLite提示符
3.4 .header(s) on|off
开启或关闭头部显示
3.5 .help
显示帮助信息
3.6 .mode column
左对齐的列
3.7 .width num num
为"column"模式设置列宽度
3.8 .quit
退出SQLite提示符
- SQL语句
4.1 create table语句------给数据库创建新表
用法:create table 表名(表字段1,表字段2,...);
示例:CREATE TABLE 魏 (id integer primary key asc, 姓名 char(32), 武力 integer, 智力 integer);
1.2 drop table语句------删除表定义及其所有相关数据、索引、触发器、约束和该表的权限规范
示例:drop table 魏;
1.3 insert into 语句------向数据库的某个表中添加新的数据行
示例:insert into 魏 values (NULL, "司马懿", 85, 90);
1.4 select语句------从 SQLite 数据库表中获取数据,以结果表的形式返回数据
示例:select * from 魏;
select * from dict where word like 'abandon';
1.5 where子句------按要求查看表格内容
示例:select * from 魏 where 武力 > 90;
select * from dict where word like 'abandon';
1.6 order by 子句------对表格内容进行排序
示例:select * from 魏 order by 智力 desc;(降序)
示例:select * from 魏 order by 智力 asc;(升序)
1.7 delete from------删除表格内容
示例:delete from 魏 where 姓名="曹操";
1.8 update------修改表格内容
示例:update 魏 set 武力 = 71,智力 = 81 where 姓名="曹丕";
1.9 sqlite3 数据库名.db------新建数据库
1.10 .table 查看数据库中插入的所有表
1.11 .headers on 给数据库加表头
1.12 .schema xxx 列出当前指定的xxx表结构
1.13 .dump user ===>导出数据库
1.14 sqlite3 xxx.db .dump > xxx.sql 数据的导出
//将数据库名称为xxx的数据库整体导出到脚本中
1.15 sqlite3 xxx.db < xxx.sql 数据的导入
1.16 可视化数据库工具的安装 sudo apt-get install sqlitebrowser
1.17 打开可视化工具 sqlitebrowser
1.18 自动增长列
sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime); 主键
sqlite> insert into user3 (NULL,'李四',23,datetime('now')); (void*)0
1.19 插入时间列
CREATE TABLE user1(id int,name char,age int,dt datetime);'2022-07-01 19:00:00'
insert into user1 values (2,'张三',23,datetime('now','+8 hours'));
- 多表联合查询
2.1 交叉连接
select * from 学生信息 cross join 课程信息;
select 学生信息.姓名,课程信息.课程名 from 学生信息 cross join 课程信息;
sqlite> select
...> 学生信息.姓名 as 学生,
...> 课程信息.课程名 as 课程
...> from 学生信息 cross join 课程信息
...> where 学生 like "赵%"
...> order by 学生信息.学号;
2.2 内连接
select 学生信息.姓名 as 学生, 学生成绩.课程成绩 as 成绩
...> from 学生信息 inner join 学生成绩 on 学生信息.学号 = 学生成绩.学号;
2.3 外连接
sqlite> select 学生信息.姓名 as 学生, 学生成绩.课程编号 as 课程, 学生成绩.课程成绩 as 成绩
...> from 学生信息 left outer join 学生成绩 on 学生信息.学号 = 学生成绩.学号;
2.4 三表联合查询
sqlite> select 学生信息.姓名 as 学生, 课程信息.课程名 as 课程, 学生成绩.课程成绩 as 成绩
...> from 学生信息 left outer join 学生成绩 on 学生信息.学号 = 学生成绩.学号
...> inner join 课程信息 on 学生成绩.课程编号 = 课程信息.课程编号;
- sqlite相关函数接口
3.1 sqlite3_open
- 定义
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
- 功能
打开数据库文件获得操作数据库文件句柄
- 参数
filename:文件描述符
ppDb:存放句柄指针空间首地址
- 返回值
成功返回SQLITE_OK
失败返回错误码
- 示例程序
3.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语句时才会使用)
void *:给回调函数的传参
errmsg:出错时存放出错字符串空间首地址
- 返回值
成功返回SQLITE_OK
失败返回错误码
- 示例程序
(1)简单程序
cpp
#include "sqlite3.h"
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int show(void *arg, int col, char **result, char **title)//arg传参 col列数 result内容(每次执行函数++) title表头
{
int i = 0;
static int flag = 0;
if (0 == flag)
{
for (i = 0; i < col; i++)
{
printf("%s\t", title[i]);
}
putchar('\n');
flag = 1;
}
for (i = 0; i < col; i++)
{
printf("%s\t", result[i]);
}
printf("\n");
return 0;
}
int main(int argc, const char *argv[])
{
int ret = 0;
sqlite3 *pdb = NULL;
char tmpbuff[1024] = "select * from 西游记";
char *perrmsg;
ret = sqlite3_open("dict.db", &pdb);
if (ret != SQLITE_OK)
{
fprintf(stderr, "sqlite3_open failed:%s\n", sqlite3_errmsg(pdb));
sqlite3_close(pdb);
return -1;
}
ret = sqlite3_exec(pdb, tmpbuff, show, NULL, &perrmsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "sqlite3_exec1 failed:%s\n", perrmsg);
printf("%s\n", tmpbuff);
sqlite3_free(perrmsg);
return -1;
}
sqlite3_close(pdb);
return 0;
}
(2)将英文字典文本文件中的数据存入数据库,并利用数据库实现英文单词的查询
cpp
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>
#include <time.h>
int show(void *arg, int col, char **result, char **title)
{
*(int *)arg = 1;
printf("%s %s\n", result[1], result[2]);
return 0;
}
int main(void)
{
sqlite3 *db;
int ret = 0;
char sql_cmd[1024] = {0};
char *errmsg = NULL;
time_t start_tm;
time_t end_tm;
ret = sqlite3_open("./first.db", &db);
if (SQLITE_OK != ret)
{
fprintf(stderr, "sqlite3_open error: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
strcpy(sql_cmd,"drop table dict");
sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
bzero(sql_cmd, sizeof(sql_cmd));
strcpy(sql_cmd, "create table if not exists dict(id integer primary key asc, word char(32), mean char(1024))");
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "sqlite3_exec1 error: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
FILE *fp = fopen("./dict.txt", "r");
if (NULL == fp)
{
perror("fopen error!\n");
return -1;
}
bzero(sql_cmd, sizeof(sql_cmd));
strcpy(sql_cmd, "BEGIN TRANSACTION");
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "sqlite3_exec2 error: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
time(&start_tm);
while (1)
{
char buf[1024] = {0};
char *word = NULL;
char *mean = NULL;
if (NULL == fgets(buf, sizeof(buf), fp))
{
break;
}
word = strtok(buf, " ");
mean = strtok(NULL, "\r");
bzero(sql_cmd, sizeof(sql_cmd));
sprintf(sql_cmd, "insert into dict values(NULL, \"%s\", \"%s\");", word, mean);
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "sqlite3_exec3 error: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
sqlite3_free(errmsg);
return -1;
}
}
bzero(sql_cmd, sizeof(sql_cmd));
strcpy(sql_cmd, "COMMIT;");
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "sqlite3_exec3 error: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
sqlite3_free(errmsg);
return -1;
}
time(&end_tm);
printf("spend time %lu\n", end_tm - start_tm);
while (1)
{
printf("请输入你要查询的单词:");
int exist_flag = 0;
char dict_word[32] = {0};
fgets(dict_word, sizeof(dict_word), stdin);
dict_word[strlen(dict_word) - 1] = '\0';
if (0 == strcmp(dict_word, "#quit"))
{
break;
}
bzero(sql_cmd, sizeof(sql_cmd));
sprintf(sql_cmd, "select * from dict where word like '%s';", dict_word);
ret = sqlite3_exec(db, sql_cmd, show, &exist_flag, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "sqlite3_exec4 error: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
sqlite3_free(errmsg);
return -1;
}
if (0 == exist_flag)
{
printf("输入单词有误,请重新输入!\n");
}
}
sqlite3_close(db);
fclose(fp);
return 0;
}
3.3 sqlite3_close
- 定义
int sqlite3_close(sqlite3*);
- 功能
关闭数据库句柄
3.4 sqlite3_errmsg
- 定义
const char *sqlite3_errmsg(sqlite3*);
- 功能
将出错原因转换成字符串