Ich habe folgende Frage:
select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;
Was wäre der Unterschied , wenn ich alle Anrufe ersetzt count(column_name)
zu count(*)
?
Diese Frage wurde inspiriert von Wie finde ich doppelte Werte in einer Tabelle in Oracle? .
Um die akzeptierte Antwort (und möglicherweise meine Frage) zu verdeutlichen, würde das Ersetzen count(column_name)
durch count(*)
eine zusätzliche Zeile im Ergebnis zurückgeben, die a null
und die Anzahl der null
Werte in der Spalte enthält.
Ein weiterer kleiner Unterschied zwischen der Verwendung von * und einer bestimmten Spalte besteht darin, dass Sie im Spaltenfall das Schlüsselwort DISTINCT hinzufügen und die Anzahl auf bestimmte Werte beschränken können:
quelle
Ein weiterer und möglicherweise subtiler Unterschied besteht darin, dass in einigen Datenbankimplementierungen die Anzahl (*) berechnet wird, indem die Indizes für die betreffende Tabelle und nicht die tatsächlichen Datenzeilen betrachtet werden. Da keine bestimmte Spalte angegeben ist, müssen Sie sich nicht mit den tatsächlichen Zeilen und ihren Werten befassen (wie dies der Fall wäre, wenn Sie eine bestimmte Spalte gezählt hätten). Das Zulassen, dass die Datenbank die Indexdaten verwendet, kann erheblich schneller sein als das Zählen von "echten" Zeilen.
quelle
Die Erklärung in den Dokumenten hilft, dies zu erklären:
Count (*) enthält also Nullen, die andere Methode nicht.
quelle
Wir können den Stack Exchange Data Explorer verwenden , um den Unterschied mit einer einfachen Abfrage zu veranschaulichen. Die Benutzertabelle in der Datenbank von Stack Overflow enthält Spalten, die häufig leer bleiben, z. B. die Website-URL des Benutzers.
Wenn Sie die obige Abfrage im Daten-Explorer ausführen , sehen Sie, dass die Anzahl für
count(Id)
undcount(*)
weil dieId
Spalte keinenull
Werte zulässt , gleich ist. DieWebsiteUrl
Anzahl ist jedoch viel niedriger, da diese Spalte dies zulässtnull
.quelle
Grundsätzlich gibt die
COUNT(*)
Funktion alle Zeilen aus einer Tabelle zurück, währendCOUNT(COLUMN_NAME)
dies nicht der Fall ist. das heißt, es schließt Nullwerte aus, die alle hier auch hier beantwortet haben. Am interessantesten ist es jedoch, Abfragen und Datenbanken zu optimieren. Es ist besser, sie zu verwenden, esCOUNT(*)
sei denn, Sie führen mehrere Zählungen oder eine komplexe Abfrage durchCOUNT(COLUMN_NAME)
. Andernfalls wird die DB-Leistung beim Umgang mit einer großen Anzahl von Daten erheblich verringert.quelle
Informationen zu Testausführungen von SQL Server 2008 finden Sie im folgenden Code:
quelle
COUNT(*)
- Gibt die Gesamtzahl der Datensätze in einer Tabelle zurück (einschließlich Datensätze mit NULL-Werten).COUNT(Column Name)
- Gibt die Gesamtzahl der Nicht-NULL-Datensätze zurück. Dies bedeutet, dass das Zählen von NULL-Datensätzen in dieser bestimmten Spalte ignoriert wird.quelle
Es ist am besten zu verwenden
Um die Anzahl der Zeilen in einer Tabelle zu zählen, ist es schneller als jedes andere Format, da nie überprüft wird, ob der Spaltenname in der Tabelle vorhanden ist oder nicht
quelle
COUNT(*)
im Vergleich zuCOUNT(columnName)
nicht der Spaltenwert überprüft, da nur Zeilen aufgelistet werden. IstCOUNT(columnName)
aber langsamer auch dascount
auf eineid
Säule angewendete ! Zumindest in SQL Server natürlich.Es gibt keinen Unterschied, ob eine Spalte in Ihrer Tabelle fixiert ist. Wenn Sie mehr als eine Spalte verwenden möchten, müssen Sie angeben, wie viele Spalten Sie zählen müssen.
Vielen Dank,
quelle
Wie in den vorherigen Antworten erwähnt,
Count(*)
zählt sogar dieNULL
Spalte, währendcount(Columnname)
nur zählt, wenn die Spalte Werte hat.Es ist immer am beste Praxis zu vermeiden
*
(Select *
,count *
, ...)quelle
COUNT(*)