23rd Jun 2022 5 Leseminuten NULL-Werte und die GROUP BY-Klausel Maria Alcaraz Aggregatfunktionen NULL GROUP BY Inhaltsverzeichnis Die GROUP BY-Klausel und NULL-Werte Aggregatfunktionen und Nullwerte Die ORDER BY-Klausel und NULL-Werte Boolesche Ausdrücke, die NULLS enthalten PROBIEREN SIE ES SELBST AUS! Wir haben bereits behandelt, wie man die GROUP BY Klausel und einige Aggregationsfunktionen wie SUM(), AVG(), MAX(), MIN(), COUNT() verwendet. In diesem Artikel werden wir erklären, wie die GROUP BY Klausel funktioniert, wenn NULL-Werte beteiligt sind. Wir werden auch die Verwendung von NULL-Wertenmit der ORDER BY Klausel erklären. Der beste Weg, GROUP BY und NULL in SQL zu beherrschen, ist die Praxis. Ich empfehle den SQL-Praxis Track auf LearnSQL.de. Er enthält über 600 praktische Übungen, die Ihnen helfen, Vertrauen in Ihre Fähigkeiten zu gewinnen. In SQL ist NULL eine spezielle Markierung, die verwendet wird, um anzuzeigen, dass ein Datenwert nicht in der Datenbank existiert. Weitere Einzelheiten finden Sie in der Wikipedia-Erklärung von NULL in SQL. Wir werden die folgende employee Tabelle, um zu veranschaulichen, wie die GROUP BY Klausel mit NULL-Werten funktioniert. EMPLOYEE TABLE EmplidNameDepartmentSalary 100John Smith IT 2000 101Jean Pellu NULL 2500 102Mary Popins FINANCES2000 103Blas MerrieuNULL NULL 104Joan Piquet IT 1000 105Jose Gomez IT NULL Die GROUP BY-Klausel und NULL-Werte Beginnen wir mit der Ausführung einer einfachen SQL-Abfrage mit der GROUP BY -Klausel und NULL-Werten: SELECT department FROM employee GROUP BY department; RESULTS department 1. 2. IT 3. FINANCES Hinweis: Der Übersichtlichkeit halber habeich hier eine nummerierte Liste eingefügt; normalerweise würden die Ergebnisse als unnummerierte Liste angezeigt werden. Wir können sehen, dass der erste Ergebniswert ein NULL-Wert ist, der durch eine leere Zeichenkette dargestellt wird (die leere Zeile vor der IT-Abteilung). Dieser leere Raum repräsentiert alle NULL-Werte, die von der GROUP BY -Klausel zurückgegeben werden. Daraus können wir schließen, dass GROUP BY NULLs als gültige Werte behandelt. In der nächsten Abfrage wird gezählt, wie viele Mitarbeiter in jeder Abteilung sind, einschließlich der "NULL"-Abteilung: SELECT department, count(*) FROM employee GROUP BY department; ERGEBNISSE department count(*) 1. 2 2. IT 3 3. FINANCES 1 Hinweis: Der Übersichtlichkeit halber habe ich hier eine nummerierte Liste eingefügt; normalerweise würden die Ergebnisse als unnummerierte Liste angezeigt werden. Analysiert man die vorherigen Ergebnisse aus einer "GROUP BY Perspektive", können wir feststellen, dass alle NULL-Werte in einem Wert oder Bucket gruppiert sind. Dies lässt es so aussehen, als wäre NULL eine Abteilung mit zwei Mitarbeitern. Die Behandlung von NULLs auf diese Weise - Gruppierung vieler NULLs in einem Bucket - entspricht jedoch nicht dem Konzept, dass ein NULL-Wert keinem anderen Wert entspricht, auch nicht einem anderen NULL-Wert. Um zu erklären, warum NULLs in einem Bucket zusammengefasst werden, müssen wir den SQL-Standard überprüfen. SQL definiert "zwei beliebige Werte, die einander gleich sind, oder zwei beliebige NULLs" als "nicht unterscheidbar". Diese Definition von "not distinct" ermöglicht es SQL, NULLs zu gruppieren und zu sortieren, wenn die GROUP BY Klausel (oder andere Schlüsselwörter, die eine Gruppierung vornehmen) verwendet wird. Es gibt noch einen weiteren verwirrenden Punkt in dem vorherigen Ergebnis: die Art und Weise, wie die NULL dargestellt wird (durch eine Leerzeile), ist nicht klar. Eine interessante Möglichkeit, dieses Problem zu lösen, ist die Verwendung der Funktion COALESCE, die NULLs in einen bestimmten Wert umwandelt, andere Werte aber unverändert lässt. Schauen wir uns die folgende Abfrage an: SELECT coalesce(department,'Unassigned department'), count(*) FROM employee GROUP BY 1; ERGEBNISSE department count(*) IT 3 Unassigned department 2 FINANCES 1 Aggregatfunktionen und Nullwerte Bis jetzt haben wir mit den NULL-Werten in der Abteilungsspalte gearbeitet und nur die GROUP BY Klausel verwendet. Versuchen wir nun, einige Abfragen mit NULL-Werten als Parameter in Aggregatfunktionen auszuführen. Zuerst werden wir die Funktion COUNT() verwenden: SELECT COUNT(salary) as "Salaries" FROM employee ERGEBNISSE Salaries 4 Ohne die Klausel DISTINCT gibt COUNT(salary) die Anzahl der Datensätze zurück, die Nicht-NULL-Werte (2000, 2500, 2000, 1000) in der Gehaltsspalte haben. Daraus können wir schließen, dass COUNT keine NULL-Werte enthält. Versuchen wir es mit der COUNT(distinct column) Aggregatfunktion, die alle verschiedenen Werte in einer Spalte zählt. Wie werden dabei NULL-Werte behandelt? SELECT COUNT(distinct salary) as "Different Salaries" FROM employee ERGEBNISSE Different Salaries 3 Die Abfrage ergab eine "3", aber es gibt vier verschiedene Gehälter: 2000, 2500, 1000 und NULL. Auch hier können wir feststellen, dass der NULL-Wert nicht im Ergebnis enthalten ist. Sehen wir uns ein weiteres Beispiel an, diesmal unter Verwendung der Aggregatfunktion AVG(): SELECT coalesce(department,'Unassigned department'), AVG(salary) FROM employee GROUP BY 1 ERGEBNISSE department count(*) Unassigned department 2500 IT 1500 FINANCES 2000 Analysieren wir, ob NULL-Werte in der Funktion AVG() enthalten sind. Die IT-Abteilung hat drei Mitarbeiter mit den folgenden Gehaltswerten: 2000, 1000 und NULL. Das Ergebnis von AVG für die IT-Abteilung ist 1500. Es ist also klar, dass der NULL-Wert bei der Durchschnittsberechnung nicht berücksichtigt wird. (Denn (1000 + 2000 ) / 2 = 1500.) Die Schlussfolgerung ist, dass Durchschnittswerte nur mit Nicht-NULL-Werten berechnet werden. Die allgemeine Regel lautet, dass NULL-Werte in keiner Aggregatfunktion wie SUM(), AVG(), COUNT(), MAX() und MIN()berücksichtigt werden. Die Ausnahme von dieser Regel ist die COUNT(*) Funktion, die alle Zeilen zählt, auch die mit NULL-Werten. Hier ist ein Beispiel: SELECT COUNT(*) as "Total Records" FROM employee ERGEBNISSE Total Records 6 Wie wir sehen können, gibt COUNT(*) die Gesamtzahl der Datensätze in der Tabelle "employee" zurück, auch die Datensätze mit NULL-Werten in einigen oder allen Feldern. Die ORDER BY-Klausel und NULL-Werte Der SQL-Standard definiert nicht ausdrücklich eine Standardsortierreihenfolge für NULL-Werte. Einige Datenbanken wie Oracle und PostgreSQL verwenden eine NULLS FIRST oder NULLS LAST Angabe, um den Ort des NULL-Wertes anzugeben. Das folgende Beispiel zeigt diese Funktion: SELECT department, COUNT(*) as "Num of employees" , AVG(salary) as "Avg Dept. Salary" FROM employee GROUP BY department ORDER BY department NULLS LAST RESULTS department Num of employees Avg Dept. Salary FINANCES 1 2000 IT 3 1500 2 2500 Boolesche Ausdrücke, die NULLS enthalten Normalerweise sehen wir TRUE oder FALSE als boolesches Ergebnis, aber es ist üblich, dass Ausdrücke oder Bedingungen, die einen NULL-Wert enthalten, ein UNKNOWN-Ergebnis liefern. Das UNKNOWN-Ergebnis wird in einem anderen Artikel, den wir hier in unserem Blog veröffentlicht haben, ausführlich behandelt. PROBIEREN SIE ES SELBST AUS! Es gibt viele Merkmale und Funktionen relationaler Datenbanken, die ein bestimmtes Verhalten zeigen, wenn ein NULL-Wert involviert ist. Mehr dazu erfahren Sie im LearnSQL's Standard-SQL-Funktionen Kurs. Probieren Sie es kostenlos aus! Tags: Aggregatfunktionen NULL GROUP BY