`GROUP BY` 是 SQL 中的一个重要子句,用于将结果集按照一个或多个列进行分组,并对每个分组应用聚合函数(如 `SUM()`, `COUNT()`, `AVG()`, `MAX()`, `MIN()` 等)。以下是一些 `GROUP BY` 的基本用法和高级用法:
基本用法
单个列分组:
```sql
SELECT column_name, AGGREGATE_FUNCTION(column_name)
FROM table_name
GROUP BY column_name;
```
多个列分组:
```sql
SELECT column1, column2, ..., AGGREGATE_FUNCTION(column_name)
FROM table_name
GROUP BY column1, column2, ...;
```
过滤分组结果
使用 `HAVING` 子句过滤分组结果:
```sql
SELECT column1, column2, ..., AGGREGATE_FUNCTION(column_name)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING AGGREGATE_FUNCTION(column_name) > value;
```
使用聚合函数和非聚合列进行分组
可以在 `SELECT` 语句中包含非聚合列:
```sql
SELECT column1, aggregate_function(column) as aggregate_value
FROM table_name
WHERE condition
GROUP BY column1;
```
使用 `WITH CUBE` 语句
`WITH CUBE` 语句可以生成多维数据集,包含所有可能的列组合的聚合结果:
```sql
SELECT sup_id, prod_id, sum(qty*unit_price) as tot_amt
FROM sale_item
GROUP BY sup_id, prod_id WITH CUBE;
```
使用 `WITH ROLLUP` 语句
`WITH ROLLUP` 语句返回最高层次的 `GROUP BY` 列的加总,以及每个分组的加总:
```sql
SELECT sup_id, prod_id, sum(qty*unit_price) as tot_amt
FROM sale_item
GROUP BY sup_id, prod_id WITH ROLLUP;
```
区分 `CUBE` 操作生成的空值
使用 `GROUPING` 函数区分 `CUBE` 操作生成的空值和实际数据中的空值:
```sql
SELECT productid, grouping(productid), orderid, grouping(orderid), sum(quantity)
FROM order
GROUP BY productid, orderid WITH CUBE
ORDER BY productid, orderid;
```
与 `HAVING` 子句搭配使用
找出每个组别中满足指定条件的数据:
```sql
SELECT prod_id, count(*)
FROM stock
GROUP BY prod_id
HAVING count(*) > 1
ORDER BY prod_id;
```
这些用法涵盖了 `GROUP BY` 的基本和高级功能,可以根据具体需求选择合适的用法进行数据分组和聚合操作。