Zurück zur Artikelliste Artikel
10 Leseminuten

Ein detaillierter Leitfaden für die SQL-Funktion COUNT()

In diesem Leitfaden finden Sie detaillierte Erklärungen (mit Beispielen) zu allen typischen Verwendungen der Funktion ZÄHLEN() Funktion.

Die Kenntnis der Datenaggregation ist ein notwendiger Schritt auf dem Weg zum SQL-Meister. Dazu gehört auch die Funktion COUNT() - eine der am häufigsten verwendeten Aggregatfunktionen von SQL.

Datenaggregation zählt immer noch zu den SQL-Grundkenntnissen. Ein solides Fundament stellt sicher, dass Sie keine Lücken in Ihrem Wissen haben, was das Erlernen komplexerer SQL-Konzepte erleichtert. Diese Grundlagen und mehr können Sie in unserem Lernprogramm SQL von A bis Z erwerben. Die sieben interaktiven Kurse geben Ihnen eine feste Struktur und machen Ihr Lernen systematisch. Sie beginnen mit den SQL-Grundlagen, wie dem Abrufen von Daten und der Verwendung von SQL-Standardfunktionen (einschließlich COUNT() und anderer Aggregatfunktionen). Sobald Sie diese Grundlagen beherrschen, ist es viel einfacher, den fortgeschritteneren Konzepten zu folgen, die Sie in diesem Kurs lernen, wie z. B. Fensterfunktionen, allgemeine Tabellenausdrücke und GROUP BY Erweiterungen.

Sobald Sie all dies gelernt haben, brauchen Sie etwas Übung, um es wirklich zu beherrschen. Zu diesem Zweck gibt es den SQL-Übungssatz mit seinen 88 interaktiven Übungen.

Dieser Artikel wird auch praktisch sein und Ihnen verschiedene Beispiele für die Verwendung von COUNT() zeigen. Dazu brauchen wir einen geeigneten Datensatz.

Beispiel-Datensatz

Wir werden uns mit Regisseuren und ihren Filmen beschäftigen. Die erste Tabelle heißt, wie nicht anders zu erwarten, directors. Hier ist die Abfrage, die Sie verwenden können, um diese Tabelle selbst zu replizieren.

Die Daten in der Tabelle sehen wie folgt aus:

idfirst_namelast_namedate_of_birthdate_of_deathplace_of_birthcountry_of_birth
1IngmarBergman1918-07-142007-07-30UppsalaSweden
2LynneRamsay1969-12-05NULLGlasgowScotland
3AlejandroJodorowsky1929-02-07NULLTocophillaChile
4AgnesVarda1928-05-302019-03-29BrusselsBelgium
5PedroAlmodóvar1949-09-25NULLCalzada de CalatravaSpain
6ChloéZhao1982-03-31NULLBeijingChina
7JordanPeele1979-02-21NULLNew York CityUSA
8CélineSciamma1978-11-12NULLPontoiseFrance
9Jean-LucGodard1930-12-032022-09-13ParisFrance
10StanleyKubrick1928-07-261999-03-07New York CityUSA

Es ist eine einfache Liste von Regisseuren mit einigen Informationen über sie.

Die zweite Tabelle ist films. Auch diese Tabelle können Sie mit dieser Abfrage erstellen. Die Daten in der Tabelle sehen so aus:

iddirector_idfilm_namerelease_datelanguage
17Get Out2017-01-23English
22We Need to Talk About Kevin2011-05-12English
32You Were Never Really Here2017-05-27English
45The Skin I Live In2011-05-19Spanish
57Us2019-03-08English
62Ratcatcher1999-05-13English
72Morvern Collar2002-11-01English
83El Topo1970-12-18Spanish
93The Holy Mountain1973-11-27Spanish
10NULLDog Day Afternoon1975-09-20English
11NULLThe Hater2020-03-06Polish
121Cries and Whispers1972-12-21English

Es handelt sich um eine Liste von Filmen, die mit der Tabelle directors über die Spalte director_id verbunden ist. Zwei Werte von director_id sind NULL. Im Kontext unseres Datensatzes bedeutet dies, dass Daten über diese Filme in der Tabelle vorhanden sind films. Es gibt jedoch keinen entsprechenden Regisseur in der Tabelle directors. Mit anderen Worten: Wir haben alle Informationen über "Dog Day Afternoon" und "The Hater", nur nicht über den Regisseur.

Da wir nun die Daten kennen, können wir uns mit COUNT() beschäftigen.

Was ist COUNT()?

