SQLite3 使用文档
1.什么是 SQLite?
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SOL 数据库引擎,它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件
2.为什么要用 SQLite?
- 不需要一个单独的服务器进程或操作的系统(无服务器的)。
- SQLite 不需要配置,这意味着不需要安装或管理。
- 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
- SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB.
- SQLite 是自给自足的,这意味着不需要任何外部的依赖
- SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
- sQLite 支持 SQL92 (SQL2) 标准的大多数查询语言的功能。
- SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
- SQLite 可在 UNIX (Linux, Mac Os-X, Android, ios) 和 Windows (Win32, WinCE, WinRT) 中运行
3.在 sQLite 中,SQL92 不支持的特性如下所示:
描 述 | 特 性 |
---|---|
RIGHT OUTERJOIN (右外连接) | 只实现了 LEFT OUTERJOIN (左外连接) |
FULL OUTERJOIN (全连接接) | 只实现了 LEFT OUTER JOIN。 |
ALTER TABLE | 支持RENAME TABLE和ALTER TABLE 的ADD COLUMN variants 命令,不支持 DROP COLUMN、ALTERCOLUMN、ADD CONSTRAINT |
Trigger 支持 | 支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器 |
VIEWs(视图) | 在 SQLite 中,视图是只读的。您不可以在视图上执行 DELETE、INSERT 或 UPDATE 语句。 |
GRANT 和 REVOKE | 可以应用的唯一的访问权限是底层操作系统的正常文件访问权限。 |
4.SQLite 命令
与关系数据库进行交互的标准 SQLite 命令类似于 SQL。命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。这些命令基于它们的操作性质可分为以下几种:DDL, DML, DQL.
5.sqlite3安装
Linux上安装:–下载对应的安装包,解压后进入对应的目录
$tar xvfz sqlite-autoconf-3071502.tar.gz
$cd sqlite-autoconf-3071502
$./configure --prefix=/usr/local // 设置安装目录
$make // 编译本地二进制文件 时间比较久
$sudo make install // 安装
P.S. Sqlite3 格式化输出
sqlite>.header on -- 表头
sqlite>.mode column -- 列分隔
sqlite>.timer on -- 操作时间
sqlite>
6.sqlite3 系统命令
系统命令以 ’ . ’ 开头;
命令 | 含义 |
---|---|
.help | 帮助 |
.quit | 退出 |
.eixt | 退出 |
.schema | 查看表结构 |
个人使用经验:
-
.open test.db------> 打开 test.db 数据库
-
.database-------->查看当前正在使用的数据库
-
.tables--------->查看当前数据库中有哪些表
7.SQL命令: 必须以";“结尾,不用”."开头
1.创建一张表
CREATE TABLE Stu(id INTEGER, name CHAR, score INTEGER);
查看建表的结构
.schema
2.插入一条记录, 全部插入
INSERT INTO Stu VALUES(1001. '张三', 80);
插入一条记录, 部分插入
INSERT INTO Stu (name, score) VALUES ('李四', 90);
3.更新一条记录
UPDATE Stu SET name='王五' WHERE id = 1001;
4.删除一条记录
DELETE FROM Stu WHERE id = 1002;
5.查询记录
SELECT * FROM Stu;SELECT name, score FROM Stu WHERE score >=85;
6.插入一列
ALTER TABLE Stu ADD COLUMN address CHAR;
7.删除一列
-- sqlite3 不支持直接删除一列
手动步骤: 根据旧表,创建需要的新表, 将旧表删除, 新表改名为旧表的名字
1. CREATE TABLE Stu1 AS SELECT id, name, score FROM Stu; --创建新表
2. DROP TABLE Stu; -- 删除旧表
3. ALTER TABLE Stu1 RENAME TO Stu; -- 新表改名
8.SQLite3 C语言编程接口
0.编程接口官方文档
--链接 https://www.sqlite.org/c3ref/funclist.html
1.打开数据库sqlite3_open
int sqlite3_open(char *filename, sqlite3 **ppDb);
-- 功能: 打开sqLite数据库
-- filename: 数据库文件路径
-- ppdb: 指向sqlite句柄的指针
-- 返回值: 成功SQLITE_OK, 失败返回sqlite特有的错误码(非0值)
2.关闭数据库sqlite3_close
int sqlite3_close(sqlite3 *db);
-- 功能: 关闭sqLite数据库
-- 返回值: 成功返回0, 失败返回sqlite特有的错误码(非0值)
3.错误码信息
const cahr *sqlite3_errmsge3 *db);
-- 返回值: 返回错误信息
4.执行一条SQL语句
int sqlite3_exec(sqlite3 *db,const char *sql,int (*callback) (void*, int, char**, char**),void *arg, 参数char **errmsg
);//功能: 执行一条sql语句参数: db 数据库操作句柄--操作的那一个数据库sql 一条sql语句callback 回调函数, 只有sql语句为查询语句的时候,才会执行此语句.arg 表示的是给回调函数传递参数
5.回调函数
int (*callback)(void *arg, int n_column, char **column_Value, char **column_name)
//功能: 查询的结果-是一条记录的结果
参数: arg 执行语句中的传递的参数, 只有在查询语句的时候才有参数, 其他语句为NULLn_column: 查询出的列数column_value: 表中每一列对应的值,一维数组,column_value[0], column_value[1]...column_value: 查询出的列的名称,相当于表头,column_name[0], column_name[1]...
6.查询语句代码
// 查询语句
int do_query(sqlite3 *db)
{char *errmsg;char sql[128] = {};// sprintf(sql,"SELECT * FROM Student");strcpy(sql,"SELECT * FROM Student ORDER BY id ASC;");int ret_select = sqlite3_exec(db, sql, selectCallback, NULL, &errmsg);if(ret_select != SQLITE_OK){printf("查询失败-errmsg: %s\n", errmsg);return -1;}else{printf("查询语句成功\n");return 0;}
}
6.1 查询语句的回调函数
// 查询数据回调函数
static int selectCallback(void* para, int n_column, char** column_value, char** column_name)
{if(n_column <= 0){printf("列数为0\n");return -1;}else{printf("%s\t%s\t%s\t%s\n",column_value[0], column_value[1], column_value[2], column_value[3]);}return 0;
}
6.2 没有回调函数的查询语句–获得表格
int sqlite3_get_table(sqlite3* db, char *sql, char*** resultp, char** prow, char** pcolumn, char* errmsg);//参数: db 打开的数据库sql 查询语句resultp 查询结果-表格--二维数组prow 表格中的行数pcolumn 表格中的列数erermsg 错误信息
7.完整代码
//代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>#define DATABASE "test.db"// 插入数据
int do_insert(sqlite3 *db)
{char sql[128] = {};char *errmsg;// 字段int id;char name[32] = {};int age;char address[32] = {};// 用户输入数据printf("输入id\n");scanf("%d", &id);getchar();printf("输入name\n");scanf("%s", name);getchar();printf("输入age\n");scanf("%d", &age);getchar();printf("输入地址\n");scanf("%s", address);getchar();// sql语拼接sprintf(sql, "INSERT INTO Student VALUES(%d, '%s', %d, '%s');", id, name, age, address);int ret_insert = sqlite3_exec(db, sql, NULL, NULL,&errmsg);if(ret_insert != SQLITE_OK){printf("插入失败-errmsg=%s\n",errmsg);return -1;}else{printf("插入成功\n");return 0;}
}// 删除数据
int do_delete(sqlite3 *db)
{char deleteID[32] = {};char *errmsg;printf("请输入要删除用户的id\n");scanf("%s", deleteID);getchar();int id = atoi(deleteID);char sql[128] = {};sprintf(sql,"DELETE FROM Student WHERE id = %d;",id);int ret_delete = sqlite3_exec(db, sql, NULL, NULL, &errmsg);if(ret_delete != SQLITE_OK){printf("语句执行失败, errmsg = %s\n", errmsg);return -1;}else{printf("语句执行成功\n");return 0;}
}// 查询数据回调函数
static int selectCallback(void* para, int n_column, char** column_value, char** column_name)
{if(n_column <= 0){printf("没有数据\n");return 0;}else{printf("%s\t%s\t%s\t%s\n",column_value[0], column_value[1], column_value[2], column_value[3]);}return 0;
}
// 查询语句
int do_query(sqlite3 *db)
{char *errmsg;char sql[128] = {};// sprintf(sql,"SELECT * FROM Student");strcpy(sql,"SELECT * FROM Student ORDER BY id ASC;");int ret_select = sqlite3_exec(db, sql, selectCallback, NULL, &errmsg);if(ret_select != SQLITE_OK){printf("查询失败-errmsg: %s\n", errmsg);return -1;}else{printf("查询语句成功\n");return 0;}
}
// 查询语句--获取表格
int do_query1(sqlite3 *db)
{char *errmsg;char sql[128];int row = 0;int column = 0;char **resultp;sprintf(sql, "SELECT * FROM Student ORDER BY id;");int ret_table = sqlite3_get_table(db, sql, &resultp, &row, &column, &errmsg);if(ret_table != SQLITE_OK){printf("查询失败\n");return -1;}int i = 0; int j = 0;int data_index = j;for(i = 0; i < row; i++){for(j = 0; j < column; j++){printf("%s\t", resultp[data_index++]);}printf("\n");}return 0;
} // 更新语句
int do_update(sqlite3 *db)
{if(db == NULL){printf("数据库加载失败\n");return -1;}char *errmsg;char sql[128] = {};int id;int score;printf("输入你要修改记录的id号\n");scanf("%d",&id);getchar();printf("更新年龄:");scanf("%d", &score);getchar();sprintf(sql, "UPDATE Student SET age = %d WHERE id = %d;", score, id);int ret_update = sqlite3_exec(db, sql, NULL, NULL, &errmsg);if(ret_update != SQLITE_OK){printf("更新失败-errmsg = %s\n", errmsg);return -1;}else{printf("更新成功\n");return 0;}
} int main(int argc, char * argv[])
{// 打开关闭数据库 + 错误码// sqlite3_open(const char *fliename, sqlite **ppdb);sqlite3 * db;char *errmsg;int cmd = -1;int ret_open = sqlite3_open(DATABASE, &db);if(ret_open != SQLITE_OK){printf("打开数据库错误...Errmsg: %s\n", sqlite3_errmsg(db));return -1;}else{printf("打开数据库成功\n");}// 创建一张表char * createSql = "CREATE TABLE Student (id INTEGER, name CHAR, age Integer, address CHAR);";int ret_create = sqlite3_exec(db, createSql, NULL, NULL, &errmsg);if(ret_create != SQLITE_OK){printf("创建表失败,errmsg: %s\n", errmsg);}else{printf("新建数据表成功\n");}// 增删改查while(1){printf("*********************************************\n");printf("1-insert, 2-delete, 3-query, 4-update, 5-quit\n");printf("*********************************************\n");scanf("%d", &cmd);getchar(); // 吃掉回车switch(cmd){case 1:do_insert(db);break;case 2:do_delete(db);break;case 3:do_query1(db);break;case 4:do_update(db);break;case 5:sqlite3_close(db);exit(0); default:printf("序号错误\n");break;}}
}