Oracle Group By子句
在本教程中,您将学习如何使用Oracle GROUP BY
子句将行记录分组。
Oracle GROUP BY子句简介
GROUP BY
子句在SELECT语句中用于按行或表达式的值将行组合到分组汇总的行中。 GROUP BY
子句为每个分组返回一行。
GROUP BY
子句通常与AVG()
,COUNT()
,MAX()
,MIN()
和SUM()
之类的集合函数一起使用。 在这种情况下,聚合函数返回每个分组的摘要信息。 例如,给定几个类别的产品,AVG()
函数返回每个类别中产品的平均价格。
以下说明了Oracle GROUP BY
子句的语法:
SELECT
column_list
FROM
T
GROUP BY
c1,
c2,
c3;
GROUP BY
子句出现在FROM
子句之后。在有提供WHERE子句的情况下,GROUP BY
子句必须放在WHERE
子句之前。
GROUP BY
子句按分组列中的值(如c1
,c2
和c3
)对行进行分组。GROUP BY
子句只能包含聚合或分组的列。
如果要指定应该一次计算的多个分组级别,请使用以下ROLLUP
语法:
SELECT
column_list
FROM
T
GROUP BY
ROLLUP(c1,c2,c3);
Oracle GROUP BY示例
我们将在示例数据库中使用以下orders
和order_items
表进行演示:
1. Oracle GROUP BY的基本示例
以下语句使用GROUP BY
子句在orders
表中查找唯一的订单状态:
SELECT
status
FROM
orders
GROUP BY
status;
执行上面查询语句,得到以下结果 -
该语句与使用DISTINCT运算符的以下语句具有相同的效果:
SELECT
DISTINCT status
FROM
orders;
2. Oracle GROUP BY聚合示例
以下语句返回客户的订单数量:
SELECT
customer_id, COUNT( order_id )
FROM
orders
GROUP BY
customer_id
ORDER BY
customer_id;
执行上面查询语句,得到以下结果 -
在这个例子中,我们按客户编号来分组订单,并使用COUNT()
函数返回每个组的订单数量。
要获得更有意义的数据,可以按以下方式将orders
表与customers
表一起连接:
SELECT
name, COUNT( order_id )
FROM
orders
INNER JOIN customers
USING(customer_id)
GROUP BY
name
ORDER BY
name;
执行上面查询语句,得到以下结果 -
3. Oracle GROUP BY表达式示例
以下示例按年份对订单进行分组,并返回每年订单的数量。参考以下查询语句 -
SELECT
EXTRACT(YEAR FROM order_date) YEAR,
COUNT( order_id )
FROM
orders
GROUP BY
EXTRACT(YEAR FROM order_date)
ORDER BY
YEAR;
执行上面查询语句,得到以下结果 -
在这个例子中,我们使用EXTRACT()
函数从订单的日期中获取年份信息。
与前面的例子不同,这里使用了一个在GROUP BY
子句中返回年份的表达式。
4. Oracle GROUP BY带有ROLLUP示例
以下语句计算销售额并按customer_id
,status
和(customer_id
,status
)对其进行分组:
SELECT
customer_id,
status,
SUM( quantity * unit_price ) sales
FROM
orders
INNER JOIN order_items
USING(order_id)
GROUP BY
ROLLUP(
customer_id,
status
);
执行上面查询语句,得到以下结果 -
在本教程中,您已学习如何使用Oracle GROUP BY
子句将行记录分组。