转:https://www.cnblogs.com/momoyan/p/9151633.html
转:http://lzfhope.blog.163.com/blog/static/636399220092554045196/
环境:oracle 10g
单单group by 或者order by本身没有特别好写的,因为这二者都是及其常用的sql句子的组成.
通常order by 和group by 没有太多的关系,但是它们常常组合在一起用,完成分组加排序的功能.
例如有下表:
SQL> select * from students; ID AREA STU_TYPE SCORE ---------------- ---------- -------- ---------------------- 1 111 g 80.00 1 111 j 80.00 2 111 g 80.00 ....... |
这个时候,执行这个语句是可以的:
SQL> select stu_type,sum(score) from students group by stu_type; STU_TYPE SUM(SCORE) -------- ---------- j 542 g 689 |
但是如果执行下面这个语句,就会报告错误:
SQL> select stu_type,sum(score) from students group by stu_type order by id; select stu_type,sum(score) from students group by stu_type order by id ORA-00979: 不是 GROUP BY 表达式 |
正确的应该是这样的:
SQL> select stu_type,sum(score) from students group by id,stu_type order by id; STU_TYPE SUM(SCORE) -------- ---------- g 237 j 80 g 140 j 135 g 133 j 148 g 179 j 179 8 rows selected |
也许结果不是所愿,但是主要为了明白一个简单的道理:order by 中列,应该出现在group by 子句中。这是一个很显然的道理。
======================
GROUP BY 和 ORDER BY一起使用
写程序也有很长的一段时间了,有些东西我总不曾去思考,很少去积累一些有用的东西,总喜欢“用要即拿”的心态来对待,这是非常不好的坏习惯。这样只会造成依赖心太强,每当遇到一些小小的问题都需要去翻资料。就好像今天写一条查询语句的时候,连group by 和 order by连用都不清楚,我想我以后得注意这些问题。
正确使用如下:
以下是引用片段: SELECT dep.department_name, MAX(emp.salary), MIN(emp.salary) FROM departments dep LEFT JOIN employees emp ON (dep.department_id = emp.department_id) GROUP BY dep.department_name --order by 的列,必须是出现在group by 子句里的列 ORDER BY dep.department_name DESC |
错误使用如下:(执行后报错:ORA-00979:不是GROUP BY 表达式)
以下是引用片段: SELECT dep.department_name, MAX(emp.salary), MIN(emp.salary) FROM departments dep LEFT JOIN employees emp ON (dep.department_id = emp.department_id) GROUP BY dep.department_name --order by 的列,应该出现在group by 子句中 ORDER BY dep.department_id DESC |
=========================================
GROUP BY 和 ORDER BY一起使用时,ORDER BY要在GROUP BY的后面。
group by a,b,c 则a,b,c三个字段是按照先按a字段对数据行进行排序,再按b字段对那些字段a为同一个值的数据行进行排序,再再按c字段对那些字段a为同一个值且字段b为同一个值的数据行进行排序
order by a,b,c 也是如此
故而
表T 有a,b,c三个字段,按a分组再按c排序的方法如下:
select * from T order by a,c//两个字段顺序不能颠倒
或者
select * from T group by a,c//两个字段顺序不能颠倒
参考
order by group by 一起用 谷歌
order by and group by together in sql 谷歌