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;