Index   Kapitel 1   Kapitel 2   Kapitel 3   Kapitel 4   Kapitel 5   Kapitel 6   Kapitel 7  
Beispiel - Datenbank  



4 Aggregatfunktionen und Gruppen

Hinweis: NULL-Werte werden vor der Auswertung einer Aggregatfunktion eliminiert .

Zählfunktion

Syntax : SELECT COUNT ([DISTINCT] <Spaltenliste|*>)
FROM <Tabelle>
Beispiel : Gesucht wird die Anzahl der Mitarbeiter des Unternehmens.
SELECT COUNT (*)
FROM Mitarbeiter
Beispiel : Wieviele verschiedene Mitarbeiter-Nachnamen existieren im Unternehmen?
SELECT COUNT (DISTINCT vor_name, nach_name)
FROM Mitarbeiter
  

Arithmetische Funktionen

Syntax : SELECT SUM ({numerische Spalte |
           Arithmetischer Ausdruck mit numerischen Spalten})
FROM <Tabelle>
Beispiel : Gesucht wird das Gehalt, das das Unternehmen an seine Mitarbeiter insgesamt zahlt.
SELECT SUM (gehalt)
FROM Mitarbeiter
Syntax : SELECT AVG ({numerische Spalte |
           Arithmetischer Ausdruck mit numerischen Spalten }
FROM <Tabelle>
Beispiel : Gesucht wird das Durchschnittsgehalt der Mitarbeiter.
SELECT AVG (gehalt)
FROM Mitarbeiter
  

Min-/Max-Funktionen

Syntax : SELECT MAX ({numerische Spalte |
           Arithmetischer Ausdruck mit numerischen Spalten})
FROM <Tabelle>
Beispiel : Gesucht wird das größte Gehalt, das das Unternehmen zahlt.
SELECT MAX (gehalt)
FROM Mitarbeiter
Syntax : SELECT MIN ({numerische Spalte |
           Arithmetischer Ausdruck mit numerischen Spalten})
FROM <Tabelle>
Beispiel : Gesucht wird das kleinste Gehalt, das das Unternehmen zahlt.
SELECT MIN (gehalt)
FROM Mitarbeiter
  

Gruppenbildung in SQL-Anfragen

In den vorangegangenen Beispielen wurden die Aggregatfunktionen immer auf eine ganze Tabelle angewandt. Daher bestand das Abfrageergebnis immer nur aus einem Tupel. In SQL ist es aber auch möglich, eine Tabelle in Gruppen "aufzuteilen", d.h. die Tupel einer Tabelle in Gruppen einzuteilen, und dann die Aggregatfunktionen jeweils auf die Gruppen anzuwenden.

Syntax : SELECT <Spalte> , <Aggregatfunktion ... >
FROM <Tabelle>
GROUP BY <Spalte>
Hinweis : Die in der group by-Komponente spezifizierten Spalten müssen auch in der SELECT-Komponente spezifiziert sein, da Basis für die Gruppierung die "Zwischen-Ergebnis"-Tabelle ist, die durch Select ... From ... Where ... spezifiziert wurde. Andererseits müssen alle Spalten der Selektionsliste, die nicht durch eine Aggregatfunktion gebunden sind, in der group by-Komponente aufgeführt werden. Daraus ergibt sich eine gewisse Redundanz im Abfragecode. Die Reihenfolge der Spaltenspezifikation in der GROUP BY-Komponente hat keinen Einfluß auf das Resultat der Abfrage.
Beispiel : Es sind zwei Gruppen zu bilden: die Gruppe der weiblichen Mitarbeiter und die Gruppe der männlichen Mitarbeiter. Für jede Gruppe soll das Durchschnittsgehalt ermittelt werden. D.h. es soll für jedes Geschlecht das Durchschnittsgehalt berechnet werden.
SELECT geschlecht, AVG (gehalt)
FROM Mitarbeiter
GROUP BY geschlecht
Beispiel : Für jede Abteilung, die in der Tabelle "Mitarbeiter" referenziert wird, soll eine Gruppe gebildet werden. Für jede Abteilung wird die Anzahl der Mitarbeiter bestimmt.
SELECT abt_nr, COUNT (pers_nr)
FROM Mitarbeiter
GROUP BY abt_nr
  

Auswahl von Gruppen

Syntax : SELECT <Spalte> , <Aggregatfunktion ...>
FROM <Tabelle>
GROUP BY <Spalte>
HAVING <Bedingung>
Beispiel : Es sind für jeden Mitarbeiter, der an einem Projekt arbeitet, die Stunden zu ermitteln, die er insgesamt in den Projekten beschäftigt ist und zu überprüfen, ob diese Anzahl Stunden 10 überschreitet. Die Ergebnistabelle soll dann die Personalnummer und die Projektstundensumme derjenigen Mitarbeiter enthalten, die mehr als 10 Stunden Projektarbeitszeit aufweisen.
SELECT pers_nr, SUM (stunden)
FROM Arbeitet_an
GROUP BY pers_nr
HAVING SUM (stunden) > 10
  

Doppelte Gruppenbildung

Manche Anfragen erfordern eine doppelte Gruppenbildung. Will man beispielsweise die durchschnittliche Anzahl von Mitarbeitern pro Abteilung erfahren, so ist die nicht mehr in einer einzigen SQL-Anfrage formulierbar, da in einer Anfrage nur eine Gruppenbildung erfolgen kann. Abhilfe schafft z.B. ein View (siehe Abschnitt 7 ).

CREATE VIEW Temp (abt_nr, mitarb_anzahl) AS
SELECT anr, COUNT (pers_nr)
FROM Mitarbeiter
GROUP BY anr

SELECT AVG (mitarb_anzahl)
FROM Temp
  

Selektion der k-ersten oder k-letzten Zeilen in einer Ordnung

Sollen in einer SQL-Abfrage die ersten k oder die letzten k Zeilen einer Tabelle bezüglich einer bestimmten Ordnung gesucht werden, so muß der Rang der Zeilen explizit in der Tabelle erzeugt werden.

Beispiel : Ermittle die drei bestverdienenden Mitarbeiter (Annahme: Gehalt = UNIQUE)
SELECT A.pers_nr , COUNT (B.pers_nr) AS Rang
FROM Mitarbeiter A, Mitarbeiter B
WHERE A.gehalt < B.gehalt
GROUP BY A.pers_nr
HAVING Rang < 3
ORDER BY 2
Hinweis : Im Beispiel wurde angenommen, daß jedes Gehalt einmalig ist. Ist dies nicht der Fall, dann ist das Ergebnis der Abfrage allgemeiner: Es werden dann alle Mitarbeiter selektiert, für die es maximal zwei Mitarbeiter gibt, die mehr verdienen. Die "Order By"-Klausel ist bei dieser Abfrage optional.

  


Index   Kapitel 1   Kapitel 2   Kapitel 3   Kapitel 4   Kapitel 5   Kapitel 6   Kapitel 7  
Beispiel - Datenbank