DQL
DQL(Dimensional Query Language)是一种面向结构化数据的查询语言,主要用于多维分析,DQL可以读作[dikwl]。
SQL是当前主要的结构化数据查询语言,但由于其理论基础关系代数中对关联运算(JOIN)的定义过于简单,用SQL描述多表关联时就显得非常复杂,特别是在用于敏捷BI或自助报表等场景时,难以提供让业务人员可理解的方式实现关联查询。这样,当有新的关联查询时,就需要技术人员在后台维护新的数据集(CUBE),即数据集建模。而关联查询需求的占比要远远大于无关联查询,基于SQL就无法实现完整的敏捷BI。
为了解决SQL的这个问题,中国润乾公司在2013年提出了DQL语法,梳理了数据表的关联关系,把SQL中简单的JOIN运算分成多种情况分别处理,将多表关联问题转换成单表查询,从而极大地降低了关联运算的理解难度,可以由业务人员可理解的方式实现非常复杂的多表关联。而且,DQL看待JOIN的方式不同,还可以采用更好的算法,解决SQL实现时HASH JOIN算法难以并行的问题。
DQL仍然面向数据查询需求,因此其语法仍然延用了SQL类英语的风格。DQL中严格定义并强化了维度概念,因而命名为DQL。
DQL设计目标是敏捷BI(自助报表)的后台查询语法,弱化了SQL中的复杂计算能力,不再支持子查询和CTE语法。
目前,润乾公司已经基于SQL实现了DQL语法,即把DQL翻译成SQL执行,在润乾报表2018版的强分析版中提供此功能。另外,DQL强化维度概念后,在润乾集算器的支持下,将很容易实现多个同结构数据库的跨库联合查询,从而支持大数据的分布式查询。润乾公司还将基于进一步基于SPL实现更高性能的大数据DQL解释器。
一个DQL和SQL的对比示例:
设有如下两个表
employee | 员工表 |
id | 员工编号 |
name | 姓名 |
nationality | 国籍 |
department | 所属部门 |
department | 部门表 |
id | 部门编号 |
name | 部门名称 |
manager | 部门经理 |
employee表和delpartment表的主键都是其中的id字段,employee表的department字段是指向department表的外键,department表的manager字段又是指向employee表的外键。
查询目标:哪些美国籍员工有一个中国籍经理?
SQL代码
SELECT A.* FROM employee A JOIN department B ON A.department=B.id JOIN employee C ON B.manager=C.id
WHERE A.nationality=‘美国' AND C.nationality=‘中国'
由于employee表需要两次参与JOIN,需要为它起个别名加以区分,大部分敏捷BI产品在未建模时无法让业务人员实现这个查询。
DQL代码
SELECT * FROM employee WHERE nationality='美国' AND department.manager.nationality='中国'
把多表JOIN转换成单表查询,很容易开发界面让业务人员理解并实现这个查询。