简单对比MySQL和Oracle中的一个sql解析细节 (r5笔记第40天)

SQL的语法解析器是一个很强大的内置工具集,里面会涉及到很多的编译原理的相关知识,语法分析,词法分析。。一大堆看起来很理论的东东,不过看起来枯燥之余,它们的价值也更加明显。 借用一下网络中的原话:如果我们考究一下历史,就会发现很多被称为程序设计大师的人都是编译领域的高手.写出第一个微型机上运行的Basic语言的比尔盖茨,设计出Delphi的Borland的”世界上最厉害的程序员”, Sun的JAVA之父, 贝尔实验室的C++之父 起点提得有些高了,今天和大家分享的案例是一个很简单的sql语句,在MySQL中能够解析出问题,但在Oracle中就可以成功解析,通过这一个细节也能够看出一些Oracle和MySQL中的一些差别。 需要运行的语句如下: SELECT THREAD_ID, threads.NAME, SUM (COUNT_STAR) AS Totalcount, SUM(SUM_TIMER_WAIT) AS Totaltime FROM performance_schema.events_waits_summary_by_thread_by_event_name INNER JOIN performance_schema.threads USING (THREAD_ID) WHERE threads.NAME LIKE 'thread/sql/slave\-%' GROUP BY THREAD_ID, threads.NAME; ERROR 1630 (42000): FUNCTION performance.sum does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual 乍一看这个错误,感觉一定是哪里出了问题,自己找了一会没发现明显的语句问题,但是从错误来看问题似乎发生在sum字眼的附近。 简单把第1行中的 SUM (COUNT_STAR) AS Totalcount 改为SUM(COUNT_STAR) AS Totalcount 问题就引刃而解了。可以看出问题是一个很细小的问题,严格来说,确实是语句写得不够严谨。但在我的印象中Oracle似乎对这钟情况也是手到擒来,印象中没有出现过此类问题。 我们来简单在MySQL和Oracle中模拟一下这个问题,看看结果如何。 在MySQL中 create table parse_test ( id int, name varchar(30)); insert into parse_test values(1,'aa'); insert into parse_test values(2,'bb'); commit; mysql> select count(id) from parse_test; +-----------+ | count(id) | +-----------+ | 2 | +-----------+ 1 row in set (0.00 sec) mysql> select count (id) from parse_test; ERROR 1630 (42000): FUNCTION test.count does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual 在Oracle中就没有任何问题了。 create table parse_test( id number, name varchar2(30)); insert into parse_test values(1,'aa'); insert into parse_test values(2,'bb'); commit; select count(id)from parse_test; COUNT(ID) ---------- 2 select count (id) from parse_test; COUNT(ID) ---------- 2 抛开Oracle解析复杂sql语句的优势,可以看出Oracle在这种细节方面确实支持的力度要高一些。 不过最开始在MySQL出错的语句在放到Oracle里面(如果假设表结构数据都存在),也一定运行不了。原因就在于Oracle中定义的表明长度最大是30位,但是在MySQL中支持的要多不少,达64位。

mysql> create table events_waits_summary_by_thread_by_event_name567890123456789012345 ( id int, name varchar(30)); ERROR 1059 (42000): Identifier name 'events_waits_summary_by_thread_by_event_name567890123456789012345' is too long mysql> select length('events_waits_summary_by_thread_by_event_name567890123456789012345'); +-----------------------------------------------------------------------------+ | length('events_waits_summary_by_thread_by_event_name567890123456789012345') | +-----------------------------------------------------------------------------+ | 65 | +-----------------------------------------------------------------------------+ 1 row in set (0.01 sec) 当然了我也是到此为止我也是捡个小石头,弄点儿水花,对于sql解析器更深入的问题,如果细究,从MySQL代码层面能够分析出问题来就一个基本目标了。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-05-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏影子

PostgreSQL>窗口函数的用法

转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9311281.html

1161
来自专栏用户画像

实验3.4 嵌套查询

掌握SELECT语句的嵌套使用,实现多表的复杂查询,进一步理解SELECT语句的高级使用方法。

852
来自专栏青玉伏案

OracleDBA之表管理

  下面是Oracle表管理的部分,用到的测试表是oracle数据库中scott用户下的表做的测试,有的实验也用到了hr用户的数据,以下这些东西是我的麦库上存的...

1998
来自专栏鸿的学习笔记

Stream和Table的联系

传统的Table领域和目前的Stream领域看似横亘着不可跨越的鸿沟,类似于经典力学和量子力学,但Stream和Table的依然存在着相关性。在研究这个理论之前...

1052
来自专栏james大数据架构

你真的会玩SQL吗?实用函数方法汇总

你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真...

2079
来自专栏技术翻译

编写SQL查询的最佳方法

毫无疑问,编写代码更像是一门艺术,而不是一门科学。即使有经验,每个编码人员也无法编写既可读又可维护的优美代码。一般来说,当您学习编码艺术时,编码会随着经验而提高...

810
来自专栏文渊之博

介绍一种非常好用汇总数据的方式GROUPING SETS

介绍   对于任何人而言,用T-SQL语句来写聚会查询都是工作中重要的一环。我们大家也都很熟悉GROUP BY子句来实现聚合表达式,但是如果打算在一个结果集中包...

38411
来自专栏小怪聊职场

MySQL(七)|MySQL中In与Exists的区别(1)

2392
来自专栏葡萄城控件技术团队

一句SQL完成动态分级查询

在最近的活字格项目中使用ActiveReports报表设计器设计一个报表模板时,遇到一个多级分类的难题:需要将某个部门所有销售及下属部门的销售金额汇总,因为下属...

2128
来自专栏跟着阿笨一起玩NET

关于SQL Server数据库设计的感悟,请指教

有问题的时候,我经常回来博客园寻找答案,久而久之,总结了一些东西。 妄自菲薄,请大家多指出错误,并给出意见 数据库设计三范式基本原则 第一范式:数据库...

692

扫码关注云+社区

领取腾讯云代金券