您现在的位置是:主页 > news > 西湖网站建设/百度超级链数字藏品

西湖网站建设/百度超级链数字藏品

admin2025/4/25 16:21:58news

简介西湖网站建设,百度超级链数字藏品,单页 网站 模板,电商网站建设推荐什么是SQLSQL(结构化查询语言)是一种特定于领域的语言,旨在处理关系数据库中的数据。这是一种声明性语言,因此您要描述要实现的目标(例如,给我一行id 5的数据),而不是如何实现的&am…

西湖网站建设,百度超级链数字藏品,单页 网站 模板,电商网站建设推荐什么是SQLSQL(结构化查询语言)是一种特定于领域的语言,旨在处理关系数据库中的数据。这是一种声明性语言,因此您要描述要实现的目标(例如,给我一行id 5的数据),而不是如何实现的&am…

什么是SQL

SQL(结构化查询语言)是一种特定于领域的语言,旨在处理关系数据库中的数据。这是一种声明性语言,因此您要描述要实现的目标(例如,给我一行id = 5的数据),而不是如何实现的(例如,遍历各行直到id = 5)。它具有关系代数和微积分的正式数学基础。该语言是定期更新的ISO / IEC标准,最新版本为SQL2016。这意味着,如果需要,可以对语言进行非常正式和清晰的描述。

SQL旨在处理使用数据的生命周期的许多方面:是的,您可以查询数据,但也可以创建数据格式(即表的架构)并管理对数据的访问控制。

SQL存储过程扩展

实际的SQL实现带有过程扩展,这些扩展实现了某种形式的过程编程。这些因数据库引擎而异。添加它们是为了直接在数据库上对数据执行复杂的处理,因此它们可以像传统编程语言一样强大。如果您尝试解析SQL,这也可能会更加令人头疼。

语法

有几种(通常是部分的)不同格式的语法。它们可以成为到达所需位置的良好起点。

适用于SQL-92,SQL-99和SQL-2003的BNF语法

部分的 适用于ANTLR4的Teradata SQL语法

ANTLR v4语法存储库包含以下语法 MySQL,PL / SQL,T-SQL和SQLite。

SQL解析库

有很多库可以解析不同语言的SQL。有些支持不同的数据库和不同的编程语言。这是最常用的列表。除非另有说明,否则这些库是根据开源许可证发布的。

多语言和/或多数据库

