本篇文章為大家帶來了關於Oracle的相關知識,其中主要整理了分組資料的相關問題,分組允許把資料分割進邏輯群組中,以便可以對每個群組執行聚合計算,下面一起來看一下,希望對大家有幫助。
推薦教學:《Oracle影片教學》
分組允許把資料分割進邏輯群組中,以便可以對每個組執行聚合計算。
分組是在SELECT語句中使用GROUP BY子句建立的。
範例:
SELECT vend_id, count(*) as num_prodsfrom productsgroup by vend_id;
#由於使用了GROUP BY,將不必指定要評估和計算的每個分組,這是自動完成的。 GROUP BY子句指示Oracle將資料分組,並對每一個分組(而非對整個結果集)執行聚合。
在使用GROUP BY之前,下面列出了你需要知道的使用它的一些重要規則。
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;
#注意: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;
SELECT vend_id, COUNT(*) AS num_prodsFROM productsGROUP BY vend_idHAVING COUNT(*) >= 2;
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;
要按订单总价对输出进行排序,只需添加一个ORDER BY子句,如下:
SELECT order_num, SUM(quantity*item_price) AS ordertotalFROM orderitemsGROUP BY order_numHAVING SUM(quantity*item_price) >= 50ORDER BY ordertotal;
select子句和它们的顺序
子句 | 描述 | 是否必须 |
---|---|---|
select | 要返回的列或表达式 | Y |
from | 要从中检索数据的表 | Y(在Oracle中是必须的;在大多数其他的DBMS中则不是) |
where | 行级过滤(分组前过滤) | N |
group by | 分组规范 | 仅当按分组计算聚合值时是必须的 |
having | 分组级过滤(分组后过滤) | N |
order by | 输出的排列顺序 | N |
推荐教程:《Oracle视频教程》
以上是Oracle範例詳解分組數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!