Die Antwort liegt im Namen: Die Funktion COUNT() in SQL wird zum Zählen von Zeilen verwendet. Sie zählt die Zeilen in der Ergebnismenge, nicht in der Tabelle. Genauer gesagt zählt sie die Zeilen in der Tabelle, wenn es sich bei Ihrer Tabelle um eine Ergebnismenge handelt - d. h. wenn Sie die Daten in keiner Weise gefiltert haben. Wenn Sie die Daten überhaupt filtern, gibt COUNT() die Anzahl der Zeilen in den gefilterten Daten zurück.

Hier ist ein Beispiel:

SELECT 
  COUNT(*) AS number_of_directors
FROM directors;

Das Sternchen (*) in der Funktion COUNT() weist sie an, alle Zeilen zu zählen. Da keine Filter angewendet werden, ist die gesamte directors Tabelle die Ergebnismenge sein. Die Funktion COUNT() gibt daher die Anzahl der Zeilen in der Tabelle zurück:

number_of_directors
10

Die Anzahl der Zeilen ist zehn, was in diesem Fall auch der Anzahl der Direktoren entspricht.

Wenn die Ergebnismenge begrenzt ist, gibt COUNT(*) einen anderen Wert zurück. Nehmen wir zum Beispiel an, wir wollen die Anzahl der toten Direktoren anzeigen. Das bedeutet, dass nur Direktoren gezählt werden, die ein Datum in der Spalte date_of_death haben. Diejenigen, die den Wert NULL haben, sind noch am Leben. Hier ist die Abfrage:

SELECT 
  COUNT(*) AS number_of_dead_directors
FROM directors
WHERE date_of_death IS NOT NULL;

Wir haben erreicht, was wir wollten, indem wir die Daten mit der Klausel WHERE gefiltert haben. Hier ist das Ergebnis:

number_of_dead_directors
4

Vier Direktoren sind nicht mehr am Leben.

COUNT() und GROUP BY

Normalerweise wird die Funktion COUNT() zusammen mit der Klausel GROUP BY verwendet. Um Ihr Gedächtnis aufzufrischen: GROUP BY ist eine Klausel, die alle Zeilen mit demselben Wert gruppiert. In der Regel sind die Gruppen bestimmte Spalten des Datasets. Weitere Informationen finden Sie in diesem Artikel über die Verwendung von GROUP BY.

Hier ist ein Beispiel für die Verwendung von GROUP BY mit COUNT(*):

SELECT 
  country_of_birth,
  COUNT(*) AS number_of_directors
FROM directors
GROUP BY country_of_birth
ORDER BY country_of_birth;

Wir möchten alle Länder und die Anzahl der in ihnen geborenen Direktoren anzeigen. Wir wählen das Land aus und verwenden COUNT(*), um die Anzahl der Direktoren anzuzeigen. Dann geben wir die Spalte country_of_birth in GROUP BY an.

Jede Spalte der Tabelle, die in SELECT auftaucht, muss auch in GROUP BY auftauchen. Das ist logisch, denn Sie wollen die Anzahl der Regisseure nach Geburtsland anzeigen und diese Länder gleichzeitig anzeigen.

Schließlich wird die Ausgabe mit ORDER BY country_of_birth alphabetisch nach Ländern sortiert:

country_of_birthnumber_of_directors
Belgium1
Chile1
China1
France2
Scotland1
Spain1
Sweden1
USA2

Es gibt einen Regisseur aus jedem Land außer Frankreich und den USA.

Wenn Sie weitere Beispiele benötigen, finden Sie hier einen Artikel, der zeigt, wie Sie GROUP BY mit SQL-Aggregatfunktionen verwenden können.

Verwendung von COUNT() mit einem Ausdruck oder einer Spalte

Sie sind nicht darauf beschränkt, ein Sternchen in COUNT() zu schreiben. Es kann auch mit einer Spalte oder einem Ausdruck verwendet werden, z. B. mit der Anweisung CASE WHEN.

Der Unterschied besteht darin, dass COUNT(expression) nur die Werte des Ausdrucks zählt, die nichtNULL sind. COUNT(*) zählt auch die Werte von NULL.

Versuchen wir zum Beispiel, alle Filmsprachen und die Anzahl der Regisseure aufzulisten, die Filme in diesen Sprachen gedreht haben. Es scheint, als hätten wir alle Daten in der Tabelle films.

Was würde passieren, wenn wir COUNT(*) verwenden?

SELECT 
  language,
  COUNT(*) AS number_of_directors
FROM films
GROUP BY language
ORDER BY language;
languagenumber_of_directors
English8
Polish1
Spanish3

Insgesamt zeigt diese Ausgabe alle 12 Filme an, die in der Tabelle erscheinen. Spoiler-Alarm: Das ist falsch!

Der Grund? Denken Sie daran, dass COUNT(*) die Anzahl der Zeilen im Datensatz zählt, einschließlich NULLen. Diese Ausgabe gibt also gar nicht die Anzahl der Regisseure an! Da wir die Zeilen in der Tabelle filmsgezählt haben, ist es nun offensichtlich, dass wir die Anzahl der Filme gezählt haben, nicht die der Regisseure!

Mit anderen Worten, es gibt acht Filme auf Englisch, einen auf Polnisch und drei auf Spanisch. Diese Ausgabe hat nichts mit der Anzahl der Regisseure zu tun!

Wäre es eine bessere Idee, COUNT(director_id) zu verwenden? Wir sollten es ausprobieren:

SELECT 
  language,
  COUNT(director_id) AS number_of_directors
FROM films
GROUP BY language
ORDER BY language;

Wir wählen die Sprachen aus und zählen die Regisseure über ihre Kennung: director_id. Die Ausgabe wird nach Sprachen gruppiert und sortiert.

languagenumber_of_directors
English7
Polish0
Spanish3

Die Ausgabe unterscheidet sich von der vorherigen, also analysieren wir sie.

Was wir bei der Zählung von director_id gut gemacht haben, ist, dass wir die Filme mit NULLs in director_id losgeworden sind. Dies ist besonders für die polnische Sprache offensichtlich - die Anzahl der Regisseure ist gleich Null. Und warum? Weil es nur einen einzigen polnischen Film gibt, und der hat ein NULL in director_id, also wird er nicht gezählt.

Weniger offensichtlich ist, dass ein solcher Film auch im Englischen "fehlt". Es ist Dog Day Afternoon, denn er hat auch eine NULL in director_id.

Insgesamt zeigt das Ergebnis zehn Regisseure an, da es zehn Datensätze in der Tabelle gibt films mit Nicht-NULL-Werten in der Spalte director_id.

Wenn Sie jedoch zur Tabelle zurückgehen filmszurückgehen, können Sie sehen, dass einige Direktoren-IDs mehrmals vorkommen. Wir haben also die Anzahl der Direktoren angezeigt, aber wir haben auch alle Direktoren jedes Mal einbezogen, wenn sie in der Tabelle auftauchen. Mit anderen Worten: Wir haben doppelte Werte einbezogen.

Dieses Ergebnis kommt also dem gewünschten Ergebnis näher, ist aber immer noch nicht ganz richtig. Die Zählung doppelter Direktoren-IDs bläht das Ergebnis auf, d. h. es zeigt eine unrealistisch hohe Anzahl einzelner Direktoren an.

Dieses Problem der Duplizierung ließe sich durch die Verwendung von COUNT() mit DISTINCT lösen.

COUNT(Ausdruck) mit DISTINCT

Nachdem Sie nun gelernt haben, wie man COUNT() mit einem Spaltennamen verwendet, ist es an der Zeit zu lernen, wie man es mit DISTINCT verwendet.

Die DISTINCT Klausel entfernt Duplikate. Wenn sie mit COUNT(expression) verwendet wird, bedeutet dies, dass die Funktion nur die eindeutigen Instanzen einer Spalte/eines Ausdrucks zählen wird.

Nehmen wir das gleiche Beispiel wie oben, aber mit DISTINCT:

SELECT 
  language,
  COUNT(DISTINCT director_id) AS number_of_directors
FROM films
GROUP BY language
ORDER BY language;

Beachten Sie, dass DISTINCT in die Funktion COUNT() geschrieben wird. Sie steht vor der Spalte, die Sie zählen wollen. Und hier sind die Ergebnisse:

languagenumber_of_directors
English3
Polish0
Spanish2

Das Ergebnis zeigt drei Regisseure mit englischen Filmen, null mit polnischen und zwei mit spanischen. Moment mal! Ist das nicht ein völlig anderes Ergebnis als bei der Verwendung von COUNT(director_id) ohne DISTINCT?

Hier ist das vorherige Ergebnis:

languagenumber_of_directors
English7
Polish0
Spanish3

Ist Ihnen klar, was hier passiert ist? Ohne DISTINCT haben wir alle Werte von director_id gezählt. Der richtige Weg, die Anzahl der Direktoren in diesem Beispiel zu ermitteln, ist also die Verwendung von COUNT() mit DISTINCT.

Vorsicht! Verwendung von COUNT() mit LEFT JOIN

Lassen Sie uns schließlich unsere beiden Tabellen gleichzeitig verwenden. Stellen Sie sich vor, Sie möchten alle Regisseure und die Anzahl ihrer Filme ausgeben.

Sie würden (richtigerweise) denken, dass Sie LEFT JOIN benötigen. Das ist ein guter Anfang! Es gibt vielleicht Regisseure in der Tabelle directors sein, die keine Filme in unserer films Tabelle haben.

Da wir die Liste aller Regisseure anzeigen wollen, ist LEFT JOIN die richtige Wahl. Um die Anzahl der Filme zu zählen, könnten Sie den Drang verspüren, COUNT(*) zu verwenden. Hier ist die Abfrage:

SELECT 
  d.id,
  d.first_name,
  d.last_name,
  COUNT(*) AS number_of_films
FROM directors d
LEFT JOIN films f
ON d.id = f.director_id
GROUP BY d.id, d.first_name, d.last_name
ORDER BY d.id;

Wir haben die erforderlichen Spalten ausgewählt und COUNT(*) verwendet. Die beiden Tabellen werden über die Spalte mit den IDs der Regisseure verbunden.

Die Ausgabe wird nach den IDs und Namen der Regisseure gruppiert und nach der ID sortiert. Und die Ergebnisse:

idfirst_namelast_namenumber_of_films
1IngmarBergman1
2LynneRamsay4
3AlejandroJodorowsky2
4AgnesVarda1
5PedroAlmodóvar1
6ChloéZhao1
7JordanPeele2
8CélineSciamma1
9Jean-LucGodard1
10StanleyKubrick1

Es scheint, dass jeder Regisseur mindestens einen Film hat. Insgesamt sind das 15 Filme. Moment mal! Das kann doch nicht stimmen! Es gibt nur 12 Filme in der Tabelle films.

Außerdem wissen wir mit Sicherheit, dass es in der Tabelle keine Stanley Kubrick-Filme gibt. Wie kommt es, dass die Ausgabe zeigt, dass er einen hat? Sind die Daten für alle anderen Regisseure auch falsch? Ja. Die Verwendung von COUNT(*) ist in diesem Fall nicht die richtige Lösung. LEFT JOIN gibt eine Zeile für alle Regisseure zurück, auch für die, die nicht in der Tabelle gefunden werden konnten films. Und COUNT(*) zählt alle diese Zeilen, auch die, die keine passenden Filme haben.

Verwenden Sie anstelle von COUNT(*) COUNT() mit dem Spaltennamen. Welche Spalte soll man zählen? Am sichersten ist es, die eindeutigen Bezeichner zu zählen, d. h. die Spalten-ID aus der Tabelle films.

SELECT 
  d.id,
  d.first_name,
  d.last_name,
  COUNT(f.id) AS number_of_films
FROM directors d
LEFT JOIN films f
ON d.id = f.director_id
GROUP BY d.id, d.first_name, d.last_name;

Die Abfrage ist praktisch dieselbe wie zuvor, abgesehen von der unterschiedlichen Verwendung von COUNT(). Und das ist das Ergebnis:

idfirst_namelast_namenumber_of_films
1IngmarBergman1
2LynneRamsay4
3AlejandroJodorowsky2
4AgnesVarda0
5PedroAlmodóvar1
6ChloéZhao0
7JordanPeele2
8CélineSciamma0
9Jean-LucGodard0
10StanleyKubrick0

Das ist schon besser! Wenn Sie die Werte zusammenzählen, werden Sie feststellen, dass es insgesamt zehn Filme gibt. Warum nicht 12? Weil zwei Filme von Regisseuren sind, die es in unserem Datensatz nicht gibt, d.h. sie haben NULLs in der Spalte director_id in der Tabelle films.

Um das hier Gelernte zu festigen, sehen Sie sich einige weitere Beispiele für die Verwendung von COUNT() an.

COUNT() ist so einfach wie eins, zwei, drei!

Das war doch nicht schwer, oder? Diese einfachen Beispiele haben Ihnen alle Varianten der Verwendung von COUNT() gezeigt. Die Funktion selbst ist nicht schwer zu verstehen. Aber, wie Sie gesehen haben, gibt es mehrere Möglichkeiten, sie zu verwenden, und jede kann ein anderes Ergebnis liefern.

Die Entscheidung, wie Sie COUNT() verwenden, wird mit etwas Übung einfacher. Die SQL-Übungssatz ist genau für diesen Zweck gedacht. Sie können auch diese sieben Beispiele für die Funktion COUNT() ausprobieren.

Abgesehen von der Übung ist es wichtig, dass Sie Ihre Daten kennen und wissen, was Sie mit ihnen erreichen wollen. Wenn Ihnen das alles klar ist, wird COUNT() wirklich zu einer einfachen Funktion. Darauf können Sie sich verlassen! Wortspiel beabsichtigt.