黑马程序员技术交流社区

标题: select *from emp group by deptno;这个语句是不是group by 语句 [打印本页]

作者: 董俊霞    时间: 2011-7-19 10:27
标题: select *from emp group by deptno;这个语句是不是group by 语句
说出为什么是或者不是?
作者: 毕仁杰    时间: 2011-7-19 10:49
标题: 回复 楼主 的帖子
运行结果:
第 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 编辑 ]
作者: 匿名    时间: 2011-7-19 11:23
我认为这个sql不会报错(至少Sysbase是),但是这个查询语句没有什么意义,可以说得不到楼主想要的结果。
可以在group by 的后面加上oder by deptno 即可。楼上说的有4个相同的20怎么显示的问题,应该是全都显示出来。 我用的sysbase数据库,也许和ORACLE的机制有差别,如有错误,还希望指正。
作者: 匿名    时间: 2011-7-19 13:18
标题: 回复 沙发 的帖子
回答得很好,补充一点:

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。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2