Aus dem Kurs: SQL Grundkurs 2: Data Query Language (DQL) Aufbauwissen
Gruppenfunktionen – Tutorial zu SQL
Aus dem Kurs: SQL Grundkurs 2: Data Query Language (DQL) Aufbauwissen
Gruppenfunktionen
Mit Gruppenfunktionen werden Werte über mehrere Zeilen hinweg zusammengefasst, deshalb werden sie auch als Aggregatfunktionen, eben aggregieren, zusammenfassen, bezeichnet oder auch als Multiple-Row-Funktionen, weil sie das eben über mehrere Zeilen hinweg tun. Was sind die klassischen Gruppenfunktionen, die wir in SQL zur Verfügung haben? Das sind die Summe, Anzahl, Minimum, Maximum, der Mittelwert sowie für Sonderfälle, um statistische Dinge auszuwerten, die Standardabweichung und die Varianz. Ich zeige Ihnen nun anhand eines simplen Beispiels, wie diese grundsätzlich verwendet werden. Ich verwende dazu unsere artikel-Tabelle. Ich verwende jetzt diese Gruppenfunktionen gemeinsam mit der Spalte Verkaufspreis. Ich beginne mit COUNT der "anzahl", damit wird die Anzahl der Einträge ungleich NULL in dieser Spalte gezählt. Mit MIN bekomme ich den niedrigsten Wert, den kleinsten Eintrag, und das Gegenteil dazu wäre MAX, Maximum. Mit AVG für Average bekommen wir den Mittelwert oder den Durchschnittswert. Die Summe macht beim Verkaufspreis nicht wirklich Sinn, aber der Vollständigkeit halber verwende ich auch die Funktion SUM, die für Summe steht hier, "AS summe", und auch noch die zwei statistischen, die Standardabweichung, die uns eine Streuung um den Mittelwert ausgibt, und abschließend noch die Varianz, VAR, das ist mathematisch gesehen das Quadrat der Standardabweichung. Die letzten beiden werden Sie wahrscheinlich eher selten in der Praxis benötigen; die anderen sind von größerer praktischen Bedeutung. Was passiert jetzt, wenn wir diese Anweisung ausführen? Das erste ist einmal, wir bekommen eine Ergebniszeile. Diese eine Zeile resultiert daraus, dass wir gruppiert haben; gruppiert heißt, alles, was ich ausgebe, wird zusammengefasst. Solange wir keine separate Gruppierung definieren, bedeutet COUNT nicht Anzahl, sondern eigentlich Gesamtanzahl, oder SUM nicht Summe, sondern Gesamtsumme, das heißt, für alle Zeilen, die hier ausgegeben werden, wird eine Summenzeile gebildet. Sehr schön zeigt uns das das Ergebnis in der ersten Spalte mit Anzahl, das heißt, wir haben 1.117 Artikel momentan in unserer artikel-Tabelle. Minimum 0,00 sagt aus, dass zumindest ein Artikel ohne Preis bzw. gratis in dieser Tabelle gespeichert ist. Der höchste vorkommende Preis ist 762,85 Euro, der durchschnittliche Artikelpreis aller unserer Artikel ist knapp unter 33 Euro. Die Summe der einzelnen Preise sagt eher weniger aus. Die Standardabweichung und Varianz ist eben ein statistischer Wert, nämlich: Wie weit ist der Großteil der Werte vom Mittelwert entfernt? Was passiert, wenn ich dieselbe Anweisung in den Editor von MySQL oder Oracle kopiere? Ich führe sie hier aus. Vielleicht fällt Ihnen auch auf, dass bei der Standardabweichung und bei der Varianz hier die Färbung im Editor nicht vorgenommen wird und wir bekommen auch eine entsprechende Fehlermeldung, dass die Standardabweichung nicht existiert. Das liegt daran, dass unter MySQL, und auch unter Oracle wird es so sein, die Standardabweichung mit zwei D geschrieben wird und die VARIANCE wird ausgeschrieben. Das ist einmal der wichtige Unterschied hier unter MySQL; dass hier das AVG für Average anders gefärbt wird im Editor können wir ignorieren. Wir führen die Anweisung aus, die Fehlerzeile deaktiviere ich wieder, und wieder sehen wir hier das Ergebnis. Falls Sie der Meinung sind beim Mittelwert, so genau mit so vielen Nachkommastellen -- das Gleiche könnte natürlich auch für die Varianz und die Standardabweichung gelten. Wenn Sie also der Meinung sind, dass Sie es nicht so genau haben wollen, dann können Sie natürlich das Endergebnis mit der ROUND-Funktion z.B. auf zwei Nachkommastellen runden. Dann haben Sie entsprechend weniger Kommastellen in der Anzeige. Das Gleiche gilt auch unter Oracle. Ich kopiere diese Anweisung auch in diesen Editor hinein und jetzt kann ich die Anweisung hier direkt ausführen und bekomme sofort ein fehlerfreies Ergebnis. Also, auch bei Oracle wird die Standardabweichung und die Varianz anders geschrieben, als dies beim Microsoft SQL Server der Fall ist. Was gleich ist, ist die Wirkung, dass ich immer eine Zeile bekomme. Etwas ist noch unterschiedlich, dass Oracle zum Beispiel viel genauer das Ergebnis angibt. Das Gleiche wäre der Fall, wenn ich diese Zeile, hier den Mittelwert, um die Runden-Funktion erleichtere, dann würde auch der Mittelwert bei Oracle schon in einer Form angegeben werden, wo wir sagen, na ja, so genau wollte ich es nun auch wieder nicht wissen, das heißt, ich entferne diese Zeile wieder und verwende wieder die Variante mit der ROUND-, mit der Runden-Funktion und ergänze diese gleich auch auf zwei Nachkommastellen bei der Standardabweichung und der Varianz. Und nun bekommen wir hier ein Ergebnis, das schon wesentlich ansehnlicher aussieht. Vorhin habe ich Ihnen erzählt, dass Sie immer eine Zeile bekommen. Ich möchte nun zeigen, dass das wirklich immer eine Zeile ist, egal wie viele Grundzeilen im Statement zurückgegeben werden. Zu diesem Zweck kopiere ich diese Anweisung -- ups, habe mich kurz vertippt, so -- und werde jetzt hier eine WHERE-Klausel ergänzen, z.B. dass ich das Ganze einschränke auf die Artikelgruppe und sage, ich möchte hier nur Artikel der zwei Artikelgruppen Besteck, Kürzel BE, und Geschirr mit dem Kürzel GE ausgeben. Wir hatten im Moment in der Anzahl noch 1.117 ausgegeben. Wenn ich dasselbe wiederhole mit der WHERE-Klausel, dann sehe ich am deutlichsten an der Anzahl, dass es nur mehr 252 Zeilen sind, die hier verwendet wurden, aber ich bekomme genau eine Zeile ausgegeben. Die anderen Werte haben sich natürlich aufgrund der nun unterschiedlichen Grundmenge auch anders zusammengesetzt. Und ich bekomme immer eine Ergebniszeile, selbst dann, wenn überhaupt keinen Grunddaten vorhanden sind, sprich keine Datensätze in den Grunddaten enthalten sind. Um Ihnen das zu zeigen, kopiere ich noch einmal diese Anweisung und verwende hier eine Bedingung, von der ich weiß, dass keine Zeile zurückgegeben wird, z.B. schreibe ich in die WHERE-Klausel hier hinein: "WHERE gruppe = 'XX'". Diese gibt es gar nicht, diese Artikelgruppe, deshalb werden keine Zeilen geliefert. Wenn ich diese Anweisung ausführe, bekomme ich aber eine Ergebniszeile aus diesen NULL-Zeilen für die Gruppierung. Sehr schön sieht man an der Anzahl, dass diese Gruppenfunktion, nämlich COUNT, nie NULL zurückliefern kann; wenn es keine Daten gibt, liefert sie 0. Der Anzahl kann per Definition auch nie negativ sein oder Kommastellen enthalten. Wenn es keine Daten liefert oder besser gesagt keinen Grunddaten gibt, dann liefert diese eine Ergebniszeile für alle anderen Gruppenfunktionen NULL, aber es ist immer eine Zeile da. Das macht den Unterschied aus. Wenn Sie also Gruppenfunktionen ohne eine Gruppierung verwenden, bekommen Sie immer eine Gesamtanzahl, Gesamtsumme usw. Alle Daten, egal wie viele es sind, werden zu einer Ergebniszeile zusammengefasst.
Üben mit Projektdateien
Laden Sie die Dateien herunter, die von den Trainer:innen verwendet werden. So können Sie mitlesen und durch Ansehen, Zuhören und Üben lernen.
Inhalt
-
-
-
-
Gruppenfunktionen9 Min. 50 Sek.
-
(Gesperrt)
NULL-Werte bei Gruppenfunktionen8 Min. 31 Sek.
-
(Gesperrt)
Mit Gruppierung: GROUP BY3 Min. 46 Sek.
-
(Gesperrt)
GROUP BY in Aktion4 Min. 42 Sek.
-
(Gesperrt)
Achtung beim Gruppieren!8 Min. 18 Sek.
-
(Gesperrt)
GROUP BY mit WHERE kombinieren5 Min. 32 Sek.
-
(Gesperrt)
Gruppieren nach mehreren Spalten8 Min. 16 Sek.
-
(Gesperrt)
Gruppierung filtern mit HAVING8 Min. 43 Sek.
-
(Gesperrt)
Einfache Kreuztabelle9 Min. 51 Sek.
-
(Gesperrt)
ROLLUP7 Min. 17 Sek.
-
(Gesperrt)
ROLLUP mit Sortierung7 Min. 56 Sek.
-
(Gesperrt)
ROLLUP vs. CUBE7 Min. 58 Sek.
-
-
-