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转换成单表查询,很容易开发界面让业务人员理解并实现这个查询。