mysql与oracle在groupby语句上的细节差异

前言

之所以去纠那么细节的问题,是因为之前有过一个这样的场景:

有个同学,给了一条数据库的语句给我,问,为啥这样子的语句在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/

时间: 2024-08-22 19:54:39

mysql与oracle在groupby语句上的细节差异的相关文章

MySQL与Oracle在SQL语句写法上的一些差异

1.单分组函数 2.

MySQL与Oracle的大小写问题

转载来源:http://aofengblog.blog.163.com/blog/static/63170212010101065030136/ MySQL与Oracle在大小写处理上的区别: 1MYSQL 1.在Windows下,数据库名.表名.字段名不区分大小写.2.大Linux/Unix下,数据库名.表名区分大小写,字段名不区分大小写.3.编辑/etc/my.cnf,设置lower_case_table_names可以让MySQL是否区分表名的大小写. 0:区分大小写:1:不区分大小写.

Linq Mysql GroupBy语句的问题处理

语句如下: var resumeList = db.ChannelResume.Where(model); var groupValues = resumeList.GroupBy(t => new {t.AgentId, t.AgentName}); var statistics = groupValues.Select(c => new ResumeStatisticsViewModel() { Date = dateSpan, AgentId = c.Key.AgentId, Agent

oracle mysql sql serve where in 语句的不同

类似这样的语句在mysql  oracle 是可以执行成功的, select * from classfirst where (classid ,classname) not in (select classid, classname from classfirst where classid=2 ) 但是在sql server 中提示以下错误 消息 4145,级别 15,状态 1,第 1 行在应使用条件的上下文(在 ',' 附近)中指定了非布尔类型的表达式. 所以在日常的使用中对于sql  s

27 MySQL与Oracle在语法上的一些不同点

MySQL与Oracle mysql与Oracle不同,Oracle中用户登录连接了同一个库,而mysql登录只是创建了一个连接,具体的数据库可以自己创建.表也是创建在库中的,所以在创建表前,先来创建数据库吧. Navicat打开命令行界面 右键一个连接->命令行界面 Navicat打开SQL界面 选择一个连接,选择一个库,右键,连接数据库,然后选上方查询->新建查询 有关Navicat SQL界面的一些注意: 它不像plsql那样可以选中某行执行,只能全部执行. 基本命令 show data

MySQL、Oracle和SQL Server的分页查询语句

原文地址:http://www.cnblogs.com/ginponson/p/5746435.html 假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询 SELECT * FROM student LIMIT (PageNo - 1) * PageSize,PageSize; 理解:(Limit n,m)  =>从第n行开始取m条记录,n从0开始算. 2.Oracel的分页查询

Mysql与Oracle区别

文章分类:数据库 周五去一家公司去面试,那公司经理问了关于Mysql与Oracle的区别问题,以前没有总结,回答也不是很好,只是凭感觉,先总结如下: 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2. Oracle支持大并发,大访问量,是OLTP最好的工具. 3. 安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特

Mysql与Oracle区别(转载)

Mysql与Oracle区别 文章分类:数据库 转载于http://blog.sina.com.cn/s/blog_5d9ca4ea0100kmhy.html 周五去一家公司去面试,那公司经理问了关于Mysql与Oracle的区别问题,以前没有总结,回答也不是很好,只是凭感觉,先总结如下: 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2. Oracle支持大并发,大访问量,是

存储过程之--MySQL与Oracle实现对比

存储过程之--MySQL与Oracle实现对比 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是