Oracle group by用法介绍

来源:互联网 发布:微信源码论坛 编辑:程序博客网 时间:2024/04/25 07:06

group by是分组函数。一般都是配合聚合函数使用的。介绍几个重要的知识点。

select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

group by是分组函数,所以查询的数据都是基于这分组来说的。看例子:

A B
1 abc
1 bcd
1 asdfg
select A,B from table group by A
你说这样查出来是什么结果,
A B
abc
1 bcd
asdfg
右边3条如何变成一条,所以需要用到聚合函数,比如
select A,count(B) 数量 from table group by A
这样的结果就是
A 数量
1 3

所以我们用到的分组函数的前提就是你想根据这分组计算什么,比如计算这组总的人数,平均数,最小数,最大数。

但是不是说group by分组条件的字段都必须在查询条件中列出来。出现在group by中的字段可以不select出来,也就是说 select中的字段必须出现在group by中 group by中的分组条件不一定出现在select中。
看到select A,count(B) 数量 from table group by A 这个语句我们表面印象应该是先计算count(B),再group,这牵扯到oracle语句执行机制,在这不多讲了(其实也不会)。我们要理解是,或者说记住的是group by执行顺序。这边oracle是先按照group by分组条件先进行分组,再进行count计算的。

where, group by, having, order by语句的执行顺序

查询中用到的关键词主要包含六个,并且他们的顺序依次为

select–from–where–group by–having–order by
其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行

from–where–group by–having–select–order by,
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据

可以看出select语句是先group by再进行select的,所以group by在count先计算。

select CategoryName, count(*), AVG(Rating)  from BOOKSHELF  where Rating>1  group by CategoryName  having CategoryName like 'A%'  order by count(*) desc  

1.基于Where Rating>1 筛选出符合条件的行;
2.基于group by CategoryName 对筛选的结果进行分组;
3.为每个CategoryName组计算Count(*)
4. 基于having CategoryName like ‘A%’留下符合条件的组
5. 根据order by 的条件对剩下的行组进行排序,SQL中的count(*)也是分组函数

在介绍几个小的知识点
group by 的顺序类似order by
如 group by A,B,C,D责先按A分组 再按BCD这个顺序分组
group by条件越多分组越细 也就是说 假如A是学校 B是学院 C是专业 D是班级 那最后group by的结果是按照有多少个不同的班级分组 按照最细致的分组

from后面的表关联,是自右向左解析的
而where条件的解析顺序是自下而上的。

也就是说,在写SQL文的时候,尽量把数据量大的表放在最右边来进行关联,
而把能筛选出大量数据的条件放在where语句的最下面。

参考:http://blog.csdn.net/m53931422/article/details/41548147
http://www.2cto.com/database/201304/204965.html

0 0