SQL语句的解析方法

【从零单排Golang】第九话:用go语言解析并分析sql语句的方法 在Golang的实战中,总会遇到一些场景,比如抓包分析sql指纹,或者是输入sql时检查sql的风险,这类操作都需要解析sql的工具才能够生效。今天,就来介绍一些Golang当中解析sql的工具包和使用方法,主要是tidbparser 阅读详情

 

 数据是程序处理的主要内容,它一般存储在关系型数据库中,要操作它们最终必须要通过SQL语句来完成,因此,解读分析和处理SQL语句成为程序员的基本工作内容之一,当然有时这项任务是比较乏味的,如果让计算机来完成一些基本的分析解读工作如找出SQL语句涉及了哪些表,字段和条件等,可以帮助程序员解放出部分精力,投入到更有挑战性和复杂性的任务中去,本文将就如何解析单句SQL语句提出自己的解决方案和大家探讨,希望大家不吝批评指正。

  首先说明以下单句SQL的范畴,它是指不存在嵌套的SQL语句,包括Select,insert,delete,update四大类型(具体的解析子类还有一种insert select类型),其中以select最为复杂,下面将以它为例。另关于嵌套SQL尤其是多重嵌套SQL的分析似乎比较复杂,我一时没想出好的解决方案,如果您知道请不吝赐教。

  1.关于SQL语句的预处理。

  在对sql语句进行分析之前,有必要对它进行一些预处理,这样能减轻不少后面编程的负担。

  预处理的主要工作是消除SQL语句前后的空白,将其中的连续空白字符(包括空格,TAB和回车换行)替换成单个空格;将sql语句全变成小写形式(或大写形式);在SQL语句的尾后加上结束符号,至于为什么加,这里先买个关子。具体的语句如下:

 

  2.将SQL语句分离成片段。

  经过第一步的工作,一个多行的,存在大小写混杂的SQL语句已经变成了单行的小写SQL语句,接下来我们需要把整句分离成更小的片段。以Select语句为例,其中可能存在有select子句部分,from子句部分,where子句部分,group by子句和order by子句等,如果能成功的把整句分离成这些子句,我们的分析工作又前进了一步。先让我们看看下面的SQL示例:

 

 

 

 

select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2

  通过观察我们可以发现,select子句是select c1,c2,c3 from,它的起始标志是select,结束标志是from;from子句是from t1,t2 where,它的起始标志是from,结束标志是where;where子句是where condi3=3 or condi4=5,它的起始标志是where,结束标志是order by;order by子句是order by o1,o2其起始标志是order by,刚才我们在整句SQL尾后加上了" ENDOFSQL"字样,因此,order by子句的结束标志是" ENDOFSQL"。

  这个分析给我们解析SQL语句提供了一个思路,如果我们能找到各个子句的前后标志,在正则表达式的帮助下我们就可以轻松的获得每一种子句,下面给出一个找到from子句的完整正则表达式:

  "(from)(.+)( where | on | having | groups+by | orders+by | ENDOFSQL)"

  这句正则表示式让程序到整句SQL中查找符合这样条件的文本单元:它以from开头,结束标志是where,on,having,group by,order by或语句结束中间的一个,开始标志和结束标志之间可以是任何字符。这样,from子句的各种情况就都囊括进这个正则表达式了,它能找到以下类型的各种form子句:

  from .... where

  from .... on

  from .... having

  from .... group by

  from .... order by

  from .... ENDOFSQL(这个ENDOFSQL是预处理时加上的,如果用$符号会给程序造成麻烦)

  3.找到片段中的各个部分。

  有了表示片段的正则表达式,找到片段后从中分离出片段起始标志start,片段主体body和片段结束标志end就很容易了,请见代码:

 

 

 

这段代码为什么要逐渐从SQL开头开始截取不断增长的SQL语句进行分析而不是直接对整个SQL进行查找呢?原因是表示子句的正则表达式比较贪婪,它会竭力向后寻找,比如说SQL语句是这样写的:

  select .... from .... where .... order by ....

  那么用"(from)(.+)( where | on | having | groups+by | orders+by | ENDOFSQL)"进行查找得到from子句不是

  from .... where

  而是

  from .... where .... order by

  这当然不是我们想要的结果,因此采取了从SQL开头开始截取不断增长的SQL语句进行分析,找到了from .... where部分就不用继续往下找了,当然这在效率上有降低,但一些效率的付出相对于正确的结果来说是值得的。

  4.将片段主体部分劈分开来

  还是拿from子句做例子,得到它以后我们希望继续进行分析,最终得到from子句的表,这部分工作比较简单,使用特定的标志对body进行查找劈分即可,from子句的劈分标志较多,用正则表达式写出来是“(,|s+lefts+joins+|s+rights+joins+|s+inners+joins+)”,各种情况都要涉及到。其实大多数子句主体部分的劈分标志都是逗号,用正则表达式写出来都比from子句的简单。

  劈分的代码如下,每个分隔符之间的小部分放在链表中:

 

 

 

之所以不直接使用String的split方法是因为分隔符存在多种形式,使用split方法后将无从知晓以前的劈分符是什么,比如 where c1=1 and c2=2 or c3=3,如果使用(and|or)做劈分符再用split方法,那么再还原SQL语句是将不可能知道原先的分隔符是and还是or。

  5.还原整个SQL语句。

  分析完SQL语句后,最终是要以清晰完整的形式将SQL还原出来,这一步的工作主要是将各个子句又重新组合起来,如果分析的语句是

  select c1,c2,c3 from  t1,t2, t3 where condi1=5 and condi6=6 or condi7=7 order by g1,g2

  解析后的的Sql为:

select
  c1,
  c2,
  c3
from
  t1,
  t2,
  t3
where
  condi1=5 and
  condi6=6 or
  condi7=7
order by
  g1,
  g2
到这里,我对单句SQL语句进行分析的基本思路都写完了,下面是完整的代码示例:

  工具类SqlParserUtil,这是进行SQL解析的入口

 

  单句Sql解析器基类:

 

 

下面是BaseSingleSqlParser的五种子类:

 

 

 

 

一个基于fluent超声振动仿真算例分析(含有UDF的编写设定) 一个基于Fluent的超声防堵算例 阅读详情

相关推荐

STM32电机库(ST-MC-Workbench)实战指南——三电阻电流采样电路参数配置详解

本文详细解析了STM32电机库(ST-MC-Workbench)中三电阻电流采样电路的参数配置方法,涵盖电阻选型、放大增益计算、滤波时间优化等关键步骤。通过实战案例和调试技巧,帮助工程师快速掌握电流采样技术,提升电机控制系统的精度与稳定性。特别针对ST-MC-Workbench界面参数设置提供了详细指导。

weixin_29186249的博客 505

SQL 语句解析

1.基础查询: SELECT * FROM 表 解析:此语句会将表中所有的字段查询出来,SQL执行的顺序:FROM表(找到表)=>SELECT * (查询所有字段*代表所有字段) SELECT ID,NAME FROM 表 解析:此语句会将表中所有的字段查询出来,SQL执行的顺序:FROM表(找到表)=>SELECTID,NAME (查询ID和NAME字段) 2.带条件的查询 SELECT * FROM 表 WHERE ID=1 解析:此语...

chinaherolts2008的博客 2590

智能工厂四大系统协同实战:ERP/PLM/MES/WMS集成架构与数据流解析

本文深入解析了智能工厂中ERP、PLM、MES、WMS四大核心系统的协同集成架构与数据流。通过实战案例,阐述了如何打通系统孤岛,实现从产品设计、资源计划、生产执行到仓储物流的数据无缝流转,从而构建高效、敏捷的智能工厂运营体系。

ujm567890的博客 674

sql语句全解析!

根据SQL指令完成的数据库操作的不同,可以将SQL指令分为四类SQL指令不区分大小写每条SQL表达式结束之后都以;结束SQL关键字之间都以 空格进行分割SQL之间可以不限制换行(可以有空格的地方就可以有换行)数值类型类型大小(Bytes)范围tinyint1有符号 (-128,127)无符号 (0,255)smallint2有符号 (-32 768,32 767)无符号 (0,65 535)mediumint3有符号 (-8 388 608,8 388 607)无符号 (0,16 777 215)int/i

qq_45703593的博客 3718

实战演练 | ABAQUS显式动力学分析在金属切削仿真中的应用

本文详细介绍了如何利用ABAQUS显式动力学分析进行金属切削过程的二维仿真。通过从零开始的完整流程,包括几何建模、材料本构与失效定义、网格划分、接触设置、边界条件施加,到结果后处理与切削力提取,为工程师和研究人员提供了实用的仿真方法,以优化刀具设计和加工工艺。

purple的博客 928

手推反向传播+numpy实现

反向传播的重要性不必多说,手推也是必备基础,大厂面试要求用numpy实现一下BP也是经常的事。下面以一个简单的两层网络为例(简单到连bias都没有的那种),真·手推反向传播+numpy实现。 说明: input:输入 net_h:隐层 S(x):sigmoid简写 SD(x):sigmoid导数的简写 out_h:隐层经过sigmoid激活的输出 net_o:输出层 out_o:经过经过sigmoid激活的输出层,也就是最后的输出 target(简写t1、t2):Ground...

xian0710830114的专栏 1238

SQL 解析原理和使用场景

Github 地址:https://github.com/j-easy/easy-ruleshttps://github.com/j-easy/easy-rules

琪琪的博客 5183

KEIL5编译报错L6200E:__stdout重定义问题分析与解决

本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。

uran的专栏 953

SQL 语句解析过程详解(附带完整demo)

本文主要是使用 Flex 和 Bison 工具实现一个简单的 SQL 解析器,最终生成抽象语法树!下面先分别对 Flex 和 Biosn 原理进行介绍,然后给出 SQL 解析器的完整 Demo!

热爱数据库的小胖 6817

kaggle——信用卡欺诈检测项目实战

笔记第一步:了解题目,确定任务第二步:场景分析第三步:数据预处理看是否有缺失值查看样本类别分布数据不均衡解决办法数据值标准化/归一化第四步:特征工程1)查看特征分布情况,把不同类别下特征分布相差不大的特征删除掉2)特征缩放第五步:模型训练处理不平衡样本交叉验证求取最好的模型参数第六步:模型评估使用下采样数据训练与测试使用下采样数据训练与测试(不同的阈值对结果的影响)使用下采样数据训练,原始数据进行测试原始数据进行K折交叉验证使用原始数据进行训练和测试查看ROC曲线逻辑回归阈值选择过采样总结 第一步:了解题目

weixin_45942265的博客 1万+

java写一个多人线上聊天室

课程作业谔谔

weixin_51614848的博客 1135

SQL超详细解析

(show后面的空格可以是一个也可以是多个,前提是先进入数据库)将一列数据作为一个整体,进行纵向计算。

qq_64669006的博客 3391

YOLOv13改进:注意力机制 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

BiLevelRoutingAttention方法对小目标检测效果比较好。可能是因为BRA模块是基于稀疏采样而不是下采样,一来可以保留细粒度的细节信息,二来同样可以达到节省计算量的目的。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1432

php 解析sql语句,php实现解析xml并生成sql语句的方法

本文实例讲述了php实现解析xml并生成sql语句的方法。分享给大家供大家参考,具体如下:php解析xml有很多种办法,文档中有,搜索一下就一大把的。今天遇到一个需求:将某个xml中的节点属性提取出来,然后更新数据库某一表中的字段。思路:解析XML,获取所有的节点属性 –> 循环节点集合,获取对应的属性 –> 拼接sql字符串存入一数组 –> 将数组转为字符串保存于某一文件中这里...

weixin_42510060的博客 159

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

php实现sql解析,php实现解析xml并生成sql语句的方法

本文实例讲述了php实现解析xml并生成sql语句的方法。,具体如下:php解析xml有很多种办法,文档中有,搜索一下就一大把的。今天遇到一个需求:将某个xml中的节点属性提取出来,然后更新数据库某一表中的字段。思路:解析XML,获取所有的节点属性 –> 循环节点集合,获取对应的属性 –> 拼接sql字符串存入一数组 –> 将数组转为字符串保存于某一文件中这里使用了xpath,在...

weixin_35778830的博客 130

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

php实现sql解析,php实现解析xml并生成sql语句的方法php技巧

这篇文章主要介绍了php实现解析xml并生成sql语句的方法,涉及php针对xml格式文件的读取、解析及sql字符串拼接相关操作技巧,需要的朋友可以参考下本文实例讲述了php实现解析xml并生成sql语句的方法。分享给大家供大家参考,具体如下:php解析xml有很多种办法,文档中有,搜索一下就一大把的。今天遇到一个需求:将某个xml中的节点属性提取出来,然后更新数据库某一表中的字段。思路:解析XM...

weixin_35214794的博客 191

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

基于druid语法树解析SQL语句增加limit的一种方法

在系统服务中,通常会有面向业务人员查询数据库的页面服务,方便查询并分析数据。druid版本,必须是 1.2.6 以上,一下版本对limit支持不友好。但是如果不对查询数量做限制的话,返回的数据量过大的话会导致服务挂掉。所以我们需要一个通用的对sql做长度限制的方法。

lovepeacee的博客 1063

关于SQL语句中解析变量的同时我们又希望它两边可以加上单引号的方法

很多新手在开发php接口时,会遇到用户从客户端传上来的用户名是不带单引号的字符串,但是sql语句的字符串类型需要加单引号才合法,但是我们总不能让客户端用户自己加单引号,不合逻辑,这时候我们就可以用一下方法:   例如SELECT语句中         $sql = "select * from users where username = '{$username}'";    使用   '{...

qq_40731414的博客 1625

利用 druid 的 sql parser 模块解析 sql 语句获得表名

druid 是阿里开源在 github 上面的数据库连接池,里面有一个专门解析 sql 语句的模块。 源码位置 SQL Parser 模块的介绍 相关 API druid 使用说明: druid 现在已经直接发布到了 maven 仓库中,可以直接引用。 1、新建一个 maven 工程并命名 2、在 pom.xml 文件中加入如下配置,当前最新使用 1.0.19 <dependency>...

qichangjian的博客 1万+

java 使用JSqlParser 解析sql语句中的表字段

项目中遇到要将前台传过来的sql语句中的表字段替换,这首先要解析出sql语句中的表,一开始想使用正则表达式,但由于不太熟悉就放弃了,在网上搜索,有网友提到java中有专门的类库JSqlParser用于解析sql语句字段,java就是方便,干啥都有类库,通过查阅其官方网站了解了其简单的用法,下面是一个工具方法,大家如有需要改改可以用到自己的项目上。 public static List get

u013287668的专栏 2万+

c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?

最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎。我之前做过一个解析类似C语言语法的解析器,可以解析C/C++里的运算表达式,if…else…等基本语句。我以为做个SQL语句的解析器应该是很相似的,结果却发现还是有很大区别。我一度怀疑SQL解析器要更复杂一些。类C语言的语法还是很规整的,拿表达式来说,它要么是单独一句,要么就是被括号括着,也即它有着较明确的起始界限。...

weixin_39719472的博客 299

使用Druid的SqlParser解析sql语句

使用Druid的SqlParser解析sql语句

qq_38978882的博客 1477

【Mybatis Plus】JSqlParser解析sql语句

JSqlParser 是一个用于解析 SQL 语句的 Java 库。它可以将 SQL 语句解析为一个 Java 对象树,允许你以编程的方式对 SQL 语句进行分析、修改和操作。它支持多种 SQL 语句类型,包括但不限于 SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER 等。例如,对于 SQL 语句 “SELECT column1, column2 FROM table1 WHERE column1 = ‘value’”,JSqlParser 可以将其解析为一个 Java 对象

weixin_44823875的博客 5000

如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?

大家好,我是 V 哥,今天来聊一个SQL语句解析的 Java 库,JSqlParser。

威哥爱编程,华为 HDE,鸿蒙极客、优快云博客专家、《鸿蒙 HarmonyOS 5/6 开发之路》系列图书第一作者 2128

利用jsqlparser解析SQL语句

时常会遇到很多情况,我们需要对SQL语句进行替换或者拼接。以往我们可能会用StringBuild来进行拼接。StringBuilder sql = new StringBuilder(); sql.append("select * from"); sql.append(schema); sql.append("."); sql.append(table); sql.append("where id

SteelZheng 2万+
上一篇: JSON — Java与JSON数据互转
下一篇: linux修改系统环境变量
Java2King
博客等级 码龄18年 221粉丝 77原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值