嵌入式学习(day37) 数据库 Sqlite相关命令函数

数据存储:

变量、数组、数据存储结构 ----》内存:掉电或程序运行结束,数据丢失

文件、数据库 ----》硬盘:掉电或者程序运行结束,数据不丢失

1.常用数据库:关系型数据库和非关系型数据库

关系型数据库:将复杂的数据结构简化为二维表格形式:大型:Oracle、DB2 中型的:MySql、SQLServer 小型:Sqlite

非关系型数据库:以键值对存储,且结构不固定 Redis MongoDB

2.sqlite数据库:开源免费,C语言开发。代码量少,一万行左右,总大小10M以内,文件型数据库,可以移动,跨平台移植性好,理论数据容量最大2T

3.安装sqlite数据库:sudo apt-get install sqlite3

安装相关库:sudo apt-get install libsqlite3-dev

测试 创建一个名为xxx.db的数据库 sqlite3 xxx.db

4、sqlite3学习

sqlite支持的数据类型:NULL 空值、INTEGER 整型、REAL 浮点型、TEXT 字符串型 BLOB 根据输入进行存储。

  1. sqlite3 相关的命令

.help 查看支持的命令

.tables 查看当前数据库中的表

.headers on/off 打开或者隐藏表头

.mode column 设置列左对齐

.quit 退出数据库

  1. sqlite3 支持的SQL语句

注意:

  1. SQL语句后面必须要有分号;

  2. sqlite不区分大小写

  3. 创建表

create table 表名(列名1 数据类型, 列名2 数据类型, 列名3 数据类型);

create table class1(id INTEGER, name TEXT, age INTEGER, score REAL);

  1. 数据插入

insert into 表名 values(值1, 值2, 值3);

insert into class1 values(1, "zhangsan", 19, 88.5);

  1. 查询数据

查询所有列数据:

select * from 表名;

查询指定列数据:

select 列名1, 列名2, 列名n from 表名;

条件查询

SELECT * FROM 表名 WHERE 列 条件;

关系运算符

> < >= <= = !=

逻辑运算符

AND --> &&

OR --> ||

模糊查找(字符串)

SELECT * FROM 表名 WHERE 列 LIKE "%梅";

SELECT * FROM 表名 WHERE 列 LIKE "__梅";

通配符说明:

% : 可以模糊匹配多个字符

_ : 只能模糊匹配一个字符

排序查找

-- 升序排序

SELECT * FROM 表名 ORDER BY 列名 ASC;

降序排序

SELECT * FROM 表名 ORDER BY 列名 DESC;

  1. 删除数据

DELETE FROM 表名 WHERE 删除的条件;

DELETE FROM class1 WHERE score < 80;

  1. 修改数据

UPDATE 表名 SET 列=新值 WHERE 条件;

UPDATE class1 SET score=100 WHERE name="wanger";

  1. 删除一张表

DROP TABLE 表名;

  1. 设置主键值自动增长列 注意:

-- 1. 主键值自动增长列必须是 INTEGER 类型

-- 2. 在创建表时,主键值自动增长列要增加: PRIMARY KEY AUTOINCREMENT

CREATE TABLE class2 (

id INTEGER PRIMARY KEY AUTOINCREMENT,

name TEXT,

score REAL

);

-- 3. 插入数据时,主键值自动增长列给 NULL,让其自动增长

INSERT INTO class2 VALUES(NULL, "张三", 90);

  1. 时间相关函数

-- 获取当前日期:年-月-日

date("now");

获取指定时间(如+8小时):年-月-日 时:分:秒

datetime("now", "+8 hours");

sqlite 的可视化工具

-- 安装命令(Linux)

sudo apt-get install sqlitebrowser

启动工具

sqlitebrowser xxx.db

3) sqlite3 提供的 C/C++ API(应用程序接口)

函数:打开一个数据库文件

int sqlite3_open(

const char *filename, /* Database filename (UTF-8) */

sqlite3 **ppDb /* OUT: SQLite db handle */

);

功能:打开一个数据库文件

参数: filename: 数据库文件名称、 ppDb: 保存数据库句柄指针的地址

