TrivialDB-miskcoo

C++ 编写的 SQL 数据库引擎
授权协议 GPL-3.0
开发语言 C/C++
所属分类 数据库相关、 数据库管理工具
软件类型 开源软件
地区 国产
投 递 者 文鸣
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

TrivialDB 是一个简单的数据库管理系统,实现了大部分常见的 SQL 语句和类型。同时支持多表连接、复杂表达式运算、多主键约束、外键约束、CHECK 约束、UNIQUE 和 DEFAULT 约束、聚集查询、利用 B+ 树索引的查询优化,同时,支持任意长度的 VARCHAR 类型。

系统功能

数据类型

数据库支持的基本类型有:

  • 整型(INT)
  • 浮点型(FLOAT)
  • 字符串型(VARCHAR)
  • 日期型(DATE),日期格式YYYY-MM-dd

日期类型的字面值和字符串相同,在实现中如果必要可以转换为字符串。

SQL语句

支持的 SQL 语句一共有如下几种

  • 插入语句:INSERT INTO ... VALUES ...
  • 删除语句:DELETE FROM ... WHERE ...
  • 查询语句:SELECT ... FROM ... WHERE ...
  • 更新语句:UPDATE ... SET ... WHERE ...
  • 创建数据库:CREATE DATABASE ...
  • 删除数据库:DROP DATABASE ...
  • 切换数据库:USE ...
  • 显示数据库信息:SHOW DATABASE ...
  • 创建表:CREATE TABLE ...
  • 删除表:DROP TABLE ...
  • 显示表信息:SHOW TABLE ...
  • 创建索引:CREATE INDEX ...
  • 删除索引:DROP INDEX ...

复杂表达式处理

表达式大致可以分为两种:算术表达式和条件表达式。由于采用 Bison 进行解析,可以支持任意深度嵌套的复杂表达式。TrivialDB 支持的基本运算主要如下

  • 四则运算,针对整数和浮点数进行。
  • 比较运算符,即 <=、<、=、>、>= 与 <>。
  • 模糊匹配运算符,即 LIKE,其实现采用 C++11 的正则表达式库。
  • 范围匹配运算符,即 IN,可以在表的 CHECK 约束中以及 WHERE 子句中使用。
  • 空值判定运算符,即 IS NULL 和 IS NOT NULL 两种。
  • 逻辑运算,包含 NOT、AND 和 OR 三种。

以下是一些复杂表达式运算的例子

UPDATE customer SET age = age + 1 WHERE age < 18 AND gender = 'F';
SELECT * FROM customer WHERE name LIKE 'John %son';
SELECT * FROM students WHERE grades IN ('A', 'B', 'C');
SELECT * FROM students WHERE name IS NOT NULL;

聚集查询

实现了五种聚集查询函数 COUNT、SUM、AVG、MIN 和 MAX。其中 COUNT 不支持 DISTINCT 关键字。例如

SELECT COUNT(*) FROM customer WHERE age > 18;
SELECT AVG(age) FROM customer WHERE age <= 18;

属性完整性约束

支持多种属性完整性约束,分别是

  • 主键约束。一个表可以有多个列联合起来作为主键,只有在所有主键都相同时才认为两条记录有冲突,即这种情况下主键是一个元组。
  • 外键约束,每个域都可以有外键约束,引用另外一个表的主键。
  • UNIQUE 约束,该约束限制某一列的值不能重复。
  • NOT NULL 约束,该约束限制某一列不能有空值。
  • DEFAULT 约束,该约束可以在 INSERT 语句不指定值是给某列赋予一个默认值。
  • CHECK 约束,该约束可以对表中元素的值添加条件表达式的检查。

下面是一个简单的例子,注意如果在多个列都指定了 PRIMARY KEY,那么就认为主键是一个元组,而不是有多个主键。例如 Infos 表的主键为(PersonID, InfoID)。

CREATE TABLE Persons (
    PersonID int PRIMARY KEY NOT NULL,
    Name varchar(20),
    Age int DEFAULT 1,
    Gender varchar(1),
    CHECK (Age >= 1 AND Age <= 100),
    CHECK (Gender IN ('F', 'M'))
);

CREATE TABLE Infos (
    PersonID int PRIMARY KEY,
    InfoID int PRIMARY KEY,
    FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
);

多表连接查询

在 SELECT 语句中,我们支持任意多表的连接操作,例如

SELECT * FROM A, B, C WHERE A.ID = B.ID AND C.Name = A.Name

