Oracle group by用法介绍

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

### Oracle GROUP BY 子句详解 #### 语法结构 在 `SELECT` 语句中,`GROUP BY` 子句用于按照一个或多个列的值来分组数据。对于每一组,可以应用聚合函数(如 `SUM()`、`AVG()`、`COUNT()` 等),从而计算该组的数据摘要信息。 ```sql SELECT column1, AGGREGATE_FUNCTION(column2) FROM table_name WHERE condition GROUP BY column1; ``` 此查询会先筛选满足条件的数据记录,再依据指定字段进行分组处理并执行相应的聚集操作[^1]。 #### 实际案例展示 假设存在一张名为 `sales` 的销售表,其中包含产品编号 (`product_id`)、地区名称(`region_name`)以及销售额度(`sale_amount`)三个属性。为了统计各个地区的总销售额,可编写如下 SQL 查询: ```sql SELECT region_name , SUM(sale_amount) AS total_sales FROM sales GROUP BY region_name ; ``` 上述命令将返回每一种区域对应的全部交易金额之和,并以新创建别名 "total_sales" 展现出来[^4]。 #### 多重分组支持 当需要基于多列来进行更细致化的分类汇总时,则可以在 `GROUP BY` 后面连续列举所需参照项。比如下面这段代码片段就实现了根据不同城市和地区两个维度分别累加订单数量的功能: ```sql SELECT city_name, region_name, COUNT(*) as order_count FROM orders GROUP BY city_name, region_name; ``` 这里不仅能够得到各城市的订单数目,还能进一步区分这些订单所属的具体地域范围。 #### 结合其他子句增强功能 值得注意的是,在实际开发过程中往往还需要配合使用诸如 `WITH` 或者 `HAVING` 这样的辅助工具来实现更加复杂的需求逻辑。例如利用前者定义临时视图以便于后续引用;而后者则允许设定过滤规则仅保留符合条件的结果集[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值