order by是对字段进行排序,
group by 是对字段进行分类,
在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。
比如,有一个表tt:
A B
1 aa
2 nnn
3 fhfh
3 fdgdfg
group by 有一个原则,就是 select 后面的所有列中,没有使用组函数的列,必须出现在 group by 后面。为什么有这个规则,因为,按group by进行分组的话,能够产生唯一的值,组函数,也叫多行函数,就是给我多条记录,我只会产生一个输出。因此,如果没出现在主函数的列里,也没出现在group by后面,那么,有可能那个字段产生不是唯一的值,就没法一一对应匹配
组函数很多:avg, sum, max, min, count....组函数,也叫多行函数,就是给我多条记录,我只会产生一个输出。
例如:
如果,比如,我要是写个sql语句:select A,B from tt group by A,这条语句里,没有使用组函数,A,B都没出现在组函数里,在
group by 中也没出现,现在按照A来分组,对A来说,分组后为:1,2,3,可是,对于的B字段,产生的值不唯一,因为A的值为3的时候,B有两条记录,因此,,B没法跟A分组后来匹配,
得出的结果有问题:
A B
1 aa
2 nnn
3 fhfh
但是,如果我改成group by A, B,则是对A,B的组合的唯一来分组,得出的结果就是对的。
如果
select A,count(B) from tt group by A,结果为:
A count(B)
1 1
2 1
3 2
A没出现在聚合函数count(B)里,但是,出现在了group by后面,这样,我对A进行分组,为1,2,3,我Count(B),得出的也是唯一的,因此,可以匹配。
对于这点,仔细理解理解,