{{ item.name }}
{{ item.name }}

{{ it.name }}

{{ it.text }}

{{ it.name }}

{{ innerIt.name }}

{{ innerIt.text }}

{{news.time}}
{{news.title}}
分布式|DBLE之SQL解析
2020-05-21发布 1,093浏览

数据库中间件与数据库有什么区别?

个人认为除了没做数据存储,其他的功能数据库中间件几乎一样不少,比如 SQL 解析、结果及处理、协议实现等。


SQL 解析的定义

今天我们主要来谈谈 SQL 解析,SQL 的全称为 Structured Query Language,即结构化查询语言,既然定义为语言,那其实它和任何其他语言都是平等的。所以对 SQL 的解析完全等同于对任何一门语言的解析,对编程语言的解析这就涉及到编译原理相关知识了。

想要解析一门语言,通常需要具备以下工具:

  • 词法分析器(Lexer):负责解析基本的词法,也就是将字符序列转换为单词(Token)序列的过程。

  • 语法分析器(Parser):将词法分析器解析出的单词(Token)序列,进一步构建成有语义的数据结构,比如抽象语法树。

  • 访问器(Visitor):能够对语法分析器生成的抽象语法树进行遍历,获取需要的信息。

上面的定义可能大家看完还有点懵懂,这里我通过一个实际的例子来让大家有个更具体的认识。


案例解析

原始 SQL 如下:

SELECT id, name FROM test WHERE ID > 2 LIMIT 2;

下面我们来解析这个 SQL:

1. 词法分析

词法分析是将字符序列转换为单词(Token)序列的过程,所以上面的 SQL 经过词法分析后,将会变成这样一串序列:

分布式|DBLE之SQL解析-爱可生


是的,大家也许看出来了,词法分析就是拆分字符序列(是的,没错,我们都能自己写个词法分析器)。

2. 语法分析

语法分析是将词法分析器解析出的单词(Token)序列,进一步构建成有语义的抽象语法树(为什么是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节,比如上面拆分出来的“,”就不需要在数据结构中展现了)。

经过语法分析,上述序列将呈现如下结构:

分布式|DBLE之SQL解析-爱可生


同学们看到这里,应该知道语法分析器的作用了吧,其实就是把单词(TOKEN)序列转换成相应的数据结构,因为是树形的,又是“抽象”的,所以就叫抽象语法树了,看起来高端,其实大家也能自己写个语法分析器。

完成了上面两步,SQL 语法解析就已经完成了,至于遍历器,其实就是访问抽象语法树中的结构的。


结论

对于 SQL 解析,难道我们真的要手写吗?答案是当然不用啦,毕竟我们不是第一个吃螃蟹的人,DRUID 已经帮我们实现了 SQL 解析的功能,所以我们可以直接拿来用。DRUID 中的词法分析器以及语法分析器都是纯手写的,效率也很快。这里同学们可能会问,难道还有不用手写的吗?答案是肯定的,ANLTR 就可以帮你生成相应的解析器,不过还是需要你定义规则的。

DBLE 中 SQL 解析用的是 DRUID 实现,其实 SQL 解析说白了就是理解 SQL,理解了 SQL 就知道它要干嘛了,所以 DBLE 中的 SQL 解析是为后面的路由、结果集处理等功能服务的。


关于爱可生

爱可生成立于2003年,依托于融合、开放、创新的数据处理技术和服务能力,为大型行业用户的特定场景提供深度挖掘数据价值的解决方案。

公司持续积累的核心关键技术,覆盖到分布式数据库集群、云数据平台、数据库大体量运管平台、海量数据集成于存储、清洗与治理、人工智能分析挖掘、可视化展现、安全与隐私保护等多个领域。

公司已与多个行业内的专业公司建立了长期伙伴关系,不断促进新技术与行业知识相结合,为用户寻求新的数据驱动的价值增长点。公司已在金融、能源电力、广电、政府等行业取得了众多大型用户典型成功案例,获得了市场的认可和业务的持续增长。

上一篇
MySQL主机该如何配置fs.aio-max-nr
400-820-6580 13916131869
marketing@actionsky.com
上海市闵行区万源路2138号泓茂中心2号楼
产品详情
关系型数据库
AI数据库
数据库智能管理平台
数据库生态产品
行业案例
金融行业
新零售行业
制造业
通信行业
更多
公司动态
最新新闻
国产化信息
技术分享
关于我们
公司简介
公司分布
国家专利
资质认证
扫码关注公众号
© Copyright 2017, All rights reserved by: 上海爱可生信息技术股份有限公司 沪ICP备12003970号-1 | 法律声明 | 网站地图
沪公网安备 31010402003331号