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上安装:--下载对应的安装包,解压后进入对应的目录

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;
		
		}
	}
}
相关推荐
言德斐2 小时前
SQL性能优化的思路及策略
数据库·sql·性能优化
码界奇点2 小时前
Django视图从基础到高级的全面解析
数据库·django·sqlite·web·python3.11
Allan_20253 小时前
数据库学习
数据库·学习
fen_fen3 小时前
人大金仓数据库kingbase8创建表示例
数据库·oracle
一勺菠萝丶3 小时前
「您的连接不是私密连接」详解:为什么 HTTPS 证书会报错,以及如何正确配置子域名证书
数据库·网络协议·https
²º²²এ松3 小时前
蓝牙低功耗(BLE)通信的中心设备/外围设备(连接角色)、主机/从机(时序角色)、客户端/服务器(数据交互角色)的理解
运维·服务器·数据库
百锦再4 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
数据库知识分享者小北4 小时前
云栖重磅|瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
数据库·人工智能·云原生
_Johnny_4 小时前
Redis 升级操作指南:单机与主从模式
数据库·redis·缓存
源力祁老师4 小时前
ODOO数据文件(XML、CSV、SQL)是如何转换并加载到 Odoo 数据库
xml·数据库·sql