ProgrammierungSQL Analyst

Erklären Sie die Unterschiede zwischen HAVING und WHERE in SQL. Wofür ist jeder von ihnen erforderlich, wie interagieren sie mit Aggregatfunktionen und wie vermeidet man häufige Fehler bei deren Verwendung?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

WHERE filtert die Zeilen vor der Gruppierung und Aggregation, bestimmt also, welche Datensätze in die Gruppierung/Aggregation gelangen. HAVING filtert Gruppen bereits nach der Anwendung von Aggregatfunktionen.

  • WHERE: Aggregatfunktionen (SUM, AVG usw.) können nicht verwendet werden, da die Filterung VOR der Gruppierung erfolgt.
  • HAVING: Aggregatfunktionen können verwendet werden, da die Filterung NACH der Gruppierung erfolgt.

Beispiel:

-- Abteilungen mit einer Gesamtgehalt von über 50000, Ausschluss von entlassenen Mitarbeitern abrufen SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;

Hier:

  • WHERE status = 'active' entfernt entlassene Mitarbeiter vor der Berechnung der Gehälter pro Abteilung;
  • HAVING SUM(salary) > 50000 zeigt nur die Abteilungen an, in denen das Gesamtgehalt 50000 übersteigt.

Fangfrage

Kann man Aggregatfunktionen in WHERE verwenden?

Fehler: es wird versucht zu schreiben WHERE SUM(amount) > 100, das ist jedoch nicht möglich – Aggregatfunktionen kommen NUR in HAVING zum Einsatz.

Beispiel (FALSCH):

SELECT customer_id, SUM(amount) FROM orders WHERE SUM(amount) > 100 GROUP BY customer_id -- FEHLER: falsche Verwendung von SUM() in WHERE

Richtig:

SELECT customer_id, SUM(amount) FROM orders GROUP BY customer_id HAVING SUM(amount) > 100;

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

CRM-Entwicklung. Versuch, Kunden mit mehr als 5 Bestellungen über WHERE COUNT(order_id) > 5 zu filtern. Die Abfrage funktionierte nicht. Ergebnis: die Anzahl der Kunden im Bericht war inkorrekt, da COUNT nicht in WHERE verwendet werden kann.


Geschichte

Business-Analyse. Anstelle der Filterung inaktiver Produkte in WHERE wurde HAVING verwendet. Ergebnis: Aggregation "leerer" Gruppen und langsames SQL. Korrigiert wurde durch das Verschieben des Statusfilters nach WHERE.


Geschichte

Komplexer Bericht. HAVING wurde ohne GROUP BY zur Filterung einzelner Zeilen verwendet. In einigen DBMS führt dies zu einem Fehler, in anderen zu unvorhersehbarem Verhalten. Fazit: HAVING sollte nach der Gruppierung stehen und für Aggregatbedingungen verwendet werden.