# TNDB **Repository Path**: wharf/TNDB ## Basic Information - **Project Name**: TNDB - **Description**: 一个简单的拟数据库查询引擎,目前只能针对有特殊标头的TSV文件进行基本SQL查询。没有高级查询功能,没有质量保证,没有对应的拟存储引擎。暂时没有^_^ - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2014-03-31 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 简介: 一个模拟SQL查询的TSV文件解析器,它可以读入有特殊标头的TSV文件,并允许使用简单的SQL语句进行查询。 FAQ: 0、为什么叫TNDB (1)T代表Tab,N代表NewLine,DB就是DataBase; (2)就是说,除了 Tab 和 NewLine 符号之外,我们期望它能接受任何字符在任何位置,尤其是字段名中。 1、特殊标头的TSV文件如何制作 (1)使用任何可以制作TSV文件的工具制作普通TSV文件; (2)用纯文本编辑器打开此TSV文件,在字段行之前新建一个空行; (3)在空行输入一对方括号,其内放置数据表名字,如:[YourTable],保存关闭即可。 2、数据库名如何标识 特殊标头的TSV文件的全路径+全名就是数据库名,如果与查询主程序在同一路径下,则不需要指出特殊标头的TSV文件的路径。 3、目前支持的语法: use 数据库名; exit、quit clear、cls select ... from ... where ... group by ... having ... order by ... 4、需要注意: TSV没有数据类型区分,一切都是文本。但是,可以转换数值的,尽可能自动转换。如果出现不能自动转换的,请使用内置的转换函数。 5、内置的函数: (1)系统时间函数 date()、year()、month() 、day()、time()、hour()、minute()、second(),均无参数 (2)转换函数 tonum()、tostr(),接受字段名表达式 (3)字符串函数 reverse()、mid()、substr()、right()、left()、len()、length(),接受字段名表达式 (4)数学函数 sum()、avg(),接受字段名列表,逗号分隔 6、能支持多少层查询嵌套 硬件资源足够的前提下,无限。请格外注意,文件会被一次性装入内存,因此,如果运行失败,请检查是否内存不足装入及腾挪。 7、如何支持 union、union all 分别查询,再 cat >> ,需要时 sort 、 uniq >> 8、如何多表联合查询,a inner join b、a left join b、a right join b、a outer join b、a,b 暂时尚未实现,改成嵌套也许可以吧,抱歉了 9、如何指定排序规则 order by 子句中,可以使用“全局排序规则+局部排序规则”的方式实现排序控制。具体来说,order by 子句的首个排序字段前的排序关键字,即asc(升序)或者desc(降序),起到全局排序控制作用;每个排序字段右侧紧邻的排序关键字则是局部控制开关。如果没指定全局控制开关,或者没指定局部控制开关,则默认为升序。如果指定了局部控制开关,则局部开关的设定将会覆盖全局控制开关的设定,但仅仅作用于该字段。另外,局部排序开关支持 as 语法。例如: (1)针对字段1,字段2,字段3,全部都执行升序排列操作,则可采用下述规则之一: order by 字段1,字段2,字段3 order by asc 字段1,字段2,字段3 order by 字段1 asc,字段2 asc,字段3 asc order by asc 字段1 asc,字段2 asc,字段3 asc order by 字段1 as asc,字段2 as asc,字段3 as asc order by asc 字段1 as asc,字段2 as asc,字段3 as asc (2)针对字段1,字段3,执行升序排列操作;同时,针对字段2,执行降序排列,则可采用下述规则之一: order by 字段1,字段2 desc,字段3 order by asc 字段1,字段2 desc,字段3 order by asc 字段1 asc,字段2 desc,字段3 asc order by asc 字段1 as asc,字段2 as desc,字段3 as asc 10、未来会否继续持续改进和升级此引擎 当然会的。此引擎目前仅仅是一次测试性开发的中间输出,但在未来,它的改进版终将成为一款可商用的数据库产品的查询核心,所以,尽管它当前只能针对特殊标头的TSV文件进行查询,但决不会到此止步。即便是目前,如果对此引擎的磁盘文件读取模块做相应的调整,它就能处理任何格式的数据文件。换句话说,如果存储引擎开发完成,则其主要的,或者说是默认的,数据库文件格式将会是二进制数据文件,不会再是纯文本格式文件。这种考虑不用多言,优点很多:数据安全性提高、处理效率提升、磁盘占用降低、数据存储形式灵活性增强等等。如果把眼光放得更远一些,则数据可以单独占用和存放在一个分区上,或者一个硬盘上。如此显得更像是个数据库系统,对吧? 11、没看到我关注的功能被提及,是否还没做相关开发和支持 可能性较大,但也不一定,总之,您可以试试先,或许我已经悄悄地写进去了,呵呵。 12、一库多表,如何存储 格式如下即可: [数据表1] TSV数据 [数据表2] TSV数据 ... [数据表n] TSV数据 注意:空行会自动填入NULL字面值,如果不希望出现如此垃圾数据,请删除全部空行后再查询。如果是linux,执行 sed -i '/^$/d' yourDBfile ,你懂的。 13、示例: 参见 test 目录下bash脚本。 提示:test 示例仅仅给出了 Linux 平台上的部分操作。这意味着: (1)如果您在 Windows 平台上测试,则需要修改 bash 脚本 为 bat 或者 cmd 脚本,主要的修改包括: 主程序名、数据文件(特殊的TSV文件)编码、所有的访问路径(如果是指定绝对路径的话)。 (2)重点强调:数据文件在 Linux 平台,采用 UTF-8 编码;Windows 平台,采取 GB18030 或者 GB2312 编码。否则,遇到汉字或非ASCII码就会乱码。