{"id":13645564,"url":"https://github.com/miskcoo/TrivialDB","last_synced_at":"2025-04-21T14:31:36.661Z","repository":{"id":81686871,"uuid":"141345098","full_name":"miskcoo/TrivialDB","owner":"miskcoo","description":"A simple database engine with common SQL queries support. Final project for course 'Introduction to Databases' of Tsinghua University, Fall 2018. ","archived":false,"fork":false,"pushed_at":"2019-01-08T19:45:03.000Z","size":479,"stargazers_count":148,"open_issues_count":0,"forks_count":41,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-06T04:41:21.327Z","etag":null,"topics":["database","database-manager"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/miskcoo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2018-07-17T21:24:25.000Z","updated_at":"2024-11-06T20:43:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"585d6fec-9f9f-408f-943d-e55e76697a42","html_url":"https://github.com/miskcoo/TrivialDB","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miskcoo%2FTrivialDB","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miskcoo%2FTrivialDB/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miskcoo%2FTrivialDB/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miskcoo%2FTrivialDB/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/miskcoo","download_url":"https://codeload.github.com/miskcoo/TrivialDB/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250070173,"owners_count":21369839,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","database-manager"],"created_at":"2024-08-02T01:02:37.367Z","updated_at":"2025-04-21T14:31:36.356Z","avatar_url":"https://github.com/miskcoo.png","language":"C++","funding_links":[],"categories":["C++"],"sub_categories":[],"readme":"# TrivialDB —— A Simple Database Engine\n\nTrivialDB是一个简单的数据库管理系统，我们实现了大部分常见的SQL语句和类型。同时支持多表连接、复杂表达式运算、多主键约束、外键约束、CHECK约束、UNIQUE和DEFAULT约束、聚集查询、利用B+树索引的查询优化，同时，我们支持任意长度的VARCHAR类型。\n\n## 编译及运行\n\n你需要有支持C++11特性的编译器，以及Bison和Flex两个库。本项目通过CMake来构建，在根目录运行\n\n```shell\nccmake .\n```\n\n进行编译选项的设置，之后运行\n\n```shell\ncmake .\nmake -j8\n```\n\n进行项目的编译，编译后的可执行程序在`build/trivial_db`目录下。\n\n编译后可以选择在`testcase`目录下运行`python3 run_test.py`运行测试程序。\n\n## 系统功能\n\n### 数据类型\n\n数据库支持的基本类型有：\n\n * 整型（INT）\n * 浮点型（FLOAT）\n * 字符串型（VARCHAR）\n * 日期型（DATE），日期格式`YYYY-MM-dd`\n\n日期类型的字面值和字符串相同，在实现中如果必要可以转换为字符串。\n\n### SQL语句\n\n我们支持的SQL语句一共有如下几种\n\n * 插入语句：`INSERT INTO ... VALUES ...`\n * 删除语句：`DELETE FROM ... WHERE ...`\n * 查询语句：`SELECT ... FROM ... WHERE ...`\n * 更新语句：`UPDATE ... SET ... WHERE ...`\n * 创建数据库：`CREATE DATABASE ...`\n * 删除数据库：`DROP DATABASE ...`\n * 切换数据库：`USE ...`\n * 显示数据库信息：`SHOW DATABASE ...`\n * 创建表：`CREATE TABLE ...`\n * 删除表：`DROP TABLE ...`\n * 显示表信息：`SHOW TABLE ...`\n * 创建索引：`CREATE INDEX ...`\n * 删除索引：`DROP INDEX ...`\n\n### 复杂表达式处理\n\n表达式大致可以分为两种：算术表达式和条件表达式。由于采用Bison进行解析，可以支持任意深度嵌套的复杂表达式。我们所支持的基本运算主要如下\n\n * 四则运算，针对整数和浮点数进行。\n * 比较运算符，即\u003c=, \u003c, =, \u003e, \u003e=, \u003c\u003e。\n * 模糊匹配运算符，即LIKE，其实现采用C++11的正则表达式库。\n * 范围匹配运算符，即IN，可以在表的CHECK约束中以及WHERE子句中使用。\n * 空值判定运算符，即IS NULL和IS NOT NULL两种。\n * 逻辑运算，包含NOT、AND和OR三种。\n\n以下是一些复杂表达式运算的例子\n\n```sql\nUPDATE customer SET age = age + 1 WHERE age \u003c 18 AND gender = 'F';\nSELECT * FROM customer WHERE name LIKE 'John %son';\nSELECT * FROM students WHERE grades IN ('A', 'B', 'C');\nSELECT * FROM students WHERE name IS NOT NULL;\n```\n\n### 聚集查询\n我们实现了五种聚集查询函数COUNT、SUM、AVG、MIN和MAX。其中COUNT不支持DISTINCT关键字。例如\n\n```sql\nSELECT COUNT(*) FROM customer WHERE age \u003e 18;\nSELECT AVG(age) FROM customer WHERE age \u003c= 18;\n```\n### 属性完整性约束\n我们支持多种属性完整性约束，分别是\n\n * 主键约束。一个表可以有多个列联合起来作为主键，只有在所有主键都相同时才认为两条记录有冲突，即这种情况下主键是一个元组。\n * 外键约束，每个域都可以有外键约束，引用另外一个表的主键。\n * UNIQUE约束，该约束限制某一列的值不能重复。\n * NOT NULL约束，该约束限制某一列不能有空值。\n * DEFAULT约束，该约束可以在INSERT语句不指定值是给某列赋予一个默认值。\n * CHECK约束，该约束可以对表中元素的值添加条件表达式的检查。\n\n下面是一个简单的例子，注意如果在多个列都指定了PRIMARY KEY，那么就认为主键是一个元组，而不是有多个主键。例如Infos表的主键为(PersonID, InfoID)。\n```sql\nCREATE TABLE Persons (\n    PersonID int PRIMARY KEY NOT NULL,\n    Name varchar(20),\n    Age int DEFAULT 1,\n    Gender varchar(1),\n    CHECK (Age \u003e= 1 AND Age \u003c= 100),\n    CHECK (Gender IN ('F', 'M'))\n);\n\nCREATE TABLE Infos (\n    PersonID int PRIMARY KEY,\n    InfoID int PRIMARY KEY,\n    FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)\n);\n```\n### 多表连接查询\n在SELECT语句中，我们支持任意多表的连接操作，例如\n```sql\nSELECT * FROM A, B, C WHERE A.ID = B.ID AND C.Name = A.Name\n```\n并且，对于多个表的连接中形如A.Col1 = B.Col2的条件，那么如果这两个列的某一个拥有索引，会利用索引进行查询优化。例如如下查询就可以优化\n\n```sql\nSELECT * FROM Persons, Infos WHERE Persons.PersonID = Infos.PersonID;\nSELECT * FROM Persons, Infos, Datas WHERE Persons.PersonID = Infos.PersonID AND Datas.N IS NOT NULL;\nSELECT * FROM Persons, Infos, Datas WHERE Persons.PersonID = Infos.PersonID AND Datas.ID = Infos.PersonID;\n```\n具体的优化方法以及何种查询可以优化见文档中\"查询优化\"部分。\n### 表别名\n我们在多表连接查询时支持通过别名（alias）的方式对一个表进行连接，例如\n```sql\nSELECT * FROM Persons AS P1, Persons AS P2 WHERE P1.PersonID = P2.PersonID;\n```\n## Acknowledgments\n\n* 参考了往届的项目 https://github.com/Harry-Chen/SimpleDB\n* SQL解析器部分参考了 https://github.com/thinkpad20/sql\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiskcoo%2FTrivialDB","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmiskcoo%2FTrivialDB","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiskcoo%2FTrivialDB/lists"}