简单对比MySQL和Oracle中的一个sql解析细节

php中文网
发布: 2016-06-07 16:00:48
原创
1169人浏览过

SQL的语法解析器是一个很强大的内置工具集,里面会涉及到很多的编译原理的相关知识,语法分析,词法分析。。一大堆看起来很理论的

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位。

星绘
星绘

豆包旗下 AI 写真、P 图、换装和视频生成

星绘 429
查看详情 星绘

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代码层面能够分析出问题来就一个基本目标了。

本文永久更新链接地址

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号