SQLite3 使用文档

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](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 执行语句中的传递的参数, 只有在查询语句的时候才有参数, 其他语句为NULL
     n_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;
		
		}
	}
}
  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值