转:
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()、...