TrivialDB 是一个简单的数据库管理系统,实现了大部分常见的 SQL 语句和类型。同时支持多表连接、复杂表达式运算、多主键约束、外键约束、CHECK 约束、UNIQUE 和 DEFAULT 约束、聚集查询、利用 B+ 树索引的查询优化,同时,支持任意长度的 VARCHAR 类型。
数据库支持的基本类型有:
YYYY-MM-dd
日期类型的字面值和字符串相同,在实现中如果必要可以转换为字符串。
支持的 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 支持的基本运算主要如下
以下是一些复杂表达式运算的例子
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;
支持多种属性完整性约束,分别是
下面是一个简单的例子,注意如果在多个列都指定了 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 用