`
sony-soft
  • 浏览: 1019355 次
文章分类
社区版块
存档分类
最新评论

mysql与oracle中分组、聚合函数的区别!

 
阅读更多

今天需要这样一句sql:先用group by进行分组,然后利用聚合函数count 或者sum进行计算,并显示其它的辅助信息。

mysql环境中,我模拟如下环境:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

CREATE TABLE `room` (

`rid` varchar(5) default NULL,

`rname` varchar(5) default NULL,

`pid` int(11) default NULL,

`seq` int(11) NOT NULL auto_increment,

PRIMARY KEY (`seq`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

房间表,seq房间入住序号(主键),rname为房间名,这里不考虑第三范式

情景:人住房间,

统计某个房间某个人住的次数

用户表,客人的信息

CREATE TABLE `user1` (

`ID` int(11) NOT NULL auto_increment,

`USERNAME` varchar(50) default '',

`PASSWORD` varchar(50) default '',

PRIMARY KEY (`ID`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk

Mysql中语句如下:

select count(u.username)r.rname,r.rid,r.pid

from room r,user1 u

where r.pid=u.id

group by r.rid,r.pid

这里r.rname并没有出现在group by子句、聚合函数中,但是MYSQL中仍然能够执行、列出数据。

但是,在ORACLE中,却不能!!!!

Oracle环境中:

/*

--显示:Ora-00979 not a ORDER BY expression

--因为: order by 后边的c.channel_code不在ORDER BY子句中

select count(c.channel_name),m.media_name

from channel c,media m

where c.media_code = m.media_code

group by c.media_code,m.media_name

order by c.channel_code

--显示:Ora-00979 not a GROUP BY expression

--因为:group by 或者聚合函数中没有包含c.channel_name

select count(c.channel_name),m.media_name,c.channel_name

from channel c,media m

where c.media_code = m.media_code

group by c.media_code,m.media_name

*/

--通过:

select count(c.channel_name),m.media_name

from channel c,media m

where c.media_code = m.media_code

group by m.media_name

--正常

select count(c.channel_name),m.media_name

from channel c,media m

where c.media_code = m.media_code

group by c.media_code,m.media_name

--正常

select count(c.channel_code),m.media_name

from channel c,media m

where c.media_code = m.media_code

group by c.media_code,m.media_name

总结如下:

注:oracle常用分组函数:

COUNTAVESUMMAXMIN

Count(*):返回表中所有的行包括空行和重复的行。

COUNT(表达式)返回表中所欲哦表达式为空的行。例如:select count(mgr) from emp; 返回表中所有mgr为非空的行。

Maxmin可用于:数字型数据、字符型数据和日期型数据。

!!!!除了Count(*)外,其他的分组函数都不处理空值(NULL

比如Max求出的“最大值”就不是null,尽管select的结果(按照从小到大到达顺序)null排在最后的位置。

如果在一个查询中使用了分组函数,任何不在分组函数的列或表达式必须在GROUP BY子句中。

网友总结:

select ……group by的时候,前面的select的字段,要么是group by的依据,要么是聚合内容。

我理解下:

Select中的字段,只能包含在聚合函数中(e.g:min(price)),或是包含在group by子句中,否则在oracle等数据库中就会报Ora-00979 not a ORDER BY expression错误

在求平均值的时候,计算出的avg值会偏大,因为总数中没有计算含有null值所在的数据行。

这时可以使用NVL函数进行空值转换。

格式:NVL(表达式1,表达式2)

说明:如果表达式1 为空值(NULL),NVL返回值为表达式2的值,否则返回表达式1的值。

表达式1和表达式2可以是数字型、字符型或日期型,但表达式1和表达式2的数据类型必须一致。

如:

l 对于日期型:NVL(hiredate,’31-DEC<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="99" unitname="’" w:st="on">-99’</chmetcnv>)

l 对于数字型:NVL(comm,0)

对于字符型:NVL(TO_CHAR(comm),’No Commission’)

分享到:
评论

相关推荐

    Mysql利用group by分组排序

    MySQL的group by与Oracle有所不同,查询得字段可以不用写聚合函数,查询结果取得是每一组的第一行记录。 利用上面的特点,可以利用mysql实现一种独特的排序; 首先先按某个字段进行order by,然后把有顺序的表进行...

    SQL中的开窗函数详解可代替聚合函数使用

     开窗函数与聚合函数一样,都是对行的集合组进行聚合计算。它用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用group by语句对数据进行分组,能够在同一行中同时返回...

    Oracle数据库中SQL开窗函数的使用

    开窗函数简介:与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计 算的行集组是窗口。在 ISO SQL 规定

    SQL开窗函数的具体实现详解

    开窗函数简介:与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计 算的行集组是窗口。在 ISO SQL 规定

    Oracle练习题库

    Oracle练习题,尽快成长自我,分析函数,聚合函数,常见函数--创建一个从1开始,默认最大值,每次增长1的序列,要求NOCYCLE,缓存中有30个预先分配好的 序列号

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    从就业与择业的角度来讲,计算机相关专业的大学生从事oracle方面的技术是职业发展中的最佳选择。 其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的...

    关系型数据库管理系统之MySql学习总结

    文章目录数据库介绍MySql介绍添加数据导入数据查询数据内连接左外连接/右外连接子查询约束函数聚合函数分组函数数学函数字符串函数日期时间函数条件判断函数系统信息函数加密函数格式化函数自定义函数视图事务存储...

    MySQL数据库管理高级篇(二)

    MySQL是一个关系型数据库管理系统,目前属于Oracle旗下产品。... MySQL 聚合、控制流及日期函数 4.???? MySQL 字符串函数 本课程,是基于《 mysql 数据管理基础篇 》进行的讲解,请仔细查看目录,是否符合自己的需求。

    SQL 数据分析:销售数据的小计/合计/总计以及数据透视表

    学习过 SQL 的人都知道,使用聚合函数(AVG、SUM、COUNT、MIN/MAX 等)和分组操作(GROUP BY)可以对数据进行基本的统计分析,例如统计公司员工的人数、每个部门的平均月薪等。如果想要回顾这些基础概念,可以参考这...

    Mycat-server-1.6-RELEASE源码

    支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。 支持通过全局表,ER关系的分片策略,实现了高效的多表join...

    MySQL基础入门视频课程

    本课程从零开始,以通俗易懂的方式讲解MySQL技术,手把手教你掌握每一个知识点。...聚合函数和分组统计4.更新操作5.表和库的管理6.约束7.用户和权限管理8.事务处理教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    程序员的SQL金典6-8

     4.3.2 数据分组与聚合函数  4.3.3 HAVING语句  4.4 限制结果集行数  4.4.1 MySQL  4.4.2 MS SQL Server 2000  4.4.3 MS SQL Server 2005  4.4.4 Oracle  4.4.5 DB2  4.4.6 数据库分页  4.5 抑制数据重复 ...

    程序员的SQL金典7-8

     4.3.2 数据分组与聚合函数  4.3.3 HAVING语句  4.4 限制结果集行数  4.4.1 MySQL  4.4.2 MS SQL Server 2000  4.4.3 MS SQL Server 2005  4.4.4 Oracle  4.4.5 DB2  4.4.6 数据库分页  4.5 抑制数据重复 ...

    程序员的SQL金典4-8

     4.3.2 数据分组与聚合函数  4.3.3 HAVING语句  4.4 限制结果集行数  4.4.1 MySQL  4.4.2 MS SQL Server 2000  4.4.3 MS SQL Server 2005  4.4.4 Oracle  4.4.5 DB2  4.4.6 数据库分页  4.5 抑制数据重复 ...

    程序员的SQL金典3-8

     4.3.2 数据分组与聚合函数  4.3.3 HAVING语句  4.4 限制结果集行数  4.4.1 MySQL  4.4.2 MS SQL Server 2000  4.4.3 MS SQL Server 2005  4.4.4 Oracle  4.4.5 DB2  4.4.6 数据库分页  4.5 抑制数据重复 ...

    程序员的SQL金典.rar

     4.3.2 数据分组与聚合函数  4.3.3 HAVING语句  4.4 限制结果集行数  4.4.1 MySQL  4.4.2 MS SQL Server 2000  4.4.3 MS SQL Server 2005  4.4.4 Oracle  4.4.5 DB2  4.4.6 数据库分页  4.5 抑制数据重复 ...

    经典SQL语句大全

    关于如何使用sql,关于oracle的各种函数如聚合函数,分析函数以及他们的区别;也有关于sql如何调优,都一一说明

    SQL_SERVER应用与开发范例宝典_12357672.part2

     第7章 聚合函数与分组统计  第8章 使用子查询  第9章 多表查询  第10章 高级查询  第11章 插入数据  第12章 更新和删除数据  第13章 创建、操纵数据库和表  第14章 使用视图  第...

    SQL_SERVER应用与开发范例宝典_12357672.part1

     第7章 聚合函数与分组统计  第8章 使用子查询  第9章 多表查询  第10章 高级查询  第11章 插入数据  第12章 更新和删除数据  第13章 创建、操纵数据库和表  第14章 使用视图  第...

    SQL_SERVER应用与开发范例宝典_12357672.part3

     第7章 聚合函数与分组统计  第8章 使用子查询  第9章 多表查询  第10章 高级查询  第11章 插入数据  第12章 更新和删除数据  第13章 创建、操纵数据库和表  第14章 使用视图  第...

Global site tag (gtag.js) - Google Analytics