A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

说出为什么是或者不是?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

3 个回复

倒序浏览

回复 楼主 的帖子

运行结果:
第 1 行出现错误:
ORA-00979: 不是 GROUP BY 表达式

GROUP BY 子句的作用是把一个表划分为若干个组,常常结合分组函数来使用。
看楼主写的这个SQL语句,功能是把表emp按deptno分组,但是你按deptno分组时,当有多个相同的deptno如deptno为20的有4个,你用select *  表示选择emp表的所有列,包括empno等,你把deptno为20 的分成一组,那你的empno怎么显示,4个empno你显示那个?这就是错误之所在。

综上所述:这个语句是个错误的group by 语句,可以改为   select  avg (sal)  from emp group deptno;该sql语句表示把emp表按部门号(deptno)分组求各部门的平均工资。

现在也在学Oracle     说的不好请批评指正!
[ 本帖最后由 毕仁杰 于 2011-07-19  10:50 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 没看出来,小毕有挺有潜质啊

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-19 11:23:55
藤椅
我认为这个sql不会报错(至少Sysbase是),但是这个查询语句没有什么意义,可以说得不到楼主想要的结果。
可以在group by 的后面加上oder by deptno 即可。楼上说的有4个相同的20怎么显示的问题,应该是全都显示出来。 我用的sysbase数据库,也许和ORACLE的机制有差别,如有错误,还希望指正。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-19 13:18:21
板凳

回复 沙发 的帖子

回答得很好,补充一点:

group by是按一列(或多列)的值进行分组,可能把多行分到一组。
对于select 列x… group by 列1…语句,列x… 只能是列1…的子集,也就是说,如果group by A,B,那么select A,B,C就是错的,因为出现了group by中没有的C。如果要选择C,那就使用聚集函数(count(数目), sum(和),avg(均值), max(最大值)和min(最小值)),这是在分组内进行相应的计算。如select A , B  , max(C)  from table group by A , B。

另外,使用了group by,就不能使用where筛选,要实现筛选,是在group by后使用having,注意这是按组进行筛选,不是按行。

说明:这是我的经验,在oracle下的,其他数据库就不清楚了。总之,数据库感觉挺简单的,但是也有很多要注意的细节,尤其是oracle。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 补充得好,加油赚分

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马