嵌入式数据库
1. 关系型嵌入式数据库
-
SQLite:
- 特点:自给自足的、零配置的、轻量级的关系型数据库,支持SQL查询。
- 应用:广泛应用于移动应用(如iOS和Android应用)、桌面应用(如应用程序设置和缓存)、嵌入式设备(如物联网设备)。
-
H2:
- 特点:Java编写的关系型数据库,支持嵌入式模式和服务器模式,支持SQL和JDBC。
- 应用:Java应用程序中的数据存储,适用于需要嵌入式数据库的桌面应用和小型服务器应用。
-
Firebird:
- 特点:支持SQL标准,具有小内存占用和高性能。
- 应用:商业和嵌入式系统中,适用于需要关系数据库支持的各种场景。
2. 键值型嵌入式数据库
-
Berkeley DB:
- 特点:高性能的嵌入式键值存储数据库,支持ACID事务,适用于高吞吐量的数据存储。
- 应用:网络设备、通信系统、分布式应用中的数据存储。
-
LevelDB:
- 特点:高效的键值存储数据库,优化了读取和写入性能,支持持久化存储。
- 应用:用于需要持久化存储的应用程序,如浏览器的本地存储、文件系统等。
-
RocksDB:
- 特点:LevelDB的改进版,支持更多功能和更高性能,优化了写入性能和空间效率。
- 应用:大数据存储、实时数据分析、缓存系统。
3. 文档型嵌入式数据库
- Embedded MongoDB :
- 特点:MongoDB的嵌入式版本,支持文档存储模型,适合需要JSON-like数据结构的应用。
- 应用:适用于需要文档型数据存储的嵌入式系统和应用。
4. 图形型嵌入式数据库
- Neo4j Embedded :
- 特点:图数据库的嵌入式版本,支持图数据模型,适用于复杂关系数据的存储和查询。
- 应用:图数据分析、推荐系统、社交网络分析等需要图形数据处理的应用。
5. 对象型嵌入式数据库
- ObjectDB :
- 特点:Java编写的对象数据库,支持直接存储Java对象,简化对象关系映射。
- 应用:Java应用中的数据存储,适用于需要面向对象的数据建模的嵌入式系统。
sqlite3数据库
SQLite3是一个轻量级的关系型数据库管理系统,它遵循ACID(原子性、一致性、隔离性和持久性)原则,广泛用于嵌入式系统和应用程序中。以下是SQLite3的一些主要特点和优势:
1. 嵌入式数据库
- SQLite是一种嵌入式数据库,意味着它不需要单独的服务器进程或系统来运行。数据库直接集成在应用程序中,适合小型和中型应用。
2. 轻量级
- SQLite是一个非常小的库,单个数据库文件通常只有几百KB。它的轻量特性使其非常适合资源有限的环境。
安装
cpp
sudo apt update
sudo apt install sqlite3 libsqlite3-dev
sqlite3
是SQLite的命令行工具。libsqlite3-dev
是SQLite的开发库,供开发者使用。
命令
1. 打开数据库
sqlite3 database_name.db
- 打开或创建一个名为
database_name.db
的数据库文件。如果文件不存在,它将被创建。
2. 创建表
CREATE TABLE table_name ( column1_name column1_type, column2_name column2_type, ... );
- 创建一个名为
table_name
的新表,并指定表的列及其数据类型。
3. 查看表结构
.schema table_name
- 显示指定表的创建SQL语句,用于查看表结构。
4. 插入数据
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
- 向指定表中插入一行数据。
5. 查询数据
SELECT column1, column2 FROM table_name WHERE condition;
- 从指定表中选择列的数据,可以使用
WHERE
子句进行条件过滤。
6. 更新数据
UPDATE table_name SET column1 = value1 WHERE condition;
- 更新指定表中符合条件的行。
7. 删除数据
DELETE FROM table_name WHERE condition;
- 从指定表中删除符合条件的行。
8. 显示表中的所有数据
SELECT * FROM table_name;
- 显示指定表中所有行的数据。
9. 删除表
DROP TABLE table_name;
- 删除指定表及其所有数据。
10. 查看所有表
.tables
- 显示当前数据库中的所有表。
11. 退出SQLite
.quit
- 退出SQLite命令行界面。
SQL语句
1. 创建表
CREATE TABLE table_name (column1 datatype constraints, column2 datatype constraints, ...);
- table_name: 表的名称。
- column1, column2, ...: 列的名称。
- datatype : 列的数据类型(例如
INTEGER
,TEXT
,REAL
)。 - constraints : 列的约束(例如
PRIMARY KEY
,NOT NULL
)。使用AUTOINCREMENT
关键字使主键值自动增长(仅对INTEGER PRIMARY KEY
列有效)。
2. 插入数据
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
- table_name: 表的名称。
- column1, column2, ...: 要插入数据的列名称。
- value1, value2, ...: 对应于列的数据值。
3. 查询数据
SELECT column1, column2, ... FROM table_name WHERE condition ORDER BY column1 [ASC|DESC];
- column1, column2, ...: 要查询的列名称。
- table_name: 表的名称。
- condition : 查询的筛选条件(例如
age > 25
),可以省略。 - ORDER BY column1 [ASC|DESC] : 按照指定列进行排序。
ASC
表示升序(默认),DESC
表示降序。
4. 删除数据
DELETE FROM table_name WHERE condition;
- table_name: 表的名称。
- condition : 删除的筛选条件(例如
age < 20
)。
5. 删除表
DROP TABLE table_name;
- table_name: 要删除的表名称。
6.自动增长主键
在 SQLite3 中,可以通过 AUTOINCREMENT
关键字使主键列的值自动递增。通常与 INTEGER PRIMARY KEY
列一起使用,以确保每次插入新行时,主键值都会自动增加并且唯一。
-
用法 :
INTEGER PRIMARY KEY AUTOINCREMENT
用于定义一个列为主键并自动递增。- 主键列 :定义为
INTEGER PRIMARY KEY AUTOINCREMENT
。 - 自动递增:插入新记录时,SQLite 会自动为该列生成一个唯一的递增整数值。
- 用途:防止主键值重复并避免手动设置主键值。
- 主键列 :定义为
7.升序和降序排序
ORDER BY
子句用于对查询结果进行排序。你可以指定一个或多个列进行排序,并选择升序(ASC
)或降序(DESC
)方式。
-
升序排序 :默认排序方式,使用
ASC
关键字,按列的值从小到大排序。如果省略ASC
,排序默认为升序。 -
降序排序 :使用
DESC
关键字,按列的值从大到小排序。ORDER BY column1 ASC
:按column1
列的升序排列查询结果。ORDER BY column1 DESC
:按column1
列的降序排列查询结果。
8.条件查找
WHERE
子句用于在查询中添加条件,从而筛选满足特定条件的记录。
-
用法 :在
SELECT
语句中使用WHERE
子句,以指定查询条件。- 条件 :可以是简单的比较(如
age > 25
)、多个条件的组合(如age > 25 AND name = 'Alice'
),或使用通配符和其他运算符进行更复杂的筛选。 - 筛选:仅返回满足条件的记录。
- 条件 :可以是简单的比较(如
9.多表联查
内联接(INNER JOIN)
内联接用于从两个表中返回所有满足联接条件的记录。只有当两个表中的记录满足联接条件时,才会包含在结果中。
-
用法 :
SELECT column1, column2, ... FROM table1 INNER JOIN table2 ON table1.common_column = table2.common_column;
-
解释:
- table1 和 table2:参与联接的两个表。
- common_column:两个表中用于联接的列。
- 返回两个表中满足联接条件的记录。
左联接(LEFT JOIN 或 LEFT OUTER JOIN)
左联接返回左表中的所有记录,即使在右表中没有匹配的记录。如果右表中没有匹配的记录,则结果中右表的列将包含空值(NULL)。
-
用法 :
SELECT column1, column2, ... FROM table1 LEFT JOIN table2 ON table1.common_column = table2.common_column;
-
解释:
- table1:左表,所有记录都会被返回。
- table2:右表,只有满足联接条件的记录会被返回。
- 如果 table2 中没有匹配的记录,table1 中的记录仍会显示,table2 的列将显示为 NULL。
右联接(RIGHT JOIN 或 RIGHT OUTER JOIN)
SQLite3 不直接支持右联接(RIGHT JOIN)。通常可以通过将表的位置互换来实现右联接的效果,即使用左联接并调换表的位置。
-
用法 :
SELECT column1, column2, ... FROM table2 LEFT JOIN table1 ON table1.common_column = table2.common_column;
-
解释:
- table2:右表,所有记录都会被返回。
- table1:左表,只有满足联接条件的记录会被返回。
- 如果 table1 中没有匹配的记录,table2 中的记录仍会显示,table1 的列将显示为 NULL。
交叉联接(CROSS JOIN)
交叉联接用于生成两个表之间的笛卡尔积,即每个表的每一行与另一个表的每一行进行组合。交叉联接会返回一个包含所有可能行组合的结果集。
-
用法 :
SELECT column1, column2, ... FROM table1 CROSS JOIN table2;
-
解释:
- table1 和 table2:参与联接的两个表。
- 结果 :生成的结果集包含 table1 中的每一行与 table2 中的每一行的所有可能组合。
- 交叉联接的结果行数等于 table1 的行数乘以 table2 的行数。
-
注意:
- 交叉联接会生成大量的行数据,特别是当两个表都有许多行时,结果集可能非常庞大。因此,通常仅在需要所有可能组合的场景下使用交叉联接。
- 交叉联接没有条件限制,它的结果集通常用于进一步的数据处理或生成测试数据。
sqlite3的C\C++函数接口
数据库操作
-
sqlite3_open(const char *filename, sqlite3 **ppDb)
- 功能:打开一个 SQLite 数据库。如果数据库不存在,会创建一个新的数据库文件。
- 参数 :
- filename:数据库文件的路径。
- ppDb :指向
sqlite3
对象的指针,用于接收数据库连接句柄。
- 返回:操作的结果代码。
-
sqlite3_close(sqlite3 *pDb)
- 功能:关闭一个已打开的 SQLite 数据库连接。
- 参数 :
- pDb:要关闭的数据库连接句柄。
- 返回:操作的结果代码。
执行 SQL 语句
-
sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*, int, char**, char**), void *data, char **errmsg)
- 功能:执行一个 SQL 语句(例如查询、插入、更新、删除)。可以同时执行多个 SQL 语句。
- 参数 :
- db:数据库连接句柄。
- sql:要执行的 SQL 语句。
- callback:执行 SQL 语句后回调的函数。
- data:传递给回调函数的用户数据。
- errmsg:指向错误信息的指针。
- 返回:操作的结果代码。
-
sqlite3_prepare_v2(sqlite3 *db, const char *sql, int length, sqlite3_stmt **stmt, const char **tail)
- 功能:预编译 SQL 语句,生成一个语句句柄,用于后续执行。
- 参数 :
- db:数据库连接句柄。
- sql:要编译的 SQL 语句。
- length:SQL 语句的长度(通常可以设为 -1)。
- stmt :指向
sqlite3_stmt
语句句柄的指针。 - tail:指向剩余 SQL 语句的指针。
- 返回:操作的结果代码。
-
sqlite3_step(sqlite3_stmt *stmt)
- 功能:执行预编译的 SQL 语句。调用此函数来逐步执行语句。
- 参数 :
- stmt:预编译的 SQL 语句句柄。
- 返回:执行状态码,指示语句的执行情况。
-
sqlite3_finalize(sqlite3_stmt *stmt)
- 功能:销毁预编译的 SQL 语句句柄,释放相关资源。
- 参数 :
- stmt:要销毁的 SQL 语句句柄。
- 返回:操作的结果代码。
结果获取
-
sqlite3_column_text(sqlite3_stmt *stmt, int col)
- 功能:获取当前行指定列的文本数据。
- 参数 :
- stmt:预编译的 SQL 语句句柄。
- col:列的索引(从 0 开始)。
- 返回:列的数据内容。
-
sqlite3_column_int(sqlite3_stmt *stmt, int col)
- 功能:获取当前行指定列的整型数据。
- 参数 :
- stmt:预编译的 SQL 语句句柄。
- col:列的索引(从 0 开始)。
- 返回:列的数据内容。
错误处理
-
sqlite3_errmsg(sqlite3 *db)
- 功能:获取最近一次操作的错误信息。
- 参数 :
- db:数据库连接句柄。
- 返回:错误信息的字符串。
-
sqlite3_errcode(sqlite3 *db)
- 功能:获取最近一次操作的错误代码。
- 参数 :
- db:数据库连接句柄。
- 返回:错误代码。
数据库工具 sqlitebrowser
安装
cpp
sudo apt update
sudo apt install sqlitebrowser
使用
cpp
sqlitebrowser + 数据库文件(.db)