返回值: 成功:SQLITE_OK、 失败:错误码。

函数:关闭数据库

int sqlite3_close(sqlite3 *);

函数:执行 SQL 语句

int sqlite3_exec(

sqlite3 *pdb, /* An open database */

const char *sql, /* SQL to be evaluated */

int (*callback)(void*, int, char**, char**), /* Callback function */

void *arg, /* 1st argument to callback */

char **errmsg /* Error msg written here */

);

功能:执行 SQL 语句

参数:

pdb: 数据库句柄

sql: 要执行的 SQL 语句

callback: 回调函数(用于处理查询结果)

arg: 传递给回调函数的第一个参数

errmsg: 错误信息输出地址(可选)

返回值:

成功:SQLITE_OK 失败:错误码。

回调函数原型(用于 sqlite3_exec 执行 SELECT 语句时)
int (*callback)(void *arg, int column, char **column_values, char **column_name);

功能:执行 SELECT 语句时被调用的回调函数

参数说明:

arg: sqlite3_exec 传递的第四个参数(用户自定义数据)

column: 查询结果的列数

column_values: 指针数组,每个元素指向对应列的数据字符串

column_name: 指针数组,每个元素指向对应列的列名

注意事项:

  1. 回调函数必须返回 0 表示成功,否则 sqlite3_exec 会报错:

"sqlite3_exec error: query aborted"

  1. 从数据库查询出来的所有数据,统一以字符串类型返回(即使原数据是整数或浮点数)

  2. 每查到一条记录,回调函数就会被调用一次。

提高 SQLite 数据插入效率:

  1. 开启事务机制

所谓"事务"就是指一组 SQL 命令,这些命令要么一起执行,要么都不被执行。

在 SQLite 中,每调用一次 sqlite3_exec() 函数,就会隐式地开启一个事务。

如果插入一条数据就调用一次该函数,事务就会被反复地开启和关闭,从而增大 IO 量。

如果在插入数据前显式开启事务,插入完成后统一提交,则会大大提高 IO 效率,显著加快数据插入速度。

eg:

开启事务:

BEGIN;

将事务的修改保存到数据库中:

COMMIT;

sqlite3_exec(db, "begin;", NULL, NULL, NULL);

for (int i = 0; i < nCount; ++i)

{

sqlite3_exec(db, sql, NULL, NULL, NULL);

}

sqlite3_exec(db, "commit;", NULL, NULL, NULL);

函数:获取当前时间(可精确到微妙)
int gettimeofday(struct timeval *tv, struct timezone *tz);

功能:获取当前的时间(可以精确到微妙)

参数说明:

tv: 指向 struct timeval 的指针,用于存储当前时间

tz: 指向 struct timezone 的指针(通常传 NULL,表示不使用时区信息)

struct timeval 结构体定义:

struct timeval {

time_t tv_sec; /* 秒数(seconds) */

suseconds_t tv_usec; /* 微秒数(microseconds) */

};

相关推荐
时序数据说7 分钟前
时序数据库 IoTDB:支撑万亿级物联网设备的基石
大数据·数据库·物联网·时序数据库·iotdb
橙-极纪元9 分钟前
11种数据库类型详解-第3种:时序数据库(TSDB)
数据库·时序数据库
摆个烂10 分钟前
时序数据库深度解析:从基础概念到未来趋势
数据库·时序数据库
潲爺14 分钟前
Java IDEA学习之路:第二周课程笔记归纳
java·笔记·学习
时序数据说15 分钟前
哪些行业需要使用时序数据库?
大数据·数据库·物联网·时序数据库
开着拖拉机回家38 分钟前
【MongoDB】mongoDB数据迁移
数据库·mongodb·nosql·数据库迁移·mongodump·mongorestore
木木子999941 分钟前
MongoDB Integer
数据库·mongodb
明明真系叻42 分钟前
量子计算学习笔记(1)
笔记·学习·量子计算
Elastic 中国社区官方博客1 小时前
在 Elasticsearch 和 GCP 上的混合搜索和语义重排序
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
码农阿日1 小时前
【日常学习-理解Langchain】从问题出发,我理解了LangChain为什么必须这么设计
服务器·学习·langchain