并且,对于多个表的连接中形如 A.Col1 = B.Col2 的条件,那么如果这两个列的某一个拥有索引,会利用索引进行查询优化。例如如下查询就可以优化

SELECT * FROM Persons, Infos WHERE Persons.PersonID = Infos.PersonID;
SELECT * FROM Persons, Infos, Datas WHERE Persons.PersonID = Infos.PersonID AND Datas.N IS NOT NULL;
SELECT * FROM Persons, Infos, Datas WHERE Persons.PersonID = Infos.PersonID AND Datas.ID = Infos.PersonID;

具体的优化方法以及何种查询可以优化见文档中"查询优化"部分。

表别名

我们在多表连接查询时支持通过别名(alias)的方式对一个表进行连接,例如

SELECT * FROM Persons AS P1, Persons AS P2 WHERE P1.PersonID = P2.PersonID;
 相关资料
  • 问题内容: 我对学习数据库引擎的工作方式(即它的内部)感兴趣。我知道CS中讲授的大多数基本数据结构(树,哈希表,列表等),以及对编译器理论的很好理解(并实现了一个非常简单的解释器),但我不知道该怎么做关于编写数据库引擎。我已经搜索了有关该主题的教程,但找不到任何教程,因此我希望其他人可以向我指出正确的方向。基本上,我想了解以下信息: 数据如何在内部存储(即表的表示方式等) 引擎如何查找所需的数据(

  • 问题内容: 我希望我的问题不会很荒谬,因为令人惊讶的是,就流行的网站而言(据我所知)显然还没有真正问过这个问题。 情况是我有几个csv文件,总共包含1个以上的Mio观测值。每个观察结果都包含一个邮政地址。我打算将所有文件读入一个GeoDataFrame中,对地址进行地理编码,在给定shapefile的情况下执行空间连接,并为每行保存来自多边形的一些信息。我想是相当标准的。这是一次性数据清理过程的一

  • 问题内容: 我想编写以下功能,该功能应在Excel工作表中使用: …这将通过ODBC在内部连接到SQL数据库,然后在其中执行 并将返回结果值作为函数GetRecField的结果。上面的SQL被授权仅返回一个记录(IOW KEY_FIELD具有唯一约束)。 当然,上面的函数可以在工作表中多次调用,所以请尽量避免盲目 TIA。 问题答案: 您可以编写一个自定义函数来做到这一点 打开VBA编辑器(ALT

  • 在一个Web App中,所有数据,包括用户信息、发布的日志、评论等,都存储在数据库中。在awesome-python-app中,我们选择MySQL作为数据库。 Web App里面有很多地方都要访问数据库。访问数据库需要创建数据库连接、游标对象,然后执行SQL语句,最后处理异常,清理资源。这些访问数据库的代码如果分散到各个函数中,势必无法维护,也不利于代码复用。 此外,在一个Web App中,有多个

  • 然后,test class如下所示(为了简单起见,只显示了2个测试): 最后,这里是存储库实现(CRUD)的示例: 如果我单独运行这些测试,每个测试都没有问题地通过。但是,如果我从运行所有测试,那么我就会遇到随机问题,因为数据库事务没有回滚,而是在测试之间保存和共享数据。 共享固定装置更新: 不幸的是,在批量运行我的代码测试时,结果是相同的(我保存的数据在每次测试后都会递增,而不是丢弃) 我尝试的

  • TrivialDB 是一款轻量级的专门用于存放Key-Value形式的Json数据的持久化数据库,概念上它是lodash 封装了纯JS对象,便于版本同步。 创建命名空间: var trivialdb = require('trivialdb');// Create a namespacevar ns = triviadb.ns('test-ns');// Create a namespace wi

  • 本文向大家介绍SQL SEVER数据库重建索引的方法,包括了SQL SEVER数据库重建索引的方法的使用技巧和注意事项,需要的朋友参考一下 一.查询思路 1.想要判断数据库查询缓慢的问题,可以使用如下语句,可以列出查询语句的平均时间,总时间,所用的CPU时间等信息 2.列出数据库每个表的数据量,并且需要运维人员对业务足够了解,知道大概哪些表是查询量最多的,可以查看“排在前面的表的磁盘使用情况”:

  • 通过使用 DROP 语句,可以轻松地删除索引、表和数据库。 DROP INDEX 语句 DROP INDEX 语句用于删除表中的索引。 用于 MS Access 的 DROP INDEX 语法:DROP INDEX index_name ON table_name 用于 MS SQL Server 的 DROP INDEX 语法:DROP INDEX table_name.index_name 用