Zurück zur Artikelliste Artikel
10 Leseminuten

Was ist der Unterschied zwischen COUNT(*), COUNT(1), COUNT(Spaltenname) und COUNT(DISTINCT Spaltenname)?

Haben Sie bemerkt, dass es verschiedene Varianten der SQL-Funktion COUNT() gibt? Dieser Artikel erklärt die verschiedenen Argumente und ihre Verwendung.

Als SQL-Benutzer sind Sie wahrscheinlich mit der Funktion COUNT() recht vertraut. Obwohl sie relativ einfach ist, kann sie auf verschiedene Weise verwendet werden. Jede dieser Möglichkeiten hat einen ganz anderen Nutzen. Ich nehme an, Sie haben schon Code gesehen, der die Funktion COUNT(*) oder COUNT(1) enthält. Wahrscheinlich haben Sie auch schon einige andere Verwendungen der Funktion COUNT() gesehen, z. B. COUNT(Spaltenname) und COUNT(DISTINCT Spaltenname), selbst wenn Sie sie selbst nicht verwendet haben.

Sie fragen sich wahrscheinlich, was die einzelnen Varianten von COUNT() bewirken. Finden wir es heraus!

Bevor ich fortfahre, möchte ich darauf hinweisen, dass ich die Funktion GROUP BY in diesem Artikel verwenden werde, allerdings nur auf eine sehr einfache Weise. Wenn Sie Ihr Gedächtnis über GROUP BY auffrischen wollen, finden Sie hier einen Artikel, der Sie durch die Syntax und die allgemeinen Prinzipien von GROUP BY führt. Oder Sie können die Grundlagen von GROUP BY in unserem interaktiven KursSQL für Anfänger erlernen. Er enthält über 100 praktische SQL-Übungen, mit denen Sie Ihre SQL-Kenntnisse im Laufe der Zeit festigen können.

Was macht die Funktion COUNT()?

Wie Sie sich vorstellen können, zählt die Funktion COUNT(). Aber was zählt sie? Die Funktion COUNT() gehört zu den Aggregatfunktionen von SQL. Sie zählt die Anzahl der Zeilen, die die in den Klammern definierten Kriterien erfüllen. Sie gibt nicht die Zeilen selbst zurück, sondern zeigt die Anzahl der Zeilen an, die Ihren Kriterien entsprechen.

Apropos Aggregatfunktionen: Sie sind in SQL-Berichten äußerst nützlich. Wenn Sie Ihre Neugierde befriedigen wollen, finden Sie in unserem Kurs Erstellen einfacher SQL-Berichte eine Menge über Aggregatfunktionen und "GROUP BY".

Nun zurück zum Zählen. Es gibt (natürlich) verschiedene Dinge, die gezählt werden können. Deshalb gibt es auch verschiedene Variationen der Funktion COUNT(). In diesem Artikel werde ich mich auf vier konzentrieren:

  • COUNT(*)
  • COUNT(1)
  • COUNT(Spaltenname)
  • COUNT(DISTINCT Spaltenname)

COUNT(*) vs. COUNT(1)

Sie haben vielleicht schon verschiedene Diskussionen über die Unterschiede zwischen COUNT(*) und COUNT(1) gesehen. Und vielleicht hat Sie der Versuch, die Antwort zu finden, noch mehr verwirrt. Gibt es also einen Unterschied? Die einfache Antwort ist nein - es gibt überhaupt keinen Unterschied.

Die Funktion COUNT(*) zählt die gesamten Zeilen in der Tabelle, einschließlich der Werte von NULL. Die Semantik für COUNT(1) unterscheidet sich geringfügig; wir werden sie später betrachten. Die Ergebnisse für COUNT(*) und COUNT(1) sind jedoch identisch.

Lassen Sie uns diese Behauptung anhand einer Beispielabfrage testen. Angenommen, ich habe eine Tabelle namens Auftraege die diese Spalten enthält:

  • Bestellnummer: Die ID der Bestellung.
  • Kunden_ID: Die ID des Kunden, der die Bestellung aufgegeben hat.
  • Auftragswert: Der Gesamtwert der bestellten Artikel in Euro.
  • Zahlungsdatum: Wann die Bestellung vom Kunden bezahlt wurde.

Wenn ich die Anzahl der Zeilen in der gesamten Tabelle zählen wollte, würde ich die Funktion COUNT() auf folgende Weise verwenden:

SELECT COUNT(*) AS Anzahl_der_Zeilen
FROM Auftraege;

Wie Sie sehen, habe ich die Funktion COUNT(*) verwendet. Das Ergebnis wird in der neuen Spalte Anzahl_der_Zeilen angezeigt:

Anzahl_der_Zeilen
8

Ok, aber was ist, wenn ich stattdessen COUNT(1) verwende? Hier ist es:

SELECT COUNT(1) AS Anzahl_der_Zeilen
FROM Auftraege;

Der Code ist im Wesentlichen derselbe. Der einzige Unterschied ist, dass ich COUNT(1) statt COUNT(*) verwendet habe. Und das Ergebnis? Es gibt die gleiche Anzahl von Zeilen zurück:

Anzahl_der_Zeilen
8

Es ist ein weit verbreiteter Irrglaube, dass "1" in COUNT(1) bedeutet: "Zähle die Werte in der ersten Spalte und gib die Anzahl der Zeilen zurück." Aus diesem Missverständnis folgt ein zweites: dass COUNT(1) schneller ist, weil es nur die erste Spalte zählt, während COUNT(*) die gesamte Tabelle verwendet, um zum gleichen Ergebnis zu kommen.

Das stimmt nicht. Die Zahl in der Klammer steht nicht für die Nummer der Spalte in der Tabelle. Wenn Sie eine beliebige Zahl in die Klammer setzen, wird das Ergebnis garantiert dasselbe sein. Sie wollen einen Beweis? Hier ist er:

SELECT COUNT(-13) AS Anzahl_der_Zeilen
FROM Auftraege;

Wenn das erste Missverständnis wahr wäre, würde der obige Code bedeuten, dass ich die Anzahl der Zeilen in der -13ten Spalte zählen möchte. In der Tabelle Auftraege gibt es nur vier Spalten, also gibt es keine 13. Spalte. Sicher ist, dass es keine Spalte -13 gibt, was auch immer das bedeuten sollte. Wollen Sie das Ergebnis des Codes sehen? Wundern Sie sich nicht:

Anzahl_der_Zeilen
8

Auch hier ist das Ergebnis dasselbe. Was bedeutet also der Wert in der Klammer von COUNT()? Es ist der Wert, den die Funktion COUNT() jeder Zeile in der Tabelle zuweist. Die Funktion zählt dann, wie oft das Sternchen (*) oder (1) oder (-13) zugewiesen wurde. Natürlich wird es so oft zugewiesen, wie es der Anzahl der Zeilen in der Tabelle entspricht. Mit anderen Worten: COUNT(1) weist den Wert aus der Klammer (in diesem Fall die Zahl 1) jeder Zeile in der Tabelle zu, dann zählt dieselbe Funktion, wie oft der Wert in der Klammer (in unserem Fall die 1) zugewiesen wurde. Natürlich ist dies immer gleich der Anzahl der Zeilen in der Tabelle. Die Klammern können einen beliebigen Wert enthalten. Das einzige, was nicht funktioniert, ist, den Inhalt innerhalb der Klammern leer zu lassen.

Versuchen wir mal etwas Dummes. Setzen Sie anstelle einer Zahl den folgenden Wert in die Klammer: 'es werden immer 8 Zeilen sein'. Hier ist der Code:

SELECT COUNT('es werden immer 8 Zeilen sein') AS Anzahl_der_Zeilen
FROM Auftraege;

Führen Sie den Code aus und - Überraschung - das Ergebnis sind wirklich acht Zeilen:

Anzahl_der_Zeilen
8

Da es keine Rolle spielt, welchen Wert Sie in die Klammern setzen, sind COUNT(*) und COUNT(1) genau gleich. Sie sind genau gleich, weil der Wert in der Klammer COUNT() nur dazu dient, der Abfrage mitzuteilen, was sie zählen soll.

Wenn diese Anweisungen genau gleich sind, dann gibt es keinen Unterschied in der Leistung. Lassen Sie sich durch das Sternchen (*) nicht zu der Annahme verleiten, dass es denselben Zweck hat wie in der Anweisung SELECT *. Nein, COUNT(*) geht nicht durch die gesamte Tabelle, bevor es die Anzahl der Zeilen zurückgibt, und ist damit auch nicht langsamer als COUNT(1).

Wer gewinnt also am Ende in diesem dramatischen Kampf COUNT(*) gegen COUNT(1)? Niemand - es ist ein Unentschieden. Sie sind genau gleich. Ich würde jedoch empfehlen, COUNT(*) zu verwenden, da es viel häufiger vorkommt. Es ist auch weniger verwirrend, da andere SQL-Benutzer natürlich verstehen, dass die Funktion alle Zahlen in der Tabelle zählt, einschließlich der NULL Werte.

COUNT(*) vs. COUNT(Spaltenname)

Wie wäre es damit: COUNT(*) vs. COUNT(Spaltenname). Gibt es einen Unterschied? Ja, natürlich!

Wie Sie bereits gelernt haben, zählt COUNT(*) alle Zeilen in der Tabelle, einschließlich der Werte von NULL. Dagegen zählt COUNT(Spaltenname) alle Zeilen in der angegebenen Spalte und schließt die Werte von NULL aus.

Wie Sie bereits wissen, gibt es acht Zeilen in der Tabelle Auftraege. Schauen wir uns an, wie viele Zeilen es sein werden, wenn ich die Spalte Bestellnummer zum Zählen verwende (angenommen, ich möchte sehen, wie viele Bestellungen aufgegeben wurden). Wir werden wieder acht Zeilen erhalten, richtig? Schauen wir mal:

SELECT COUNT(Bestellnummer) AS Anzahl_der_Auftraege
FROM Auftraege;

Bekommen wir das gleiche Ergebnis? Nein, es gibt sieben Aufträge, nicht acht.

Anzahl_der_Auftraege
7

Ist das ein Fehler? Nein, es sind wirklich nur sieben Bestellungen mit einem Bestellnummer. Eine Zeile hat einen NULL Wert statt einer richtigen Bestellnummer. Unten ist die Zeile, die den Unterschied ausmacht:

BestellnummerKunden_IDAuftragswertZahlungsdatum
NULLCU0921327.85NULL

Denken Sie immer daran: COUNT(Spaltenname) zählt nur Zeilen, in denen die angegebene Spalte NICHT NULL ist.

Lassen Sie uns nun etwas Interessantes tun und beide COUNT() Varianten in einer Abfrage kombinieren. Angenommen, ich möchte die ID des Kunden mit der Gesamtzahl der Bestellungen dieses Kunden sehen. Ich möchte auch die Gesamtzahl der bezahlten Bestellungen für diesen Kunden anzeigen. (Bezahlte Bestellungen haben keinen NULL Wert in der Spalte Zahlungsdatum.) So würde ich es machen:

SELECT	Kunden_ID,
		COUNT(*) AS Anzahl_der_Auftraege,
		COUNT(Zahlungsdatum) AS bezahlt_Anzahl_der_Auftraege
FROM Auftraege
GROUP BY Kunden_ID;

Die Abfrage berechnet zunächst die Gesamtzahl der Bestellungen unter Verwendung von COUNT(*), d.h. sie schließt die Werte von NULL ein. Dann zählt der Teil COUNT (Zahlungsdatum) AS bezahlt_Anzahl_der_Auftraege die Zeilen in der Spalte Zahlungsdatum, die NOT NULL sind. Ich möchte die Ergebnisse für jeden Kunden, also habe ich das Ergebnis nach der Spalte Kunden_ID gruppiert. Hier ist das Ergebnis:

Kunden_IDAnzahl_der_Auftraegebezahlt_Anzahl_der_Auftraege
CU01211
CU04911
CU05222
CU09210
CU10822
CU14911

Sie können sehen, dass eine Differenz für den Kunden CU092 auftritt.

Die Prinzipien der Kombination von GROUP BY und COUNT() sind in diesem Artikel über GROUP BY und SQL-Aggregatfunktionen beschrieben. Wenn Sie noch mehr üben möchten, finden Sie hier fünf Beispiele für GROUP BY.

COUNT() erlaubt es uns, sowohl Ausdrücke als auch Spaltennamen als Argument zu verwenden. Wissen Sie, wie man die Anzahl der Bestellungen über 1000 € nur mit der Funktion COUNT() ermitteln kann? So geht's:

SELECT COUNT(CASE WHEN Auftragswert > 1000 THEN 1 END) 
AS Bedeutende_Aufträge
FROM Auftraege;

Anstatt Bedingungen an das Ende der Abfrage zu stellen und zu filtern, nachdem die Funktion COUNT() ihre Arbeit getan hat, können wir die Anweisung CASE verwenden. Genau das habe ich in der obigen Abfrage getan. Sie wird wie eine IF-THEN-ELSE-Anweisung verwendet. CASE wird von der Bedingung gefolgt, die durch die Anweisungen WHEN und THEN definiert ist. Es kann auch eine ELSE-Anweisung folgen, aber das ist in diesem Fall unnötig. Ich bin nur an der Anzahl der Werte > 1000€ interessiert, nicht an den Werten selbst. Jede Anweisung CASE endet mit der Anweisung END.

Die obige COUNT()-Anweisung lautet wie folgt:

  1. Suche alle Werte in der Spalte Auftragswert über 1000.
  2. Weise diesen Werten den Wert 1 (Sie können jeden beliebigen Wert zuweisen) zu.
  3. Weise den Zeilen mit Preisen unter 1000 den Wert NULL zu.
  4. Zähle die Anzahl der zugewiesenen 1en.
  5. Zeige das Ergebnis in der Spalte Bedeutende_Aufträge an.

Hier ist das Ergebnis:

Bedeutende_Aufträge
5

COUNT(Spaltenname) vs COUNT (DISTINCT Spaltenname)

Sie können sich wahrscheinlich vorstellen, worin der Unterschied zwischen diesen beiden Versionen der Funktion COUNT() besteht. COUNT(column_name) berücksichtigt bei der Zählung auch doppelte Werte. Im Gegensatz dazu zählt COUNT (DISTINCT column_name) nur eindeutige (einzigartige) Zeilen in der definierten Spalte.

Wenn Sie die Anzahl der Kunden zählen wollen, die eine Bestellung aufgegeben haben, funktioniert vielleicht COUNT (column_name). Probieren wir diesen einfachen Code aus:

SELECT COUNT (Kunden_ID) AS Anzahl_der_Kunden
FROM Auftraege;

Dieser Code ist Ihnen bekannt. Ich habe bereits die Funktion COUNT(Spaltenname) verwendet. Diesmal werden alle Zeilen in der Spalte Kunden_ID gezählt, und das Ergebnis wird in der Spalte Anzahl_der_Kunden angezeigt. Hier ist das Ergebnis:

Anzahl_der_Kunden
8

Prüfen wir das Ergebnis, indem wir die gesamte Auftraege Tabelle betrachten:

BestellnummerKunden_IDAuftragswertZahlungsdatum
OR2020-01CU108154872020-01-08
OR2020-28CU149154872020-01-14
OR2020-12CU10812549.222020-01-09
OR2020-91CU012542.55NULL
NULLCU0921327.85NULL
OR2020-112CU049150002020-02-28
OR2020-213CU0521502020-03-12
OR2020-213CU0522002020-03-12

Es gibt acht Zeilen, aber ist das wirklich die Anzahl der Kunden? Beachten Sie, dass die Kunden CU108 und CU052 zweimal vorkommen. Wenn ich die tatsächliche Anzahl der Kunden haben möchte, muss ich jeden Kunden nur einmal zählen. Wie kann ich das tun? Indem ich COUNT(DISTINCT Kunden_ID) verwende:

SELECT COUNT(DISTINCT Kunden_ID) AS Anzahl_der_Kunden
FROM Auftraege;

Diese Abfrage zählt auch die Zeilen in der Spalte Kunden_ID, aber sie zählt jeden Kunden nur einmal. Dies ist auf das Schlüsselwort DISTINCT zurückzuführen. Schauen Sie sich das Ergebnis an:

Anzahl_der_Kunden
6

Dies ist das richtige Ergebnis, denn es gibt tatsächlich nur sechs eindeutige Kunden.

Glauben Sie, dass Sie auf COUNT() zählen können?

Nachdem Sie nun mehrere gängige Variationen der Funktion COUNT() kennen, können Sie komplexere Berechnungen und Berichte erstellen. COUNT() ist eine der am häufigsten verwendeten Aggregatfunktionen, daher ist es wichtig, dass Sie die verschiedenen Variationen von COUNT() und ihre Zwecke genau kennen. Wenn einige der COUNT() Funktionsvarianten, die wir in diesem Artikel besprochen haben, nicht klar waren, lassen Sie es mich im Kommentarbereich wissen. Ich werde Ihnen gerne helfen. Und wenn Sie mehr Übung im Umgang mit COUNT() brauchen, besuchen Sie unseren Erstellen einfacher SQL-Berichte Kurs.