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;
		
		}
	}
}
相关推荐
程序猿校长3 分钟前
SQL小白超详细入门教程
数据库·sql·oracle
PGCCC25 分钟前
解密 PostgreSQL 加密:初学者指南#postgresql认证
数据库·postgresql·区块链
叫我萧风啊38 分钟前
25.labview数据采集中的读取和写入文本文件和Excel表格文件
数据库·计算机视觉·自动化·excel·labview
u0104058361 小时前
SQLMap工具详解与SQL注入防范
数据库·sql
喜欢猪猪1 小时前
MySQL 聚集索引与非聚集索引的概念以及优缺点
数据库·mysql
TPBoreas2 小时前
物理删除和逻辑删除区别
数据库·oracle
InterestingFigure2 小时前
头条系统-05-延迟队列精准发布文章-概述&添加任务(db和redis实现延迟任务)、取消&拉取任务&定时刷新(redis管道、分布式锁setNx)...
数据库·redis·分布式·缓存
前端组件开发2 小时前
JeeSite V5.7.1 发布,Java快速开发平台,Spring Boot,Vue3,微服务
java·数据库·spring boot·微服务·oracle·开源
BinTools图尔兹2 小时前
CQ 社区版2.13.3 | 支持全局开启OTP登录、文本导入功能可独立控制……
数据库·安全·dba·数据库管理员
henan程序媛2 小时前
MySQL备份与恢复
数据库·mysql·备份与恢复