Home - SQL Befehle - Datenmanipulation - Daten abfragen www.sqldocu.com
zurück vor



GROUP BY


Beschreibung
top
Mit der GROUP BY Klausel können Daten gruppiert werden. Will man wissen, wie viele Crewmitglieder in einer Abteilung arbeiten so wird dies mit GROUP BY erreicht (siehe Tabelle crew). Zusätzlich kann das Ergebnis mit der HAVING Klausel gefiltert werden. Der ANSI Standart erlaubt es sogar, HAVING ohne GROUP BY zu verwenden. Da dies unüblich ist, wird auf diese Möglichkeit nicht eingegangen. Sehr häufig wird GROUP BY mit Funktionen wie COUNT(), AGV() verwendet. In der GROUP BY Klausel dürfen nur Spalten verwendet werden, die in der SELECT Anweisung vorkommen.



Syntax
top
SELECT
DISTINCT | ALL   optional  
* | SpaltenName1 [,SpaltenName2] [,..] | Ausdruck
FROM TabellenName
WHERE Bedingung   optional  
GROUP BY SpalteName1 [,SpaltenName2] [,..] [ HAVING SUCHBEDINGUNG ]   optional  
ORDER BY SpaltenName | ReferenzNummer [ ASC | DESC ]   optional  
| ... trennt Syntaxmöglichkeiten (entweder oder)
[] ... Syntax innerhalb dieser Klammern ist optional
optional ... Syntax in dieser Zeile ist optional
Beispiele:
SELECT spalte1, COUNT(*) FROM TabellenName GROUP BY spalte1
SELECT spalte1, COUNT(*) FROM TabellenName GROUP BY spalte1 HAVING COUNT(*)>4


Beispiel Tabellen:
top
Diese Tabellen werden verwendet um SQL besser darstellen zu können.


TabelleName: crew
Spalte1 hat den Namen abteilung
Spalte2 hat den Namen name
Spalte3 hat den Namen status
 status=0—>krank
 status=1—>gesund

Spaltenname abteilung name status
Reihe 1 bruecke James Kirk 1
Reihe 2 bruecke Spock 1
Reihe 3 bruecke Uhura 1
Reihe 4 krankenabteilung Mc Coy 1
Reihe 5 krankenabteilung Schwester1 0
Reihe 6 krankenabteilung Schwester2 1
Reihe 7 krankenabteilung Schwester3 1
Reihe 8 krankenabteilung Schwester4 1
Reihe 9 krankenabteilung Schwester5 0
Reihe 10 maschinenraum Scoty 1
Reihe 11 maschinenraum Ingenieur1 1
Reihe 12 maschinenraum Ingenieur2 0
Reihe 13 maschinenraum Ingenieur3 1

TabelleName: crewFoederation
Spalte1 hat den Namen abteilung
Spalte2 hat den Namen name
Spalte3 hat den Namen nr_schiff
Spalte4 hat den Namen status
 status=0—>krank
 status=1—>gesund

Spaltenname abteilung name nr_schiff status
Reihe 1 bruecke James Kirk 1 1
Reihe 2 bruecke Spock 1 1
Reihe 3 bruecke Uhura 1 1
Reihe 4 krankenabteilung Mc Coy 1 1
Reihe 5 krankenabteilung Schwester1 1 0
Reihe 6 krankenabteilung Schwester2 1 1
Reihe 7 krankenabteilung Schwester3 1 1
Reihe 8 krankenabteilung Schwester4 1 1
Reihe 9 krankenabteilung Schwester5 1 0
Reihe 10 maschinenraum Scoty 1 1
Reihe 11 maschinenraum Ingenieur1 1 1
Reihe 12 maschinenraum Ingenieur2 1 0
Reihe 13 maschinenraum Ingenieur3 1 1
Reihe 14 bruecke Commander Decker 4 1
Reihe 15 bruecke 1. Offizier 4 1
Reihe 16 maschineneraum Ingenieur1 4 0
Reihe 17 maschineneraum Ingenieur2 4 1
Reihe 18 maschineneraum Ingenieur3 4 0


