mysql与oracle在groupby语句上的细节差异
2016-05-26 23:27
447 查看
前言
之所以去纠那么细节的问题,是因为之前有过一个这样的场景:有个同学,给了一条数据库的语句给我,问,为啥这样子的语句在oracle语句下执行不了。
select * from xx where xxx is not null group by yy;
拿到这条语句的第一时间,其实,我也并没有看出是什么错。仔细一想之后才想起,在基础的SQL中包含该group by的select语句,select语句部分是有限制的,一般是聚合函数和group by 的字段。随后,我就告诉他,这条语句本身是有错的。
然而,我同学却反驳说,这条语句他在其他数据库中是能运行的。然后,就有了这篇博客
细说
为了询证,我询问了同学他说能运行的数据库是什么数据库。结果同学说是mysql。如图所示,相同类型的语句,在oracle和mysql执行,一个是可以正常运行的,而在oracle上,却是没能通过语句的校验。为啥呢?
回过头看看,现在市场上的关系型数据库可谓不少,其实他们都在SQL语句的解析上,都遵循着SQL国际标准,只是各自遵循的严格程度不同而已,同时,各个数据库也在SQL标准上扩展开了,有了自己支持的特色的数据库语句,如mysql的limit。也就是这样,才有了上述情况。SQL标准中,其实在包含group by 的 select 语句能查询的数据是有限制的。Oracle比较严格的遵守了这一限制,而mysql 则并没有,这样才使得使用惯了mysql的朋友在刚开始的时候有这样的错觉,觉得明明正确的语句为啥就是执行不了。
思考
在标准这方面,要论对错,其实是没必要的。很多时候,标准制定出来,只是一种美好的期望而已。然而,作为技术,其实应该的更多的是回归本质,更多的了解原理,就不会因为某个工具并没严格要求的东西,养成不良的习惯。此博文同步更新于 http://blog.e65535.com/2016/05/26/mysql-oracle-groupby/
相关文章推荐
- 6.2、临时表--Oracle模式对象
- 6.1(续)索引、索引组织表--Oracle模式对象
- TimesTen可以运行在VMware上吗?
- oracle instance_name db_name db_unique_name 与监听注册
- ORACLE 多表关联 UPDATE 语句
- oracle-物化视图
- oracle将A表数据复制到B表中
- 【数据库】安装和配置Oracle客户端
- Oracle 对表设置并行度对执行计划的影响
- oracle数据库的常用命令
- oracle的新建用户表空间等
- oracle基本知识
- Tomcat 6.0 配置oracle数据库连接池
- Oracle 表空间
- Activiti 配置Oracle不能自动创建表解决方法
- Activiti 配置Oracle不能自动创建表解决方法
- Activiti 配置Oracle不能自动创建表解决方法
- 保留最后的一条数据为Y
- 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
- 查看oracle 用户执行的sql语句历史记录