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

本文对比了MySQL与Oracle中使用SQL分组函数的区别,重点介绍了COUNT、SUM等函数的应用场景及注意事项,尤其强调了在Oracle中使用GROUP BY时的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天需要这样一句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’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值