Zurück zur Artikelliste Artikel
5 Leseminuten

NULL-Werte und die GROUP BY-Klausel

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!