HAVING

(reißt die Tür auf, erzürnt) Are you crazy like chickenshit??? These lists are longer than a roll of toilet paper! I don't have the time to analyze thousands of irrelevant results!

Hey hey hey, mal langsam! My lists are perfect, understand? I did them with the Group-function! (versöhnlich) Come with us, we will have lunch and relax and -

If we don't finish on time, that's your problem, not mine. I am flying back to Calcutta tomorrow. So do what you want! But I cannot work with these lists. (Ab. Türenknall)

Weißt du, er mag ja schlau sein, aber er ist echt eine Mimose. Ich persönlich habe keine Lust …

Doch. Er hat Recht. Was soll er mit einer Liste, auf der 200 Berufe oder 500 Straßen stehen? Du machst die Listen einfach kürzer. Hier habe ich es dir aufgeschrieben, ich geh mal zu Kapoor und kühle ihn bisschen runter. (Ab)

Na prima.

HAVING

Stell dir vor, du hast nach den verschiedenen Berufen gruppiert. Dann kriegst du ziemlich viele Ergebnisse, weil es in dieser kleinen Stadt halt nur zwei Erzieherinnen und einen Ergotherapeuten gibt und so. Diese Abfrage:

SELECT count(*) AS anzahl, p.beruf
FROM personen p
GROUP BY p.beruf
ORDER BY anzahl DESC;

spuckt halt fast 200 Ergebnisse aus, das wird viel zu unübersichtlich. Du möchtest vielleicht nur die Berufe sehen, von denen es mindestens 5 gibt. Und jetzt Achtung: Was du NICHT machen kannst, ist

falsch!

SELECT count(*) AS anzahl, p.beruf
FROM personen p
WHERE anzahl > 4
GROUP BY p.beruf
ORDER BY anzahl DESC;

DENN: Die anzahl lässt sich nur berechnen, wenn schon gruppiert wurde (ist ja klar). Es kann aber erst gruppiert werden, wenn das WHERE schon ausgeführt wurde. Ist ja auch klar.

Anders ausgedrückt: Du kannst ein Aggregat (wie im Beispiel anzahl, was ja letztlich ein COUNT ist) nicht in der WHERE-Klausel verwenden. Die Abfrage muss erst ganz ausgeführt sein, erst DANN kannst du sie einschränken. Und das machst du mit HAVING:

SELECT count(*) AS anzahl, p.beruf
FROM personen p
GROUP BY p.beruf
HAVING anzahl > 4
ORDER BY anzahl DESC;

Klingt machbar, auch wenn mein Magen knurrt … Zum Glück kann ich in SQLiteStudio über den Reiter "History" meine alten Abfragen abrufen, dann muss ich ja nur noch das HAVING irgendwie einbauen ...

  • Wie viele Leute haben welchen Familienstand - aber nur die Familienstände, von denen es mehr als 100 gibt.
  • Die Anzahl der Leute, die in den einzelnen Straßen wohnen. Aber nur die Straßen, wo mehr als 8 Leute wohnen.
  • Die Anzahl der Berufe - aber nur die, von denen es mehr als 4 gibt.
  • Und jetzt den Durchschnittsverdienst der einzelnen Berufe, aber nur von den Berufen, von denen es mehr als 4 Leute gibt.

Hey, Kowalsky - das ist ja easy! Ich glaube, ich habe es!

Aber du - ich bringe die Reihenfolge immer durcheinander, where, group by, having … Das kann sich doch kein Schwein merken!

Ich schreib dir hier mal was auf:

Merksatz zur Reihenfolge der SELECT-Architektur

Kapiert?

Mensch, Kowa, du bist echt ein Genie!!

Prima - dann können wir ja loslegen!