TrivialDB-miskcooC++ 编写的 SQL 数据库引擎
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;
评论
真高!比亚迪员工爆料比亚迪在越南的薪资水平:基本工资480万,全勤奖35万,交通补助20万,餐补110万,每周6天,每天10小时
上一篇:某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...对此,你怎么看?--完--PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。全文完,感谢你的耐心阅读。如果你还想看到我的文章,请一定给本
开发者全社区
0
太敢穿了!透视纱裙!性感火辣的身材
绝了呀今天的厂花:吴宣仪1995年1月26日,吴宣仪出生于海南省海口市,中国内地流行乐女歌手、影视演员。2016年2月,吴宣仪随宇宙少女发行首张迷你专辑正式出道。2018年4月,她参加《创造101》综艺选秀,获得第二名,成功加入火箭少女101组合。吴宣仪的颜值一直备受称赞,她的五官立体精致,皮肤白皙
逆锋起笔
0
某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...
上一篇:字节的跳动职级与薪资(2024年)我们与公司间的合作,宛如两艘船只在茫茫大海上相互依靠,共同抵御风浪,携手驶向成功的彼岸。然而,当航向开始产生分歧,或是波涛汹涌的风浪改变了我们的初衷,我们或许应当冷静地选择和平分手,而非在风雨中硬撑。最近,一位网友的遭遇引起了广大职场人的关注和热议。这位网友
开发者全社区
0
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
我看阿里的年终奖总算发了!
到4月底了,这两天看朋友圈,发现阿里的年终奖终于发了,问了问老同学,也从网上检索了不少信息,基本搞清楚了阿里今年的年终奖情况。近来来阿里一些集团对绩效等级做了较大的调整,以前的旧绩效系统中,绩效分为3.25、3.5、3.75、4和5五个等级,其中4和5是较高绩效等级,较少见。而且之前3.5绩效内部划
公子龙
0
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
字节的跳动职级与薪资(2024年)
上一篇:阿里公布年终奖,P7, 3.5+,22W年终奖,还有35W长期现金激励,真香字节跳动自2012年3月成立以来,已经迅速成长为一个全球性的科技公司。其产品和服务已经遍布全球150多个国家与地区,并且支持超过75种不同的语言。在字节跳动的官方网站上,列出了一系列引人注目的产品和服务,包括但不限于
开发者全社区
0