最近想做一个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语言更麻烦?相关推荐

  1. mysql高效sql语句_高效SQL优化 非常好用的SQL语句优化34条

    高效SQL优化 非常好用的SQL语句优化34条 相关软件相关文章发表评论 来源:2011/2/13 9:38:43字体大小: 作者:佚名点击:576次评论:0次标签: 类型:电子教程大小:8.5M语言 ...

  2. 存储过程中定义sql语句_学习SQL:用户定义的存储过程

    存储过程中定义sql语句 Stored procedures (SPs) are one more powerful database object we have at our disposal. ...

  3. 含有参数的sql拼接_关于SQL语句参数中为多个带.字符串。

    关于 SQL 语句参数中为多个带 ',' 的字符串 原本是这样 , 参数有 date,@didian insert into hp( 个人编号 , 身份证号 , 姓名 , 性别 , 民族 , 出生日期 ...

  4. sql select 语句_学习SQL:SELECT语句

    sql select 语句 The SELECT statement is probably the most important SQL command. It's used to return r ...

  5. 免费的sql工具_免费SQL工具

    免费的sql工具 Adminer ApexSQL CI/CD toolkit ApexSQL Compare ApexSQL Complete ApexSQL Decrypt ApexSQL Plan ...

  6. mysql超长sql查询_超长SQL怎么查询?MySQL列长度限制有哪些 | 学步园

    MySQL字符串的限制长度看似重要性不要,其实和整个MySQL数据库的安全性是息息相关的,很值得我们去深入研究分析.SQL注入攻击一直都在被广泛的讨论,然而人们却忽略了今天我将要介绍的这两个安全隐患, ...

  7. sql 缓冲池_监视SQL Server中的内存文员和缓冲池分配

    sql 缓冲池 The following article applies to SQL Server versions 2008 + 以下文章适用于SQL Server 2008 +版本 Adequ ...

  8. sql 运算符_了解SQL ANY和ALL运算符

    sql 运算符 Hello, folks! Hope you all are doing well. In this article, we will be discussing about SQL ...

  9. mysql 手工sql注入_【sql注入专题02】Mysql手工注入流程

    0x00 SQL注入的语句介绍 SQL注入的本质 sql注入的本质就是查询某个数据库下的某个表中的某些字段的内容,比如我们平时在数据库查询一条数据时操作. mysql> use security ...

  10. python处理sql数据_用 SQL 而不是 Python 处理文本数据

    很多朋友们以为 SQL 是用来处理结构化数据的:而文本是典型的非结构化数据(unstructured data).其实 SQL 可以处理文本,而且比 Python 更方便 . 这篇文章简要介绍如何用 ...

最新文章

  1. 银屑病缺乏的营养汇总(持续更新中)
  2. php 垃圾回收机制----写时复制和引用计数
  3. Windows 7 镜像制作过程
  4. 病历智能处理引擎的架构设计、实现和应用
  5. 转贴:23种设计模式的有趣见解
  6. java兄弟_java实现兄弟孩子树代码
  7. 选择排序SelectSort
  8. VS2017如何创建c语言项目
  9. 项目:心肺复苏按压仪+沁恒赤兔ch32v307+嵌入式开发
  10. HTML学习(三):排版
  11. feign.RetryableException: xxx executing POST
  12. asp.net 调试 无法显示该网页
  13. 如何启用/开启本机的IIS服务
  14. 项目实战:ASP.NET:B/S结构 个人空间相册、照片上传下载系统
  15. 在线检查英文语法神器
  16. java 图片移动代码,如何较好的移动图片
  17. 画世界怎么用光影_【色彩】色彩绘画时四种光影的运用~
  18. 杜克大学的计算机,杜克大学计算机
  19. ESP32运行MicroPython通过MQTT上报温湿度到中移OneNET物联网平台(附源码)
  20. Shiro集成Spring框架并且多Realms报错No realms have been configured! One or more realms must be ……解决办法

热门文章

  1. centos7 yum 安装mariadb
  2. HDU 1074 Doing Homework【状态压缩DP】
  3. 转载:8个让程序员追悔莫及的职业建议
  4. [No000048]程序员的成长过程中,有哪些阶段?
  5. 高性能javascript读书笔记(三.DOM 编程2)
  6. [JavaScriptC#]收藏 备忘
  7. Win10更新提示0x8024402f错误的解决方法
  8. Nginx 系列:Nginx 实践,location 路径匹配
  9. windows下文件系统格式介绍
  10. SpringBoot + MyBatis 之 Hello World