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:
id | first_name | last_name | date_of_birth | date_of_death | place_of_birth | country_of_birth |
---|---|---|---|---|---|---|
1 | Ingmar | Bergman | 1918-07-14 | 2007-07-30 | Uppsala | Sweden |
2 | Lynne | Ramsay | 1969-12-05 | NULL | Glasgow | Scotland |
3 | Alejandro | Jodorowsky | 1929-02-07 | NULL | Tocophilla | Chile |
4 | Agnes | Varda | 1928-05-30 | 2019-03-29 | Brussels | Belgium |
5 | Pedro | Almodóvar | 1949-09-25 | NULL | Calzada de Calatrava | Spain |
6 | Chloé | Zhao | 1982-03-31 | NULL | Beijing | China |
7 | Jordan | Peele | 1979-02-21 | NULL | New York City | USA |
8 | Céline | Sciamma | 1978-11-12 | NULL | Pontoise | France |
9 | Jean-Luc | Godard | 1930-12-03 | 2022-09-13 | Paris | France |
10 | Stanley | Kubrick | 1928-07-26 | 1999-03-07 | New York City | USA |
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:
id | director_id | film_name | release_date | language |
---|---|---|---|---|
1 | 7 | Get Out | 2017-01-23 | English |
2 | 2 | We Need to Talk About Kevin | 2011-05-12 | English |
3 | 2 | You Were Never Really Here | 2017-05-27 | English |
4 | 5 | The Skin I Live In | 2011-05-19 | Spanish |
5 | 7 | Us | 2019-03-08 | English |
6 | 2 | Ratcatcher | 1999-05-13 | English |
7 | 2 | Morvern Collar | 2002-11-01 | English |
8 | 3 | El Topo | 1970-12-18 | Spanish |
9 | 3 | The Holy Mountain | 1973-11-27 | Spanish |
10 | NULL | Dog Day Afternoon | 1975-09-20 | English |
11 | NULL | The Hater | 2020-03-06 | Polish |
12 | 1 | Cries and Whispers | 1972-12-21 | English |
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_birth | number_of_directors |
---|---|
Belgium | 1 |
Chile | 1 |
China | 1 |
France | 2 |
Scotland | 1 |
Spain | 1 |
Sweden | 1 |
USA | 2 |
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; |
language | number_of_directors |
---|---|
English | 8 |
Polish | 1 |
Spanish | 3 |
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 films
gezä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.
language | number_of_directors |
---|---|
English | 7 |
Polish | 0 |
Spanish | 3 |
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 films
zurü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:
language | number_of_directors |
---|---|
English | 3 |
Polish | 0 |
Spanish | 2 |
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:
language | number_of_directors |
---|---|
English | 7 |
Polish | 0 |
Spanish | 3 |
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:
id | first_name | last_name | number_of_films |
---|---|---|---|
1 | Ingmar | Bergman | 1 |
2 | Lynne | Ramsay | 4 |
3 | Alejandro | Jodorowsky | 2 |
4 | Agnes | Varda | 1 |
5 | Pedro | Almodóvar | 1 |
6 | Chloé | Zhao | 1 |
7 | Jordan | Peele | 2 |
8 | Céline | Sciamma | 1 |
9 | Jean-Luc | Godard | 1 |
10 | Stanley | Kubrick | 1 |
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:
id | first_name | last_name | number_of_films |
---|---|---|---|
1 | Ingmar | Bergman | 1 |
2 | Lynne | Ramsay | 4 |
3 | Alejandro | Jodorowsky | 2 |
4 | Agnes | Varda | 0 |
5 | Pedro | Almodóvar | 1 |
6 | Chloé | Zhao | 0 |
7 | Jordan | Peele | 2 |
8 | Céline | Sciamma | 0 |
9 | Jean-Luc | Godard | 0 |
10 | Stanley | Kubrick | 0 |
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.