SUM, COUNT, MIN, MAX, AVG

Kowalsky!! Sie hat mir so einen Inder mit IQ 148 geschickt! Der will irgendwelches Zeug von mir, und ich habe keine Plan, was -

Beruhige dich doch. Das kriegst du hin. Was will er denn, der Wunderknabe?

Ich soll die Datenbank irgendwie aufbereiten, hab's nicht ganz verstanden. Er hat was von durchschnittlichem Einkommen oder Anzahl der Bewohner geredet - ich weiß gar nicht, ob das überhaupt geht!

Klar geht das. Nichts leichter als das. Lass mal sehen … Hier habe ich noch Unterlagen, die ich mal für einen Praktikanten zusammengestellt habe.

Aggregatfunktionen in SQL

Angenommen, du hast folgende Liste:

Jetzt möchtest du das durchschnittliche Einkommen berechnen. Oder du möchtest wissen, welche von den Personen die größte ist. Das machst du mit den sogenannten Aggregatfunktionen ("aggregieren" heißt so viel wie "zusammenfassen"). Für dich sind die folgenden wichtig:

  • COUNT (Zählt, wie viele Zeilen dein Ergebnis hat)
  • SUM (Summe aller Werte eines Attributs)
  • AVG (Durchschnitt aller Werte eines Attributs)
  • MIN (Kleinster Wert einer Spalte)
  • MAX (Größter Wert einer Spalte)

Das kennst du schon von Excel. Beispiel: Du willst den höchsten Kontostand in der Datenbank. Also schreibst du

select max(p.kontostand)
from personen p;

Beachte, dass alle Ergebnisse auf EINE ZEILE eingedampft werden. Deshalb funktioniert

select p.nachname, max(p.kontostand)
from personen p;

NICHT! Eigentlich stehen im Feld p.nachname alle Personen, die für die Berechnung des Maximums herangezogen wurden. Dazu mehr später.

Du kannst auch mehrere Aggregate durch Komma trennen:

select min(p.kontostand), max(p.kontostand)
from personen p;

COUNT zählt, wie viele Ergebnisse du hast. Wenn du wissen willst, wie viele Personen mit schwarzen Haaren es in der Datenbank gibt, schreibst du

select count(p.pnr)
from personen p
where p.haarfarbe = 'schwarz';

Bei COUNT ist es manchmal sinnvoll, den Primärschlüssel zu verwenden, deshalb könnten Sie sich das gleich angewöhnen. In den meisten Fällen kommen Sie aber auch mit count(*) (der Stern steht für »alles«) klar:

select count(*)
from personen p;

Verwendung eines Alias

Oft empfiehlt es sich, ein Alias zu verwenden:

select max(p.kontostand) `Höchster Kontostand`
from personen p;

Beachte, dass du hier Backticks verwendest.

Es funktionieren zwar auch auch doppelte Anführungszeichen oder in SQLite eckige Klammern, aber DU verwendest IMMER NUR Backticks. Falls du mal eine MySQL-Datenbank bedienen musst - dort funktionieren nur Backticks zuverlässig!

Aggregatfunktionen und vertikale Einschränkung

Wie gesagt: Aggregatfunktionen dampfen alle Ergebniszeilen auf EINE ein - auch wenn du komplexere Abfragen hast wie

select avg(p.kontostand) `ø Kontostand 
der Wasabisucher` from personen p, googleSuchanfragen g where p.pNr = g.FK_pNr and (g.suchbegriff like '%wasabi%' or g.suchbegriff like '%rettich%');

Das berechnet dir den durchschnittlichen Kontostand aller Personen, in deren Suchanfragen die Zeichenkette "wasabi" oder "rettich" vorkamen.

Runden

Runden machst du mit ROUND - in Klammern steht der Wert, dann nach einem Komma die Anzahl der Nachkommastellen:

select round(avg(p.kontostand), 2)
from personen p;

Nochmal im Video erklären, bitte

Uff - aber ich glaube, das sieht nach mehr aus, als es ist. Dann schreibe ich mir mal auf, was ich für diesen Intelligenzbolzen alles machen muss.

  1. Wie viele Leute wohnen in der Maulwurfstadt? Bitte als Überschrift des Ergebnisses "Anzahl Einwohner" (also Alias verwendent!)
  2. Was ist der durchschnittliche Monatsverdienst aller Maulwurfstadtbewohner? Das sollte ich auf zwei Nachkommastellen runden.
  3. Kontostände aller Maulwurfstadtbewohner: höchster, niedrigster, Durchschnitt
  4. Wie viel Geld (Monatseinkommen) verdienen alle Maulwurfstadtbewohner zusammen?
  5. Wie viele Leute, die mehr als 10.000 Euro auf dem Konto haben, wohnen in der Maulwurfstadt?
  6. Was ist der höchste und niedrigste Kaufpreis in der Tabelle Waren? Ich sollte unbedingt Aliasse verwenden ("Höchster Kaufpreis", "Niedrigster Kaufpreis") 
  7. Hier müssen VIELE abfragen über 1 tabelle hier, mehrere tabellen kommen in der nächsten übung daskalovs einkäufe
  8. aslfkjlaskfjlksfdakjk

So. Geschafft.

*pock, *pock

Ah - Mr. Kapoor! Here is the data you have requested! (hands it over to him)

Thank you, Mr. Smith. I will review it in my office and get back to you in about 30 minutes. (ab)

In seinem Office??? Wohnt der jetzt hier?!

Reg dich nicht auf. Ist doch egal, Hauptsache, er ist weg.

Stimmt auch. Ich bin froh - aber …Schau mal da draußen!