通用SQL解析器是一个商业库,支持许多数据库(DB2,Greenplum,Hana,Hive,Impala,Informix,MySQL,Netezza,Oracle,PostgreSQL,Redshift SQL Server,Sybase和Teradata)和语言(C#,VB.NET Shop,Java,C / C ++,Delphi,VB)。它可以验证SQL语法,格式化SQL并使用解析树

JSqlParser解析一条SQL语句并将其转换为Java类的层次结构。它是开源的,具有LGPL和Apache双重许可,并支持许多数据库:Oracle,SqlServer,MySQL,PostgreSQL等。

MySQL解析器

Pingcap解析器是Go中的MySQL解析器。

xwb1989 / sqlparser是Go的MySQL解析器。该解析器是从维特斯,用于MySQL水平扩展的数据库集群系统。

PHP SQL解析器是(主要)用PHP编写的MySQL(非验证)解析器。它可以通过一些修改来解析其他SQL方言。它完全支持解析最常用的SQL语句,但它只返回有关其他语句的一些信息。

的 phpmyadmin的SQL解析器是一个验证SQL词法分析器和解析器,重点是MySQL方言。考虑到它在PHPMyAdmin中的使用,它肯定已经过测试。

js-sql-parser 是JavaScript的SQL(仅选择)解析器,它将MySQL 5.7版本的SQL解析为AST。

SQLite解析器

sqlite解析器是用JavaScript编写的用于生成AST的SQLite v3的解析器。

SQL解析器

sql解析器是用纯JavaScript编写的SQL解析器。它不再维护,仅支持某些SELECT查询,但如果需要使用JavaScript,它可能比从头开始更好。

hyrise / sql解析器是C ++的SQL解析器。它将给定的SQL查询解析为C ++对象。它是与内存数据库Hyrise一起开发的,但可以单独使用。

andialbrecht / sqlparse是用于Python的非验证SQL解析器。它提供了对SQL语句的解析,拆分和格式化的支持。

K2InformaticsGmbH / sqlparse是用纯Erlang编写的可用于生产的SQL解析器。它针对Oracle PL / SQL方言。

sqlparser-rs是用Rust编写的SQL解析器。它支持SQL-92,另外还支持MS-SQL,PostgreSQL和SQL:2011。开发人员说:如果您正在评估该项目是否适合您的需求,则可能需要试验性地验证它是否支持所需的SQL子集。

moz-sql-parser是Mozilla编写的Python特有的SQL解析器。该库的主要目标是将SQL-92查询的某些子集转换为可实现JSON的解析树。

查询解析器是用Haskell编写的解析器,用于解析和分析Vertica,Hive和Presto SQL。

工具类

从SQL到编程语言或其他SQL

IO64提供了将PL / SQL转换为Java的工具。我们在上一篇文章中也看到了此工具将PL / SQL代码转换为Java

Ispirer 是一家提供工具的公司,该工具可以执行从不同SQL方言到另一种SQL方言或编程语言的数据库迁移:Ispirer MnMTK。我们已经在上一篇文章中看到了将PL / SQL代码转换为Java

SQLines SQL转换器是将SQL语言转换为其他SQL语言的开源工具。它是用C ++编写的,并实现了自己的SQL解析器。

解析说明性语言有多困难?

声明性语言的结构往往比普通编程语言更简单。例如,在声明性语言中看不到使用许多嵌套的lambda。用声明性语言编写的程序通常是一长串简单的语句。问题在于,在某些情况下,任何一条语句都可能相当复杂。这就是SQL中发生的情况。

此外,实际上有几种SQL版本。在每个数据库可以以不同的方式实现它的意义上,以及SQL标准的许多版本 因为语言在不断发展。

例如,您当然熟悉SELECT语句。就其基本格式而言,SELECT name FROM customers WHERE id = 1它很容易解析。但是,完整的语句可能相当复杂。该图像表示在SQLite中实现的SELECT语句。

4974642aa58fbd48b93e54b59e56c259.png

因此,要实现对一般情况的分析的支持肯定会花费一些时间。

设计部分语法

为此,我们将从语法开始。我们将要编写一个非常简单的代码,但是要记住以下几点:

  • SQL不区分大小写,而默认情况下,ANTLR语法是
  • 我们的输入(SQL文件)将包含一些我们不关心的数据。我们仍然需要成功解析文件,而忽略无关的输入

这些是特定于SQL和我们的方法的显着问题。它们可能不会与其他语言一起出现,或者如果我们想创建一个完整的语法。

我们需要ignore规则来保持对SQL文件结构的理解。没有这个规则,我们将无法识别和解析我们感兴趣的语句。不利的副作用是它将使忽略节点的解析树杂乱无章。例如,这是用grunANTLR测试实用程序制作的示例分析树的图形表示。

c3f3f27725c58a27924e8d4ec5a25ebf.png

概要

在本文中,我们已经看到了如何解析SQL。通常,我们的建议是:

  1. 考虑是否可以使用现有工具或库来处理SQL代码。其中一些甚至支持多种SQL语言或多种编程语言。如果您可以根据需要使用它们中的任何一个,那么它们应该是您的首选
  2. 如果要内部构建解决方案,则可以考虑从可用于主要SQL数据库的少数ANTLR语法开始。它们确实可以帮助您开始解析SQL
  3. 如果您使用的是不太常见的SQL数据库,则可能会遇到麻烦。从头开始解析SQL将是一项艰巨的工作:该语言具有相当简单的结构,但是它很大,它有很多变体,在某些情况下甚至是过程扩展。在本文中,我们看到了一些技巧,即使使用部分语法也可以开始解析。如果您只需要解析语言的一小部分,这可能是一个好方法

转自:

https://tomassetti.me/parsing-sql/​tomassetti.me