首頁 >資料庫 >Oracle >Oracle範例詳解分組數據

Oracle範例詳解分組數據

WBOY
WBOY轉載
2022-07-19 14:07:392661瀏覽

本篇文章為大家帶來了關於Oracle的相關知識,其中主要整理了分組資料的相關問題,分組允許把資料分割進邏輯群組中,以便可以對每個群組執行聚合計算,下面一起來看一下,希望對大家有幫助。

Oracle範例詳解分組數據

推薦教學:《Oracle影片教學

分組允許把資料分割進邏輯群組中,以便可以對每個組執行聚合計算。

1、建立分組

分組是在SELECT語句中使用GROUP BY子句建立的。

範例:

SELECT vend_id, count(*) as num_prodsfrom productsgroup by vend_id;

Oracle範例詳解分組數據

#由於使用了GROUP BY,將不必指定要評估和計算的每個分組,這是自動完成的。 GROUP BY子句指示Oracle將資料分組,並對每一個分組(而非對整個結果集)執行聚合。

在使用GROUP BY之前,下面列出了你需要知道的使用它的一些重要規則。

  • GROUP BY子句可以根據需要包含許多欄位。它允許嵌套分組,對資料的分組方式進行更細粒度的控制。
  • 如果在group by子句中具有嵌套的分組,就會在最後指定的分組上匯總資料。換句話說,在建立分組時,將會把指定的所有欄位放在一起評估(因此,將不會針對每個單獨的欄位取回資料)。
  • group by中列出的每一列都必須是一個檢索的列或有效的表達式(而不是一個1聚合函數)。 如果在select中使用一個表達式,那麼必須在group by中指定相同的表達式。不能使用別名。
  • 除了聚合計算語句之外,SELECT語句中的每一列都應該出現在GROUP BY子句中。
  • 如果分組列包含一個具有NULL值的資料列,將會傳回NULL,作為一個分組。如果有多行具有NULL值,則將把他們都分組在一起。
  • GROUP BY子句必須出現在WHERE子句的後面和ORDER BY子句前面。

2、過濾分組

where子句通常也用於行過濾。但是,where在這裡不適用,因為where可以過濾特定的行,而不是分組。事實上,where無法適用於分組。

Oracle為此提供了另一個子句:HAVING。 where子句與having子句唯一的差異是:where過濾行,而having則過濾分組。

**提示:**having支援所有的where運算子

where與having的規則,語法完全相同,只有關鍵子不同。

範例:

SELECT cust_id, COUNT(*) AS ordersFROM ordersGROUP BY cust_idHAVING COUNT(*) >= 2;

Oracle範例詳解分組數據

#注意:having與where之間的差異

換個角度來看待having與where的差異:where過濾發生在資料之前,而having過濾則發生在資料分組之後。這是一個重要的區別,被where子句刪除的行不會包括在分組中。這可能會改變計算值,基於having子句中使用的那些值,它反過來又可能影響那些分組將會被篩選。

where子句與having子句同時使用範例:

select vend_id, count(*), as num_prodsfrom productswhere prod_price>=10group by vend_idhaving count(*) > 2;

Oracle範例詳解分組數據

SELECT vend_id, COUNT(*) AS num_prodsFROM productsGROUP BY vend_idHAVING COUNT(*) >= 2;

Oracle範例詳解分組數據

3、分組和排序

group by和order by的差異很大,即使他們通常用於完成相同的事情。

下表描述了order by與group by的區別

order by group by
對產生的輸出進行排序 #對資料列進行分組,不過輸出可能不會採用採用分組順序
可能使用任意列(甚至包括沒有選擇的列) 只可能使用所選的列或表達式,並且一定會使用所有選擇的清單達式
#從來都不是必須的 如果結合使用列(或表達式)與聚合函數,則必需的

时常,你会发现使用GROUP BY分组的数据的确是以分组顺序输出的。但是并非总是如此,并且实际上SQL规范也并没有如此要求。而且你实际上可能希望它以不同于分组的方式进行排序。你以一种方式对数据进行分组(以获得特定于分组的聚合值),并不意味着你也希望输出以相同的方式进行排序。总是应该还提供一个显式的ORDER BY子句,即使它与GROUP BY子句完全相同。

提示:不要忘记ORDER BY

通常,无论何时使用GROUP BY子句,还应该指定一个ORDER BY子句,这是确保正确地对数据进行排序的唯一方式。永远不要依靠GROUP BY对数据排序。

为了演示同时使用GROUP BY和ORDER BY的情况,让我们看一个示例。下面的SELECT语句类似于之前使用的SELECT语句。它用于检索总价在50以上(含50)的所有订单的订单号和订单总价:

SELECT order_num, SUM(quantity*item_price) AS ordertotalFROM orderitemsGROUP BY order_numHAVING SUM(quantity*item_price) >= 50;

Oracle範例詳解分組數據

要按订单总价对输出进行排序,只需添加一个ORDER BY子句,如下:

SELECT order_num, SUM(quantity*item_price) AS ordertotalFROM orderitemsGROUP BY order_numHAVING SUM(quantity*item_price) >= 50ORDER BY ordertotal;

Oracle範例詳解分組數據

4、select子句排序

select子句和它们的顺序

子句 描述 是否必须
select 要返回的列或表达式 Y
from 要从中检索数据的表 Y(在Oracle中是必须的;在大多数其他的DBMS中则不是)
where 行级过滤(分组前过滤) N
group by 分组规范 仅当按分组计算聚合值时是必须的
having 分组级过滤(分组后过滤) N
order by 输出的排列顺序 N

推荐教程:《Oracle视频教程

以上是Oracle範例詳解分組數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除