嵌入式数据库

嵌入式数据库

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;

  • 解释

    • table1table2:参与联接的两个表。
    • 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;

  • 解释

    • table1table2:参与联接的两个表。
    • 结果 :生成的结果集包含 table1 中的每一行与 table2 中的每一行的所有可能组合。
    • 交叉联接的结果行数等于 table1 的行数乘以 table2 的行数。
  • 注意

    • 交叉联接会生成大量的行数据,特别是当两个表都有许多行时,结果集可能非常庞大。因此,通常仅在需要所有可能组合的场景下使用交叉联接。
    • 交叉联接没有条件限制,它的结果集通常用于进一步的数据处理或生成测试数据。

sqlite3的C\C++函数接口

数据库操作

  1. sqlite3_open(const char *filename, sqlite3 **ppDb)

    • 功能:打开一个 SQLite 数据库。如果数据库不存在,会创建一个新的数据库文件。
    • 参数
      • filename:数据库文件的路径。
      • ppDb :指向 sqlite3 对象的指针,用于接收数据库连接句柄。
    • 返回:操作的结果代码。
  2. sqlite3_close(sqlite3 *pDb)

    • 功能:关闭一个已打开的 SQLite 数据库连接。
    • 参数
      • pDb:要关闭的数据库连接句柄。
    • 返回:操作的结果代码。

执行 SQL 语句

  1. 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:指向错误信息的指针。
    • 返回:操作的结果代码。
  2. 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 语句的指针。
    • 返回:操作的结果代码。
  3. sqlite3_step(sqlite3_stmt *stmt)

    • 功能:执行预编译的 SQL 语句。调用此函数来逐步执行语句。
    • 参数
      • stmt:预编译的 SQL 语句句柄。
    • 返回:执行状态码,指示语句的执行情况。
  4. sqlite3_finalize(sqlite3_stmt *stmt)

    • 功能:销毁预编译的 SQL 语句句柄,释放相关资源。
    • 参数
      • stmt:要销毁的 SQL 语句句柄。
    • 返回:操作的结果代码。

结果获取

  1. sqlite3_column_text(sqlite3_stmt *stmt, int col)

    • 功能:获取当前行指定列的文本数据。
    • 参数
      • stmt:预编译的 SQL 语句句柄。
      • col:列的索引(从 0 开始)。
    • 返回:列的数据内容。
  2. sqlite3_column_int(sqlite3_stmt *stmt, int col)

    • 功能:获取当前行指定列的整型数据。
    • 参数
      • stmt:预编译的 SQL 语句句柄。
      • col:列的索引(从 0 开始)。
    • 返回:列的数据内容。

错误处理

  1. sqlite3_errmsg(sqlite3 *db)

    • 功能:获取最近一次操作的错误信息。
    • 参数
      • db:数据库连接句柄。
    • 返回:错误信息的字符串。
  2. sqlite3_errcode(sqlite3 *db)

    • 功能:获取最近一次操作的错误代码。
    • 参数
      • db:数据库连接句柄。
    • 返回:错误代码。

数据库工具 sqlitebrowser

安装

cpp 复制代码
sudo apt update
sudo apt install sqlitebrowser

使用

cpp 复制代码
sqlitebrowser + 数据库文件(.db)
相关推荐
安迁岚2 分钟前
【SQL Server】华中农业大学空间数据库实验报告 实验六 视图
数据库·sql·mysql·oracle·实验报告
Tech Synapse5 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
xoxo-Rachel11 分钟前
(超级详细!!!)解决“com.mysql.jdbc.Driver is deprecated”警告:详解与优化
java·数据库·mysql
乌啼霜满天24913 分钟前
JDBC编程---Java
java·开发语言·sql
色空大师26 分钟前
23种设计模式
java·开发语言·设计模式
blessing。。29 分钟前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
Bruce小鬼38 分钟前
QT文件基本操作
开发语言·qt
2202_7544215444 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
JH30731 小时前
Oracle与MySQL中CONCAT()函数的使用差异
数据库·mysql·oracle
蓝染-惣右介1 小时前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis