Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

SQL Grundkurs 1: Die Sprache erlernen

HAVING

Testen Sie unsere 2019 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Nach der Gruppierung noch einmal filtern? Kein Problem! Dafür gibt es die HAVING-Klausel und diese sehen Sie in diesem Video in Aktion.

Transkript

Wie Sie einen Filter auf das Ergebnis einer Gruppierung setzen können, zeige ich Ihnen in diesem Video. Dazu habe ich folgende Anweisung schon vorbereitet, diese liefert uns die Anzahl der Mitarbeiter, gruppiert nach Abteilung. Ich führe sie einmal aus, und wir sehen hier die Anzahl und die jeweilige Abteilung dazu. Nun wollen wir das Beispiel folgendermaßen erweitern. Wir wollen wissen, in welcher Abteilung arbeiten mehr als 2 aktive Mitarbeiter, D.h. wir müssen auf 2 Dinge hin filtern einerseits, dass die Mitarbeiter aktiv sind, und anderseits, dass es mehr als 2 in einer Abteilung sind. Mit anderen Worten, wenn wir uns das Ergebnis anschauen, sollten zumindest diese 3 Abteilungen, Controlling, Finanzbuchhaltung und Marketing, aus dem Ergebnis entfernt werden. Um die aktiven Mitarbeiter zu filtern, ergänze ich eine WHERE-Klausel: "WHERE (Austritt Austrittsdatum IS NULL)". Alle, die kein Austrittsdatum haben, sind aktive Mitarbeiter. Wie können wir nun die Anzahl filtern? Den Alias-Namen "Anzahl" können wir ohnehin innerhalb der Anweisung nicht verwenden, nur fürs Sortieren, das wissen wir bereits. Nun könnte man auf die Idee kommen, und hier in die WHERE-Klausel ergänzen: "AND", die Anzahl "COUNT(*) muss 2" sein. Wenn ich diese Anweisung ausführe, bekomme ich allerdings eine Fehlermeldung. In der WHERE-Klausel darf kein Aggregat auftreten. Also es ist nicht zulässig, dass wir hier in der WHERE-Klausel Gruppenfunktionen einsetzen. Sehen wir uns im Detail an, warum dies so ist. Für die Einschränkung von gruppierten Werten ist die WHERE-Klausel nicht geeignet. Die WHERE-Klausel wird, zeitlich gesehen, vor der GROUP BY-Klausel abgearbeitet. Mit anderen Worten, nachdem die GROUP BY-Klausel abgearbeitet und die gruppierten Werte zur Verfügung stehen, ist die WHERE-Klausel quasi schon passiert. Wenn wir also auf Ergebnisse der Gruppierung filtern möchten, brauchen wir quasi eine neue, eine zweite WHERE-Klausel, die nach der Gruppierung abgearbeitet wird und das ist die HAVING-Klausel. Betrachten wir uns die hier abgebildeten Beispieldaten. Wir sehen hier dreimal Mayer und zweimal Huber mit unterschiedlichen Werten. Möchten wir nun definieren, dass wir nur Werte " 2" verwenden möchten, bezieht sich das auf die Grunddaten und ist ein klarer Fall für die WHERE-Klausel. Nun kommt es zur Gruppierung. Die übriggebliebenen Mayers und die übriggebliebenen Hubers werden zusammengefasst, und die Aggregat-Funktionen angewendet. Je nachdem, welche Funktion das ist: Es kann sein, dass die Summe gebildet wird; es kann sein, dass die Anzahl gebildet wird; der kleinste Wert eruiert wird, der größte Wert oder auch der Durchschnittswert. Nun soll das Ergebnis noch dahingehend gefiltert werden, dass nur jene Werte angezeigt werden, bei denen die Anzahl, also das Ergebnis der Gruppierung, " 1" ist. Und dafür benötigen wir nun die HAVING-Klausel, die also nach der Gruppierung nicht gewünschte Werte wieder entfernt. Gehen wir also zurück zu unserer SQL-Anweisung. Wir müssen also die Einschränkung "COUNT(*) 2" aus der WHERE-Klausel entfernen, und stattdessen in die HAVING-Klausel transferieren. Die HAVING-Klausel kommt natürlich von der Schreibweise her auch nach der GROUP BY-Klausel, aber natürlich auch vor der Sortierung vor der ORDER BY-Klausel. D.h. hier haben wir eine klare Differenzierung - welche Einschränkung betrifft die Grunddaten? Das ist jene, dass wir nur die Datensätze berücksichtigen möchten, die kein Austrittsdatum haben. Nach der Gruppierung wollen wir jene Ergebnisdatensätze, bei denen nicht mindestens 3 als Anzahl aufscheint, eliminieren. Betrachten wir uns das Ergebnis, und wir haben nun all jene Abteilungen, bei denen es mehr als 2 aktive Mitarbeiter gibt. Sie sehen, es gibt also eine strikte Aufgabentrennung zwischen der WHERE- und der HAVING-Klausel. Wir haben vorhin einen Fehler erhalten, als wir versucht haben, ein Aggregat in der WHERE-Klausel unterzubringen. Ähnliches passiert, wenn wir versuchen, in der HAVING-Klausel ein Nichtaggregat unterzubringen, wie z.B. "AND Geschlecht = 1", um z.B. nur die Damen zu filtern. Führen wir diese Anweisung so aus, bekommen wir eine Fehlermeldung, die genau das Umgekehrte aussagt. Die Geschlechtsspalte dürfen wir in der HAVING-Klausel nicht verwenden, weil sie nicht in einer Aggregat-Funktion eingebaut ist. Also, alles was sich auf die Grunddaten bezieht, gehört in die WHERE-Klausel, Ergebnisse der Gruppierung in die HAVING-Klausel. Rein von der Syntax her gibt es theoretisch eine Ausnahme ich empfehle Ihnen aber nicht, Folgendes zu tun, denn das wäre absolut ein schlechtes Beispiel. Ich füge hier noch einmal unsere Basisanweisung ein, und wir haben ja jetzt hier nach der Abteilung gruppiert. Da wir nach der Abteilung gruppiert haben, ist auch die Abteilung, oder das Kürzel in dem Fall, nach der Gruppierung noch vorhanden. D.h. wenn wir jetzt z.B. sagen, wir möchten nur die Mitarbeiter aus Einkauf, Verkauf und Marketing, könnten wir jetzt auf die Idee kommen, das mit der HAVING-Klausel zu filtern, indem wir sagen "HAVING Abteilung IN" und ich führe jetzt die 3 Abteilungen an "Einkauf", "Verkauf (VK)" und MA", das ist das Kürzel für "Marketing". Und wenn wir diese Anweisung ausführen, bekommen wir sogar das korrekte Ergebnis. Diesmal bekomme ich keine Fehlermeldung, obwohl ich kein Aggregat hier in der HAVING-Klausel verwendet habe. Das liegt daran, dass diese Spalte in der GROUP BY-Klausel liegt. Sie sehen, also rein technisch gesehen, funktioniert es, aber Sie sollten das nicht tun. Warum nicht? Weil Sie eigentlich dem System damit mehr Arbeit zumuten als notwendig. Denn in dem Fall werden zuerst die Gruppen für alle Daten gebildet, und erst danach werden nicht mehr benötigte Daten wieder ausgeschieden. Würden Sie hingegen bereits vorweg über die WHERE-Klausel, wie es auch gemacht werden sollte, filtern, dann würden Sie das System entlasten, weil nur mehr die übriggebliebenen Daten gruppiert werden müssen. Deshalb empfehle ich Ihnen, diese Variante in der Praxis nicht zu verwenden. Sie haben nun in diesem Video gesehen, wie Sie Werte der Gruppierung einschränken können. Immer wenn Sie Ergebnisse der Gruppierung, also die Anzahl, das Minimum, Maximum oder anderes filtern möchten, dann müssen Sie dazu die HAVING-Klausel verwenden. In der WHERE-Klausel definieren Sie, welche Daten überhaupt mit in die Gruppierung mit eingehen.

SQL Grundkurs 1: Die Sprache erlernen

Arbeiten Sie sich in die Grundlagen der Datenbanksprache SQL am Beispiel von Microsoft SQL Server, Oracle und MySQL ein und lassen Sie sich die praktische Nutzung erklären.

14 Std. 40 min (112 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!