TrivialDB-miskcoo 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
TrivialDB-miskcoo 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
授权协议: GPL-3.0
开发语言: C/C++ 查看源码 »
操作系统: 跨平台
收录时间: 2019-09-16
提 交 者: h4cd

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;
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

TrivialDB-miskcoo 的相关资讯

还没有任何资讯

TrivialDB-miskcoo 的相关博客

清华学霸直博简历火了:CPU、操作系统、编译器全自己写

综合自:zibuyu9微博、https://www.zhihu.com/question/345718537、龙芯中科等 前段时间,知乎上有条帖子火了,有人提问:清华...

[模板] tarjan/连通分量/dfs树

边的分类 有向图 有向图边分为四类: 树边, 前向边, 返祖边(后向边), 横叉边. 上图: 判定 对图进行dfs, 不考虑已经遍历过的点,...

洛谷 4389 付公主的背包——多项式求ln、exp

题目:https://www.luogu.org/problemnew/show/P4389 关于泰勒展开: https://blog.csdn.net/SoHardToNamed/article/details/...

[总结] 二项式反演学习笔记

二项式反演 其实就是两个式子: $$ f_n = \sum_{i=0}^n (-1)^i {n \choose i} g_i \Leftrightarrow g_n = \sum_{i=0}^n (-1)...

【learning】多项式相关(求逆、开根、除法、取模)

<font size=3>(首先要%miskcoo,这位dalao写的博客实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,作为...

多项式科技初步

写在前面 为了体现简洁,在每一部分只会放关键代码。 代码具有一定的通用性,保证代码之间函数的调用是合法的。 如果 MathJa...

数论之二次剩余

来自各个大佬的讲解与证明: 二次剩余Cipolla算法学习笔记 - bztMinamoto - 博客园 [数论]二次剩余及计算方法 – Miskcoo's ...

[快速变换专题][FFT/NTT/MTT/FWT/分治FFT]Duliu多项式学习笔记

Update in 2019/8/5 现在把几个算法分开了,不然太乱 欢迎选择对应算法学习。 [多项式算法](Part 1)FFT 快速傅里叶变换 学习笔...

[模板] 容斥原理: 二项式反演 / Stirling 反演 / min-max 容斥 / 子集反演 / 莫比乌斯反演

反演原理 考虑两个数列 $f_i$, $g_i$. 若存在 $a_{i,j}$, $b_{i,j}$, 使得 $$ g_n = \sum_{i=0}^n a_{n,i}f_i \tag{1.1}$$ 并...

TrivialDB-miskcoo 的相关问答

还没有任何问答,马上提问

评论 (0)

加载中
更多评论
0 评论
7 收藏
分享
返回顶部
顶部