c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?
最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎。我之前做过一个解析类似C语言语法的解析器,可以解析
C/C++里的运算表达式,if…else…等基本语句。我以为做个SQL语句的解析器应该是很相似的,结果却发现还是有很大区别。我一度怀疑SQL解析
器要更复杂一些。
类C语言的语法还是很规整的,拿表达式来说,它要么是单独一句,要么就是被括号括着,也即它有着较明确的起始界限。比如if(x >
100 && y >
50)…这样一句,当碰到“(”时即转入解析表达式的状态,到遇到“)”时表达式结束,这毫无悬念。但在SQL里,可能有这种情况:select *
from tb where x > 100 and y > 50 order by
x;这时where条件的表达式终止不是很明显了,或许你可以说以order by结束,但如果没有order
by,而是limit呢?所以说SQL里表达式解析的情况要复杂一些了,因为它的语法不是十分规整。
对于字段列表,情况也比较复杂。字段列表里可以包含的情况有:普通字段列表、带表名的字段列表、函数、简单运算表达式等,而这些又均可以有as重命名部分,函数、表达式里又可以引用字段名。
还有一个比解析类C语言麻烦的地方就是,SQL里多了个倒引号“`”,且并非必用,这又是它不规整的一个表现。一般用程序自动生成SQL语句或碰到表名、字段名正好是SQL保留关键字时为消除歧义而加上倒引号,而一般人写SQL语句时,多数是懒得加这个的。
SQL里的“*”号是又一个麻烦。它既可以做通配,又可以做运算符。比如select * from
tb;这里的“*”是通配符,表示取所有字段,而select
10*10;则表示取10与10相乘的结果。这是一个不小的混乱,在类C语言里一般找不到这么灵活的语法。C语言是灵活的,但它的语法是相当严谨的。细翻
C语言,运算符全部是符号,标示符则不允许任何除下划线以外的符号;C++里仅有“new”算一个例外,它虽然是个单词,却属于运算符。而在SQL里用单
词做运算符却又非常常见,像“and”、“or”等。
最后想说的是像“order by”、“left join”这样的词组式的关键字。词组式的关键词应用在C语言里几乎没有。C语言的else
if其实可以忽视,把后面的if理解为else语句即可。我把惯用的C语言缩进格式修改一下或许你就一下子明白else if只是两个语句碰到了一块:
if(expr){
//...
} else
if(expr2) {
//...
} else {
//...
}
上面的代码格式一目了然,else与if只是上演一场奇遇而已。至于C++/Java中类似public
static这样的组合,它们是分别表意,而通常没有组合意义,最多是组合冲突。组合表意会使语言解析的难度提高一个层次,一般的编译器分析完词法,就可
以分析语法了;加入词语组合后这中间就不得不多一道工序,做词组分析。相应的语法分析自然也要随之调整。
当然,SQL里的词组还是比较简单、有限的,在预处理时进行合并也是可以的。SQL语言也并不是非常复杂,只是如果想着把解析类C语言的方法搬过来套用,就会有不少麻烦了。
综上所述,SQL语言结构上终止不明确,运算符与标示符界限不明确,符号有歧义,又有许多词组,使得它的解析与类C语言的解析有很大不同,必须单独对待,切务小看了简单的SQL语言。
c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?相关推荐
- mysql高效sql语句_高效SQL优化 非常好用的SQL语句优化34条
高效SQL优化 非常好用的SQL语句优化34条 相关软件相关文章发表评论 来源:2011/2/13 9:38:43字体大小: 作者:佚名点击:576次评论:0次标签: 类型:电子教程大小:8.5M语言 ...
- 存储过程中定义sql语句_学习SQL:用户定义的存储过程
存储过程中定义sql语句 Stored procedures (SPs) are one more powerful database object we have at our disposal. ...
- 含有参数的sql拼接_关于SQL语句参数中为多个带.字符串。
关于 SQL 语句参数中为多个带 ',' 的字符串 原本是这样 , 参数有 date,@didian insert into hp( 个人编号 , 身份证号 , 姓名 , 性别 , 民族 , 出生日期 ...
- sql select 语句_学习SQL:SELECT语句
sql select 语句 The SELECT statement is probably the most important SQL command. It's used to return r ...
- 免费的sql工具_免费SQL工具
免费的sql工具 Adminer ApexSQL CI/CD toolkit ApexSQL Compare ApexSQL Complete ApexSQL Decrypt ApexSQL Plan ...
- mysql超长sql查询_超长SQL怎么查询?MySQL列长度限制有哪些 | 学步园
MySQL字符串的限制长度看似重要性不要,其实和整个MySQL数据库的安全性是息息相关的,很值得我们去深入研究分析.SQL注入攻击一直都在被广泛的讨论,然而人们却忽略了今天我将要介绍的这两个安全隐患, ...
- sql 缓冲池_监视SQL Server中的内存文员和缓冲池分配
sql 缓冲池 The following article applies to SQL Server versions 2008 + 以下文章适用于SQL Server 2008 +版本 Adequ ...
- sql 运算符_了解SQL ANY和ALL运算符
sql 运算符 Hello, folks! Hope you all are doing well. In this article, we will be discussing about SQL ...
- mysql 手工sql注入_【sql注入专题02】Mysql手工注入流程
0x00 SQL注入的语句介绍 SQL注入的本质 sql注入的本质就是查询某个数据库下的某个表中的某些字段的内容,比如我们平时在数据库查询一条数据时操作. mysql> use security ...
- python处理sql数据_用 SQL 而不是 Python 处理文本数据
很多朋友们以为 SQL 是用来处理结构化数据的:而文本是典型的非结构化数据(unstructured data).其实 SQL 可以处理文本,而且比 Python 更方便 . 这篇文章简要介绍如何用 ...
最新文章
- 银屑病缺乏的营养汇总(持续更新中)
- php 垃圾回收机制----写时复制和引用计数
- Windows 7 镜像制作过程
- 病历智能处理引擎的架构设计、实现和应用
- 转贴:23种设计模式的有趣见解
- java兄弟_java实现兄弟孩子树代码
- 选择排序SelectSort
- VS2017如何创建c语言项目
- 项目:心肺复苏按压仪+沁恒赤兔ch32v307+嵌入式开发
- HTML学习(三):排版
- feign.RetryableException: xxx executing POST
- asp.net 调试 无法显示该网页
- 如何启用/开启本机的IIS服务
- 项目实战:ASP.NET:B/S结构 个人空间相册、照片上传下载系统
- 在线检查英文语法神器
- java 图片移动代码,如何较好的移动图片
- 画世界怎么用光影_【色彩】色彩绘画时四种光影的运用~
- 杜克大学的计算机,杜克大学计算机
- ESP32运行MicroPython通过MQTT上报温湿度到中移OneNET物联网平台(附源码)
- Shiro集成Spring框架并且多Realms报错No realms have been configured! One or more realms must be ……解决办法