在oracle中,“group by”關(guān)鍵字需要和select語(yǔ)句一起使用,用于對(duì)查詢結(jié)果進(jìn)行分組,可以按行或表達(dá)式的值將行組合到分組匯總的行中;語(yǔ)法“SELECT 字段列表 FROM 數(shù)據(jù)表名 GROUP BY 字段名;”。
本教程操作環(huán)境:Windows7系統(tǒng)、Oracle 11g版、Dell G3電腦。
Oracle GROUP BY子句簡(jiǎn)介
GROUP BY?關(guān)鍵字可以根據(jù)一個(gè)或多個(gè)字段對(duì)查詢結(jié)果進(jìn)行分組。
GROUP BY子句在SELECT語(yǔ)句中用于按行或表達(dá)式的值將行組合到分組匯總的行中。?GROUP BY子句為每個(gè)分組返回一行。
GROUP BY子句通常與AVG(),count(),MAX(),MIN()和SUM()之類的集合函數(shù)一起使用。 在這種情況下,聚合函數(shù)返回每個(gè)分組的摘要信息。 例如,給定幾個(gè)類別的產(chǎn)品,AVG()函數(shù)返回每個(gè)類別中產(chǎn)品的平均價(jià)格。
以下說(shuō)明了Oracle?GROUP BY子句的語(yǔ)法:
SELECT ????字段列表 FROM ????數(shù)據(jù)表名 GROUP?BY ????字段名;
GROUP BY子句出現(xiàn)在FROM子句之后。在有提供WHERE子句的情況下,GROUP BY子句必須放在WHERE子句之前。
GROUP BY子句按分組列中的值(如c1,c2和c3)對(duì)行進(jìn)行分組。GROUP BY子句只能包含聚合或分組的列。
如果要指定應(yīng)該一次計(jì)算的多個(gè)分組級(jí)別,請(qǐng)使用以下ROLLUP語(yǔ)法:
SELECT ????字段列表 FROM ????數(shù)據(jù)表名 GROUP?BY ????ROLLUP(c1,c2,c3);
Oracle GROUP BY示例
我們將在示例數(shù)據(jù)庫(kù)中使用以下orders和order_items表進(jìn)行演示:
1. Oracle GROUP BY的基本示例
以下語(yǔ)句使用GROUP BY子句在orders表中查找唯一的訂單狀態(tài):
SELECT status FROM orders GROUP BY status;
執(zhí)行上面查詢語(yǔ)句,得到以下結(jié)果 –
該語(yǔ)句與使用DISTINCT運(yùn)算符的以下語(yǔ)句具有相同的效果:
SELECT DISTINCT status FROM orders;
2. Oracle GROUP BY聚合示例
以下語(yǔ)句返回客戶的訂單數(shù)量:
SELECT customer_id, COUNT( order_id ) FROM orders GROUP BY customer_id ORDER BY customer_id;
執(zhí)行上面查詢語(yǔ)句,得到以下結(jié)果 –
在這個(gè)例子中,我們按客戶編號(hào)來(lái)分組訂單,并使用COUNT()函數(shù)返回每個(gè)組的訂單數(shù)量。
要獲得更有意義的數(shù)據(jù),可以按以下方式將orders表與customers表一起連接:
SELECT name, COUNT( order_id ) FROM orders INNER JOIN customers USING(customer_id) GROUP BY name ORDER BY name;
執(zhí)行上面查詢語(yǔ)句,得到以下結(jié)果 –
3. Oracle GROUP BY表達(dá)式示例
以下示例按年份對(duì)訂單進(jìn)行分組,并返回每年訂單的數(shù)量。參考以下查詢語(yǔ)句 –
SELECT EXTRACT(YEAR FROM order_date) YEAR, COUNT( order_id ) FROM orders GROUP BY EXTRACT(YEAR FROM order_date) ORDER BY YEAR;
執(zhí)行上面查詢語(yǔ)句,得到以下結(jié)果 –
在這個(gè)例子中,我們使用EXTRACT()函數(shù)從訂單的日期中獲取年份信息。
與前面的例子不同,這里使用了一個(gè)在GROUP BY子句中返回年份的表達(dá)式。
4. Oracle GROUP BY帶有ROLLUP示例
以下語(yǔ)句計(jì)算銷售額并按customer_id,status和(customer_id,status)對(duì)其進(jìn)行分組:
SELECT customer_id, status, SUM( quantity * unit_price ) sales FROM orders INNER JOIN order_items USING(order_id) GROUP BY ROLLUP( customer_id, status );
執(zhí)行上面查詢語(yǔ)句,得到以下結(jié)果 –
推薦教程:《Oracle教程》