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上安装:--下载对应的安装包,解压后进入对应的目录
shell
$tar xvfz sqlite-autoconf-3071502.tar.gz
$cd sqlite-autoconf-3071502
$./configure --prefix=/usr/local // 设置安装目录
$make // 编译本地二进制文件 时间比较久
$sudo make install // 安装
P.S. Sqlite3 格式化输出
sqlite
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.创建一张表
sqlite
CREATE TABLE Stu(id INTEGER, name CHAR, score INTEGER);
查看建表的结构
sqlite
.schema
2.插入一条记录, 全部插入
sqlite
INSERT INTO Stu VALUES(1001. '张三', 80);
插入一条记录, 部分插入
sqlite
INSERT INTO Stu (name, score) VALUES ('李四', 90);
3.更新一条记录
sqlite
UPDATE Stu SET name='王五' WHERE id = 1001;
4.删除一条记录
sql
DELETE FROM Stu WHERE id = 1002;
5.查询记录
sqlite
SELECT * FROM Stu;
SELECT name, score FROM Stu WHERE score >=85;
6.插入一列
sqlite
ALTER TABLE Stu ADD COLUMN address CHAR;
7.删除一列
sqlite
-- sqlite3 不支持直接删除一列
手动步骤: 根据旧表,创建需要的新表, 将旧表删除, 新表改名为旧表的名字
sqlite
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.编程接口官方文档
sqlite
--链接 https://www.sqlite.org/c3ref/funclist.html
1.打开数据库sqlite3_open
c
int sqlite3_open(char *filename, sqlite3 **ppDb);
-- 功能: 打开sqLite数据库
-- filename: 数据库文件路径
-- ppdb: 指向sqlite句柄的指针
-- 返回值: 成功SQLITE_OK, 失败返回sqlite特有的错误码(非0值)
2.关闭数据库sqlite3_close
c
int sqlite3_close(sqlite3 *db);
-- 功能: 关闭sqLite数据库
-- 返回值: 成功返回0, 失败返回sqlite特有的错误码(非0值)
3.错误码信息
c
const cahr *sqlite3_errmsge3 *db);
-- 返回值: 返回错误信息
4.执行一条SQL语句
c
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.回调函数
C
int (*callback)(void *arg, int n_column, char **column_Value, char **column_name)
//功能: 查询的结果-是一条记录的结果
参数: arg 执行语句中的传递的参数, 只有在查询语句的时候才有参数, 其他语句为NULL
n_column: 查询出的列数
column_value: 表中每一列对应的值,一维数组,column_value[0], column_value[1]...
column_value: 查询出的列的名称,相当于表头,column_name[0], column_name[1]...
6.查询语句代码
c
// 查询语句
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 查询语句的回调函数
c
// 查询数据回调函数
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 没有回调函数的查询语句--获得表格
c
int sqlite3_get_table(sqlite3* db, char *sql, char*** resultp, char** prow, char** pcolumn, char* errmsg);
//参数:
db 打开的数据库
sql 查询语句
resultp 查询结果-表格--二维数组
prow 表格中的行数
pcolumn 表格中的列数
erermsg 错误信息
7.完整代码
c
//代码
#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;
}
}
}