Was bedeutet "Anzahl (1) aus Tabellenname auswählen" für Datenbanktabellen?


89

Wenn wir ausführen select count(*) from table_name, wird die Anzahl der Zeilen zurückgegeben.

Was macht count(1)das Was 1bedeutet hier? Ist dies dasselbe wie count(*)(da es bei der Ausführung das gleiche Ergebnis liefert)?


1
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


17

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


9

Dies ähnelt dem Unterschied zwischen

SELECT * FROM table_name and SELECT 1 FROM table_name.  

Wenn Sie tun

SELECT 1 FROM table_name

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)


3
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.

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.


5
SELECT COUNT(1) from <table name>

sollte genau das Gleiche tun wie

SELECT COUNT(*)  from <table name>

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.


3

im Orakel glaube ich, dass diese genau die gleiche Bedeutung haben


Bezieht sich die 1 auf Spalte eins?
Dacracot

1
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:

create table test1(
 id number,
 name varchar2(20)
);

insert into test1 values (1,'abc');
insert into test1 values (1,'abc');

select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) from test1;

0

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.
Johann Zacharee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.