分布式 | DBLE 之 SQL 解析[通俗易懂]

分布式 | DBLE 之 SQL 解析[通俗易懂]作者:路路 热爱技术、乐于分享的技术人,目前主要从事数据库相关技术的研究。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 数据库中间件与数据库有…

分布式 | DBLE 之 SQL 解析


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

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

SQL 解析的定义

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

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

  • 词法分析器(Lexer):负责解析基本的词法,也就是将字符序列转换为单词(Token)序列的过程。
  • 语法分析器(Parser):将词法分析器解析出的单词(Token)序列,进一步构建成有语义的数据结构,比如抽象语法树。
  • 访问器(Visitor):能够对语法分析器生成的抽象语法树进行遍历,获取需要的信息。

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

案例解析

原始 SQL 如下:

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

代码100分

下面我们来解析这个 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 解析是为后面的路由、结果集处理等功能服务的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8741.html

(0)
上一篇 2023-02-22 17:00
下一篇 2023-02-22 18:00

相关推荐

  • 如何使用Python中的uniform函数

    如何使用Python中的uniform函数Python是一种面向对象、解释型的高级编程语言,它具有简洁、易读的语法结构以及强大的数据处理和科学计算能力,使其应用范围十分广泛。而在Python中,有很多内置函数可以帮助我们完成各种任务。其中,stronguniform()/strong函数是一个十分有用的函数,可用于生成指定范围内的浮点随机数。

    2024-08-11
    32
  • Pycharm是否取代了Python?

    Pycharm是否取代了Python?Python是一种高级编程语言,而Pycharm是一种完整的Python开发环境。许多人对这两者之间的关系感到困惑。在这篇文章中,我们将探讨Pycharm是否取代了Python,我们会从多个方面讨论这个问题,分析Pycharm和Python之间的区别和联系,帮助读者更好地理解这两种技术。

    2024-05-31
    63
  • [mysql]错误解决之”Failed to start MySQL Server”「终于解决」

    [mysql]错误解决之”Failed to start MySQL Server”「终于解决」无论你安装过多少次mysql,仍然会出现各种各样的错误,既然出现了,就想办法解决它:OK! 接下来教大家怎样查看错误日志,去解决懵逼的代码错误。 错误: 经过一些列的 重启操作、查看错误详情,并不能精

    2023-03-15
    154
  • sql触发器的使用及语法csdn_三种触发器

    sql触发器的使用及语法csdn_三种触发器
    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。常见的触发器有三种…

    2023-04-17
    145
  • MongoDB索引(7)

    MongoDB索引(7)索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。 增加检索的效率. mo

    2023-03-27
    145
  • Python中的__str__方法及其应用

    Python中的__str__方法及其应用在Python中,每个类都包含一些特殊方法,其中__str__便是其中一个。当我们调用print方法时,通常会输出该对象的一些信息。但是如果没有定义__str__方法,输出的信息不一定是我们需要的,这时就需要使用__str__特殊方法来自定义输出的格式。

    2024-02-24
    106
  • mysql 一些常用sql语句[亲测有效]

    mysql 一些常用sql语句[亲测有效]– 修改表注释 ALTER table table_name comment '需要修改注释的信息'; — 修改root 密码 ALTER USER 'root&a…

    2023-02-26
    136
  • cmake编译安装mysql_linux一键安装

    cmake编译安装mysql_linux一键安装 ##1、安装必备软件包 yum install -y gcc gcc-c++ autoconf automake bison libtool lrzsz make ncurses-devel…

    2023-03-25
    172

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注