Interessante Frage. Mich würde auch interessieren, ob die Antwort implementierungsabhängig ist (z. B. ob das Ergebnis der Abfrage in SQL Server das gleiche ist wie in Oracle).
Jon Schneider
Antworten:
105
Der Parameter für die COUNT-Funktion ist ein Ausdruck, der für jede Zeile ausgewertet werden soll. Die COUNT-Funktion gibt die Anzahl der Zeilen zurück, für die der Ausdruck einen Wert ungleich Null ergibt. (* ist ein spezieller Ausdruck, der nicht ausgewertet wird. Er gibt einfach die Anzahl der Zeilen zurück.)
Es gibt zwei zusätzliche Modifikatoren für den Ausdruck: ALL und DISTINCT. Diese bestimmen, ob Duplikate verworfen werden. Da ALL die Standardeinstellung ist, entspricht Ihr Beispiel der Anzahl (ALL 1), was bedeutet, dass Duplikate beibehalten werden.
Da der Ausdruck "1" für jede Zeile einen Wert ungleich Null ergibt und Sie keine Duplikate entfernen, sollte COUNT (1) immer dieselbe Nummer wie COUNT (*) zurückgeben.
Denken Sie daran, wählen Sie DISTINCT coloumn1 aus Tabelle1! = Select count (DISTINCT coloumn1) aus Tabelle1;
Kanagavelu Sugumar
Auch count (1) hier ist 1 nicht Spalte Nr., Es ist ein Ausdruck. zB) wähle 1 aus Tabelle1; wird 1 Mal für keine der Zeilen in dieser Tabelle gedruckt.
Kanagavelu Sugumar
Wählen Sie count (DISTINCT / ALL columnName) aus Tabelle1 aus. gibt keinen von allen / eindeutigen NOT NULL-Werten der Spalte (columnName) zurück.
Kanagavelu Sugumar
Wählen Sie DISTINCT column1 aus table1 aus. wird einen NULL-Wert in die Spalte (Spalte1) aufnehmen. Wählen Sie count (DISTINCT coloumn1) aus table1 aus. wird nicht einmal eine NULL-Zeile enthalten.
Kanagavelu Sugumar
1
@datps - Es gibt tatsächlich eine unbegrenzte Anzahl von Ausdrücken, die das gleiche Ergebnis liefern. COUNT ('Hallo Welt!') Sollte genauso gut funktionieren. (Ich habe es nicht ausprobiert.) Die Frage ist also, warum ein spezieller Ausdruck (*) erstellt wird, wenn es bereits eine unbegrenzte Anzahl von Möglichkeiten gibt, dasselbe zu tun. Ich kann nicht für die Schöpfer von SQL sprechen (die viele Sünden zu büßen haben :)), aber es war wahrscheinlich so, dass die Leute nicht willkürlich einen Nicht-Null-Ausdruck wählen mussten. Das hätte die Absicht des Autors der Abfrage getrübt. "Warum haben sie 1 statt 2 geschrieben? Das muss etwas bedeuten!"
Jeffrey L Whitledge
26
Hier ist ein Link , der Ihnen bei der Beantwortung Ihrer Fragen hilft. Zusamenfassend:
count (*) ist die richtige Schreibweise und count (1) ist OPTIMIERT, um intern count (*) zu sein - seitdem
a) Zählen der Zeilen, bei denen 1 nicht Null ist, ist weniger effizient als
b) Zählen der Zeilen
Sie erhalten die Nummer 1 für jede Zeile in der Tabelle. Also ja count(*)und count(1)liefert die gleichen Ergebnisse wie will count(8)odercount(column_name)
count (Spaltenname) ist nicht ganz gleich - es werden keine Zeilen mit null in dieser Spalte gezählt. Siehe hier für Details: stackoverflow.com/questions/169784
Blorgbeard ist
Hmm, eigentlich ist das für SQL Server. Oracle könnte anders funktionieren, nehme ich an.
Blorgbeard ist
Count sollte niemals NULL-Werte gemäß Standard-SQL verwenden. ORacle und SQL Server sollten diesbezüglich dasselbe Verhalten aufweisen.
Thorsten
"Ähnlich dem Unterschied zwischen SELECT * FROM Tabellenname und SELECT 1 FROM Tabellenname." -- nicht wirklich. SELECT * und SELECT 1 sind unterschiedlich. SELECT (*) und SELECT (1) ergeben das gleiche Ergebnis.
David Aldridge
6
Es gibt keinen Unterschied.
COUNT(1)zählt im Grunde nur einen konstanten Wert 1 Spalte für jede Zeile. Wie andere Benutzer hier gesagt haben, ist es dasselbe wie COUNT(0)oder COUNT(42). Jeder Nichtwert NULLwird ausreichen.
Das Oracle-Optimierungsprogramm enthielt anscheinend Fehler, die dazu führten, dass die Anzahl davon beeinflusst wurde, welche Spalte Sie ausgewählt haben und ob sie sich in einem Index befand, sodass die COUNT (1) -Konvention ins Leben gerufen wurde.
Es mag Gründe gegeben haben oder noch geben, warum es besser als SELECT COUNT(*)eine Datenbank funktioniert, aber ich würde das als Fehler in der Datenbank betrachten.
SELECT COUNT(col_name)from<table name>
hat jedoch eine andere Bedeutung, da nur die Zeilen mit einem Wert ungleich Null für die angegebene Spalte gezählt werden.
nein, 1 bezieht sich auf die konstante Zahl 1. Wenn Sie ORDER BY 1 sagen, bezieht sich dies auf Spalte eins.
Thilo
Das habe ich mich vor einiger Zeit gefragt, aber Sie können jede Zahl angeben, die größer als die Spaltenanzahl ist. Trotzdem ist das Ergebnis dasselbe. Es ist also definitiv keine Spaltennummer.
Nrj
@ Dacracot: Es kann, aber ich glaube nicht. Soweit ich weiß, schreibt Oracle Count (1) neu, um Count (*) im Hintergrund zu sein
Jarod Elliott
2
Sie können so testen:
createtable test1(
id number,
name varchar2(20));insertinto test1 values(1,'abc');insertinto test1 values(1,'abc');select*from test1;select count(*)from test1;select count(1)from test1;select count(ALL1)from test1;select count(DISTINCT1)from test1;
Je nachdem, wen Sie fragen, berichten einige Leute, dass die Ausführung select count(1) from random_table;schneller läuft alsselect count(*) from random_table . Andere behaupten, sie seien genau gleich.
Dieser Link behauptet, dass der Geschwindigkeitsunterschied zwischen den beiden auf einen FULL TABLE SCAN und einen FAST FULL SCAN zurückzuführen ist.
Sie interpretieren den Link falsch. LS weist darauf hin, dass COUNT (COLUMN) mit COUNT (*) identisch und schneller sein kann, jedoch nur dann, wenn keine NOT NULL-Spalten indiziert sind, COLUMN jedoch indiziert ist und tatsächlich keine Nullwerte aufweist. Eher eine Trickfrage.
David Aldridge
1
Ich habe versucht, über den Link die Behauptung zu dokumentieren, dass COUNT (1) unter bestimmten Umständen schneller sein könnte als COUNT (*). Einige frühere Antworten hatten die Aussage gemacht, dass es keine Unterschiede zwischen den beiden gab, und ich lieferte ein mögliches Gegenbeispiel.
Antworten:
Der Parameter für die COUNT-Funktion ist ein Ausdruck, der für jede Zeile ausgewertet werden soll. Die COUNT-Funktion gibt die Anzahl der Zeilen zurück, für die der Ausdruck einen Wert ungleich Null ergibt. (* ist ein spezieller Ausdruck, der nicht ausgewertet wird. Er gibt einfach die Anzahl der Zeilen zurück.)
Es gibt zwei zusätzliche Modifikatoren für den Ausdruck: ALL und DISTINCT. Diese bestimmen, ob Duplikate verworfen werden. Da ALL die Standardeinstellung ist, entspricht Ihr Beispiel der Anzahl (ALL 1), was bedeutet, dass Duplikate beibehalten werden.
Da der Ausdruck "1" für jede Zeile einen Wert ungleich Null ergibt und Sie keine Duplikate entfernen, sollte COUNT (1) immer dieselbe Nummer wie COUNT (*) zurückgeben.
quelle
Hier ist ein Link , der Ihnen bei der Beantwortung Ihrer Fragen hilft. Zusamenfassend:
quelle
Unterschied zwischen Anzahl (*) und Anzahl (1) im Orakel?
count (*) bedeutet, dass alle Datensätze gezählt werden, dh jede einzelne Zelle, ABER
count (1) bedeutet, dass eine Pseudospalte mit dem Wert 1 hinzugefügt wird und die Anzahl aller Datensätze zurückgegeben wird
quelle
Dies ähnelt dem Unterschied zwischen
Wenn Sie tun
Sie erhalten die Nummer 1 für jede Zeile in der Tabelle. Also ja
count(*)
undcount(1)
liefert die gleichen Ergebnisse wie willcount(8)
odercount(column_name)
quelle
Es gibt keinen Unterschied.
COUNT(1)
zählt im Grunde nur einen konstanten Wert 1 Spalte für jede Zeile. Wie andere Benutzer hier gesagt haben, ist es dasselbe wieCOUNT(0)
oderCOUNT(42)
. Jeder NichtwertNULL
wird ausreichen.http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Das Oracle-Optimierungsprogramm enthielt anscheinend Fehler, die dazu führten, dass die Anzahl davon beeinflusst wurde, welche Spalte Sie ausgewählt haben und ob sie sich in einem Index befand, sodass die COUNT (1) -Konvention ins Leben gerufen wurde.
quelle
sollte genau das Gleiche tun wie
Es mag Gründe gegeben haben oder noch geben, warum es besser als
SELECT COUNT(*)
eine Datenbank funktioniert, aber ich würde das als Fehler in der Datenbank betrachten.hat jedoch eine andere Bedeutung, da nur die Zeilen mit einem Wert ungleich Null für die angegebene Spalte gezählt werden.
quelle
im Orakel glaube ich, dass diese genau die gleiche Bedeutung haben
quelle
Sie können so testen:
quelle
Je nachdem, wen Sie fragen, berichten einige Leute, dass die Ausführung
select count(1) from random_table;
schneller läuft alsselect count(*) from random_table
. Andere behaupten, sie seien genau gleich.Dieser Link behauptet, dass der Geschwindigkeitsunterschied zwischen den beiden auf einen FULL TABLE SCAN und einen FAST FULL SCAN zurückzuführen ist.
quelle