11th Apr 2023 10 Leseminuten Ein detaillierter Leitfaden für die SQL-Funktion COUNT() Tihomir Babic Aggregatfunktionen Inhaltsverzeichnis Beispiel-Datensatz Was ist COUNT()? COUNT() und GROUP BY Verwendung von COUNT() mit einem Ausdruck oder einer Spalte COUNT(Ausdruck) mit DISTINCT Vorsicht! Verwendung von COUNT() mit LEFT JOIN COUNT() ist so einfach wie eins, zwei, drei! 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. Tags: Aggregatfunktionen