转: 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连用都不清楚,我想我以后得注意这些问题。

正确使用如下:

以下是引用片段:
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    谷歌

======================写程序也有很长的一段时间了,有些东西我总不曾去思考,很少去积累一些有用的东西,总喜欢“用要即拿”的心态来对待,这是非常不好的坏习惯。这样只会造成依赖心太强,每当遇到一些小小的问题都需要去翻资料。就好像今天写一条查询语句的时候,连group by 和 order by连用都不清楚,我想我以后得注意这些问题。正确使用如下:以下是引 CREATE TABLE test.reward ( id int(11) NOT NULL AUTO_INCREMENT, uid int(11) NOT NULL COMMENT '用户uid', money decimal(10, 2) NOT NULL COMMENT '奖励金额', datatime datetime NOT NULL COMMENT '时间', PRIMARY KEY (id) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET utf8 COLLATE 以逆字母顺序显示公司名称,并以数字顺序显示顺序号: SELECT Company, Order Number FROM Order s ORDER BY Company DESC, Order Number ASC 对数据进行分组排序时 group by 与 order by 一起 使用 是要遵守一定原则的
group by 和 order by 一起 使用 时,会先 使用 group by 分组,并取出分组后的第一条数据,所以后面的 order by 排序时根据取出来的第一条数据来排序的,但是第一条数据不一定是分组里面的最大数据。 解决方案: 可以先排序,再分组,再排序: 使用 子查询。 SELECT r.id, r.uid, r.age , r.datatime FROM (SELECT...
select -> from-> where-> group by->having-> order by. 但mysql的解析器执行顺序: from-> where-> group by->having->select-> order by. A表-------- id order _number(不是唯一的) B表-------- id ex_id(A中的 order _number不是唯一的) del_status(1,2,3)
先说一下SQL执行顺序: from => join => on => where => group by => having => select => order by => limit having、where:都是条件查询,区别在于having可以用别、函数。 具体区别见:https://blog.csdn.net/W_Kenneth/article/details/110950145 测试数据表:reward order by 和 group by 的区别: 1, order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。 2, group by 从英文里理解就是分组。必须有“聚合函数”来配合才能 使用 使用 时至少需要一个分组标志字段。 注意:聚合函数是---sum()、count()、...