TabelleName: raumschiff
Die Tabelle raumschiff besteht aus 3 Spalten und 5 Reihen
Spalte1 hat den Namen nr_schiff.
Spalte2 hat den Namen name
Spalte3 hat den Namen status
  status=0 —> Raumschiff einsatzbereit
  status=1 —> Raumschiff in Reparatur

Spaltename nr_schiff name status
Reihe 1 1 U.S.S. Enterprise 1
Reihe 2 2 U.S.S. Stargazer 0
Reihe 3 3 U.S.S. Voyager 1
Reihe 4 4 U.S.S. Constellation 0
Reihe 5 5 U.S.S. Phoenix 1



GROUP BY
top
SELECT abteilung, count (*) FROM crew
GROUP BY abteilung

Ergebnistabelle:
bruecke 3
krankenstation 6
maschinenraum 4

Erklärung: Es werden alle Abteilungen des Raumschiffs aufgelistet. Zusätzlich wird die Anzahl der Crewmitglieder jeder Abteilung angezeigt. Die Aggregat Funktion count(*) zählt die zur Gruppe gehörenden Reihen (siehe Aggregat Funktionen).
SELECT DISTINCT abteilung, count (*) FROM crew führt zu einer Fehlermeldung des SQL Compilers!!!!

PHP Syntax     PERL Syntax


GROUP BY mit HAVING
top
SELECT abteilung, COUNT(*) FROM crew
GROUP BY abteilung HAVING COUNT(*)>3

Ergebnistabelle:
krankenstation 6
maschinenraum 4

Erklärung: Es werden alle Abteilungen mit der Anzahl der Mitarbeiter des Raumschiffs aufgelistet, die aus mehr als 3 Mitgliedern bestehen. Die Aggregat Funktion count(*) zählt die zur Gruppe gehörenden Reihen (siehe Aggregat Funktionen).

PHP Syntax     PERL Syntax


GROUP BY mit HAVING (advanced)
top
SELECT abteilung, AVG(status)*100 COUNT(*), status FROM crew
GROUP BY abteilung, status HAVING status=1

Ergebnistabelle:
bruecke 100 3 1
krankenstation 50 4 1
maschinenraum 75 3 1

Erklärung: Es werden alle Abteilungen des Raumschiffs aufgelistet. Die Ergebnistabelle besteht aus 4 Spalten:
Spalte 1: Name der Abteilung
Spalte 2: Prozentsatz, wie viele Mitglieder einer Abteilung gesund sind (z.B: in der Abteilung maschinenraum sind 75% gesund). Die Funktion AVG(status) berechnet den Durchschnitt der Spalte status. Da die Reihe nur 0 oder 1 enthält entspricht der Durchschnitt*100 dem Prozentsatz.
Spalte 3: Anzahl der gesunden Mitglieder der Abteilung
Spalte 4: status. Da wir in der HAVING Bedingung status=1 gewählt haben, enthält jeder Datensatz status=1

PHP Syntax     PERL Syntax


GROUP BY in Join
top
SELECT T2.name, COUNT(T1.name) FROM crewFoederation
WHERE T1.nr_schiff=T2.nr_schiff
GROUP BY T2.name

Ergebnistabelle:
U.S.S. Enterprise 13
U.S.S. Constellation 5

Erklärung: Die U.S.S. Enterprise besitzt laut Tabelle crewFoederation 12 Besatzungsmitglieder, die U.S.S. Constellation 5.

SELECT T2.name, COUNT(T1.name), T1.status FROM crewFoederation
WHERE T1.nr_schiff=T2.nr_schiff
GROUP BY T2.name, T1.status HAVING T1.status=1

Ergebnistabelle:
U.S.S. Enterprise 10
U.S.S. Constellation 3

Erklärung: Die U.S.S. Enterprise besitzt laut Tabelle crewFoederation 10 Besatzungsmitglieder die gesund sind, die U.S.S. Constellation 3.

Hinweis: Dieses Beispiel dient nur zum demonstrations Zweck. Das gleiche Ergebnis hätten wir mit folgender Anweisung erreicht:
SELECT T2.name, COUNT(T1.name), T1.status FROM crewFoederation
WHERE T1.nr_schiff=T2.nr_schiff AND
T1.status=1
GROUP BY T2.name

PHP Syntax     PERL Syntax


top