Heim  >  Artikel  >  Datenbank  >  Das Oracle-Beispiel erklärt gruppierte Daten im Detail

Das Oracle-Beispiel erklärt gruppierte Daten im Detail

WBOY
WBOYnach vorne
2022-07-19 14:07:392615Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Oracle, das hauptsächlich Probleme im Zusammenhang mit gruppierten Daten organisiert, sodass Daten in logische Gruppen unterteilt werden können, sodass aggregierte Berechnungen für jede Gruppe durchgeführt werden können. hoffe es hilft allen.

Das Oracle-Beispiel erklärt gruppierte Daten im Detail

Empfohlenes Tutorial: „Oracle Video Tutorial

Gruppierung ermöglicht die Aufteilung von Daten in logische Gruppen, sodass aggregierte Berechnungen für jede Gruppe durchgeführt werden können.

1. Erstellen Sie eine Gruppe

Gruppe wird mithilfe der GROUP BY-Klausel in der SELECT-Anweisung erstellt.

Beispiel:

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

Das Oracle-Beispiel erklärt gruppierte Daten im Detail

Dank der Verwendung von GROUP BY müssen Sie nicht jede zu bewertende und zu berechnende Gruppierung angeben, dies erfolgt automatisch. Die GROUP BY-Klausel weist Oracle an, die Daten zu gruppieren und eine Aggregation für jede Gruppe durchzuführen (und nicht für die gesamte Ergebnismenge).

Bevor Sie GROUP BY verwenden, sind unten einige wichtige Regeln aufgeführt, die Sie über die Verwendung kennen müssen.

  • Die GROUP BY-Klausel kann so viele Spalten wie nötig enthalten. Es ermöglicht eine verschachtelte Gruppierung und ermöglicht so eine genauere Kontrolle darüber, wie Daten gruppiert werden.
  • Wenn Sie in der Group by-Klausel verschachtelte Gruppen haben, werden die Daten in der zuletzt angegebenen Gruppe zusammengefasst. Mit anderen Worten: Beim Erstellen einer Gruppierung werden alle angegebenen Spalten gemeinsam ausgewertet (Daten werden also nicht für jede einzelne Spalte abgerufen).
  • Jede in der Gruppe nach aufgeführte Spalte muss eine abgerufene Spalte oder ein gültiger Ausdruck (keine Aggregatfunktion) sein. Wenn ein Ausdruck in „select“ verwendet wird, muss derselbe Ausdruck in „group by“ angegeben werden. Aliase können nicht verwendet werden.
  • Mit Ausnahme von Aggregatberechnungsanweisungen sollte jede Spalte in der SELECT-Anweisung in der GROUP BY-Klausel erscheinen.
  • Wenn die Gruppierungsspalte eine Spalte mit einem NULL-Wert enthält, wird NULL als Gruppierung zurückgegeben. Wenn mehrere Zeilen mit NULL-Werten vorhanden sind, werden sie alle gruppiert.
  • Die GROUP BY-Klausel muss nach der WHERE-Klausel und vor der ORDER BY-Klausel stehen.

2. Filtergruppierung

Where-Klausel wird normalerweise auch für die Zeilenfilterung verwendet. Allerdings gilt „wo“ hier nicht, da „wo“ bestimmte Zeilen filtern und nicht gruppieren kann. Tatsächlich kann where nicht auf die Gruppierung angewendet werden.

Oracle bietet hierfür eine weitere Klausel: HAVING. Der einzige Unterschied zwischen der Where-Klausel und der Have-Klausel besteht darin, dass Where Zeilen filtert, während Have Filtergruppen hat.

**Tipps: **Having unterstützt alle Where-Operatoren

Die Regeln für Where und Have sind genau die gleichen, nur mit unterschiedlichen Schlüsselwörtern.

Beispiel:

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

Das Oracle-Beispiel erklärt gruppierte Daten im Detail

Hinweis: Der Unterschied zwischen haben und wo

Betrachten Sie den Unterschied zwischen haben und wo aus einem anderen Blickwinkel: Hier erfolgt die Filterung vor den Daten, während die Filterung vorher erfolgt Nach der Datengruppierung. Dies ist ein wichtiger Unterschied. Durch die where-Klausel gelöschte Zeilen werden nicht in die Gruppierung einbezogen. Dadurch können sich die berechneten Werte basierend auf den in der Have-Klausel verwendeten ändern, was wiederum Auswirkungen darauf haben kann, welche Gruppen gefiltert werden.

Beispiel für die gemeinsame Verwendung der Klausel „Where“ und „Having“:

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

Das Oracle-Beispiel erklärt gruppierte Daten im Detail

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

Das Oracle-Beispiel erklärt gruppierte Daten im Detail

3. Gruppieren und Sortieren

Der Unterschied zwischen „group by“ und „order by“ ist enorm, auch wenn sie normalerweise verwendet werden zur Vervollständigung Das Gleiche.

In der folgenden Tabelle wird der Unterschied zwischen Sortieren nach und Gruppieren nach beschrieben Gruppierungsreihenfolge

darf jede Spalte verwenden (auch nicht ausgewählte Spalten) Nie erforderlichErforderlich, wenn Spalten (oder Ausdrücke) mit verwendet werden Aggregatfunktionen
darf nur ausgewählte Spalten oder Ausdrücke verwenden und verwendet definitiv alle ausgewählten Spaltenausdrücke

时常,你会发现使用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;

Das Oracle-Beispiel erklärt gruppierte Daten im Detail

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

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

Das Oracle-Beispiel erklärt gruppierte Daten im Detail

4、select子句排序

select子句和它们的顺序

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

推荐教程:《Oracle视频教程

Das obige ist der detaillierte Inhalt vonDas Oracle-Beispiel erklärt gruppierte Daten im Detail. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen