您好,欢迎访问一九零五行业门户网

MySQL与Oracle中分组、聚合函数的区别

今天需要这样一句sql:先用group by进行分组,然后利用聚合函数count 或者sum进行计算,并显示其它的辅助信息。在mysql环境中,我
今天需要这样一句sql:先用group by进行分组,然后利用聚合函数count 或者sum进行计算,并显示其它的辅助信息。
在mysql环境中,我模拟如下环境:
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
其它类似信息

推荐信息