iSTLsql( i 谐音“爱”,STL 即 C++ 标准模板库)是一个简单的 SQL 数据库,取名为 iSTL 体现了对 C++ 标准库的热爱和高度评价。自主设计,100%原创,
目前支持白老师大作业要求的所有功能
环境:Ubuntu-22.04,g++ 11.2.0
数据文件暂时存储在 ./testdata.in 中,以 SQL 语句的形式存储,可以作为示例参考,仅支持少量 SQL 语句,语法相较实际 SQL 语句有差异,具体后面 SQL Grammar 和 Example
数据库由四级结构组成:一个数据库整体内有多个数据库,一个数据库有多张表,一张表有多条数据和多个索引,一条数据有很多列。前三者使用双向链表耦合,最后一个使用 std::vector<string> 和 std::vector<int> 表示每一行数据。索引的数据结构一开始计划使用算法竞赛常用平衡树 Splay 来代替 Btree 实现,后来意识到 std::multiset 就能实现所需功能了,不需要用到查询第 k 小等更复杂的平衡树功能,同时考虑到时间成本和更多使用 C++ 特性的作业要求,最后选择使用 std::multiset 作为索引数据结构。使用课上完成的 dlist 双向链表模板作为数据库内的基本数据结构。
完成过程中遇到的问题大多都记录在了 ./踩坑记录.md 内,还未完全解决。learn.cpp 和 test.cpp 是写代码过程尝试使用没用过的新语法留下的学习记录。
make
./main✅ auto 类型推导与函数返回值推导,基于区间的 for,结构化绑定,函数默认参数值
✅ C++ 强类型枚举类 enum class,左值引用,using 定义新类型
✅ std::string, std::unordered_map, std::multiset
✅ std::stringstream, std::vector, std::tuple
✅ lambda 表达式(匿名函数), std::functional
✅ 类模板 template,回调函数 (callback),重载(operator)二元运算符
✅ 类 class(构造函数,析构函数,虚函数 virtual )
✅ 自定义异常与异常处理
✅ noexcept, nullptr
✅ 白老师的双向链表模板 dlist.h
✅ Linux 下终端颜色渲染(借用白老师的代码)
❌ C++ 输入缓冲区清空存在问题
相比作业要求目前增加了show语句
-
create database
功能:创建数据库
语法:
create database <dbname>
注:尖括号<>标记括起了参数。在使用时,须给出具体的名字。例如: create database person 以下同此。
-
drop database
功能:删除数据库
语法:
drop database <dbname>
-
show databases
功能:展示当前存在的数据库
show databases
-
use
功能:切换数据库
语法:
use <dbname>
注:使用该语句后将切换到对应数据库内操作,不能再使用命令 1-4,如需使用请执行 exit
-
exit
功能:退出当前数据库(已经
use <dbname>后)或退出整个数据库exit
-
create table
功能:创建表
语法:
create table <table-name> (<column> <type> [primary], …)
数据类型
<type>仅支持int和string如果指定列是 primary(主键),则为表建立索引
注:
<table-name>后必须有空格,(与<column>之间不能有空格,每个,后也需要有空格,)前不能有空格 -
drop table
功能:删除表
语法:
drop table <table-name>
-
show table
功能:展示当前所在数据库存在的表
语法:
show tables
-
select
功能:根据条件(如果有)查询表,显示查询结果。
语法:
select <column> from <table> [ where <cond> ]<column>:<column-name>|*- 暂时仅支持单列查询,
*表示所有列
- 暂时仅支持单列查询,
- where 子句:可选。如无,表示无条件查询。
<cond>:<column><op><const-value><op>:=,<,>三者之一
-
insert
功能:在表中插入数据。
语法:
insert <table> values(<const-value>[, <const-value>…])
注意:
values与(之间不能有空格
create testbase
use testbase
select id from employee where id < 70
select id from employee where id = 65
select phone from employee where salary > 8000
select salary from employee
select salary from employee where phone > "18723332333"
select * from employee
select * from employee where salary < 10000
select * from mytable
select * from mytable where comment = "ddw"

