2010-03-31 10 views
28

Wenn ich eine Abfrage wie ausgeführt:Gibt COUNT (*) immer ein Ergebnis zurück?

SELECT COUNT(*) as num FROM table WHERE x = 'y' 

Wird es immer ein Ergebnis zurück, auch wenn die Abfrage keine Aufzeichnung überein? Oder muss ich überprüfen und sicherstellen, dass eine Zeile als Ergebnis zurückgegeben wird?

+9

Ist es zu schwer zu testen? –

+0

@col ja :) ',' –

+1

@col durch nicht versuchen und nur es hier, ich denke er will Zuschauer "Click Upvote" auf seine Fragen. – raj

Antwort

42

Ja, weil es ein Aggregat ist und gibt Null zurück. Es sei denn, Sie addieren GROUP BY in diesem Fall kein Ergebnis, weil es keine Gruppe gibt ...

MAX/SUM usw. würde NULL zurückgeben, wenn Sie GROUP BY dann keine Zeilen hinzufügen. Nur COUNT gibt eine Zahl für keine Ergebnisse

bearbeiten, ein bisschen spät: SUM würde NULL wie MAX zurückkehren

bearbeiten, Mai 2013: dies für alle Haupt RDBMS gilt. Ich denke, nach dem ANSI-Standard

+0

Es heißt, ich kann in 11 Minuten, wtf ... akzeptieren –

+0

Was ist mit Funktionen wie SUM(), würden sie 0 oder NULL zurückgeben? –

+2

@Click Upvote: Entschuldigung, ich habe nicht geantwortet. SUMME gibt NULL wie MAX. Nur COUNT liefert 0 – gbn

2

Ja, es wird eine numerische Rück

5

Aggregat Funktion Count immer() immer Wert Ja

+3

... wenn Sie nicht GROUP BY hinzufügen? – gbn

+1

... um zu verdeutlichen: Der "Rückgabewert der 'count' Funktion" ist IMMER eine Ausnahme, die keine Null ist. Indem Sie "group by" erwähnen, verweisen Sie auf die enthaltene Abfrage und ändern den Betreff "Rückgabewert" von "count function" in "query's result set". Eine nicht gruppierte Zählerabfrage erzeugt eine Ergebnismenge eines einzelnen Datensatzes, der den Rückgabewert von count enthält. Alternativ erzeugt eine gruppierte Zählungsabfrage eine Ergebnismenge, wobei jeder Datensatz einen Zählwert enthält. Wenn es in diesem Fall keine Gruppen gibt, für die count ausgeführt werden soll, wird count niemals ausgeführt und der "query return value" ist ein leerer Satz. – Triynko

2

zurückkehrt, wird es 0 in solchen Fällen zurück.

2

Es wird immer eine Reihe von Ergebnis so aussehen:

| COUNT(*) | 
------------ 
| 0  | 

wenn es keine Übereinstimmungen.

Übrigens würde ich lieber nur den Primärschlüssel statt * zählen.

+2

'COUNT (*)' ist nicht das gleiche wie 'COUNT (Spalte)' im Allgemeinen. Beim Zählen einer Spalte wird nach verschiedenen Werten gesucht, nicht nach allen Datensätzen. Zugegeben, wenn Sie Ihren Primärschlüssel zählen, erhalten Sie alle Datensätze, da Primärschlüssel eindeutig sein müssen, aber dies ist nicht schneller als 'COUNT (*)' und möglicherweise langsamer (es sei denn, dass MySQL automatisch auf COUNT (*) '). –

+3

@Ty W - "Beim Zählen einer Spalte wird nach bestimmten Werten gesucht". Nein, das ist nicht wahr, es sei denn, Sie geben das Schlüsselwort distinct an. Es zählt Werte, die nicht "NULL" –

2

wenn kein Datensatz angepasst wird der Zählwert 0 zurück (also ja, zählen liefert immer ein Ergebnis, wenn Sie einige Syntaxfehler haben)

7

Ja, der Rückgabewert der "count" -Funktion selbst ist immer eine ganze Zahl ungleich Null, ohne Ausnahme.

auch sagen, dass Sie in dem Rückgabewert Ihrer Abfrage, das ist eigentlich ein Ergebnis gesetzt mehr interessiert sein könnten. Wenn dies der Fall ist, müssen Sie lediglich überlegen, ob Ihre Abfrage eine Klausel "Gruppierung nach" enthält.

A nicht gruppierten Abfrage mit Aggregatfunktionen wie

select count(*), sum(*), max(*), min(*) from table 

erzeugt ein Ergebnis mit einem einzelnen Datensatz den Rückgabewert (e) der Aggregatfunktion (en) enthält. In diesem Fall enthält Ihre Ergebnismenge immer genau einen Datensatz mit Spalten, die die Rückgabewerte der von Ihnen eingeschlossenen Aggregatfunktionen enthalten. Innerhalb dieses einsamen Datensatzes ist der Rückgabewert von count immer eine Nicht-Null-Ganzzahl, während die Rückgabewerte der anderen Aggregatfunktionen wie min, max und sum null sein können. Im obigen Beispiel kann der zurückgegebene Datensatz "null, null, null, null" sein, wird aber niemals "null, null, null, null" sein, da count nie null zurückgibt. Wenn Sie also nur "count" aufrufen, enthält diese eine Spalte in diesem zurückgegebenen Datensatz immer den Nicht-Null-Rückgabewert von count; Daher können Sie sicher sein, dass der skalare Rückgabewert Ihrer Zählungsabfrage immer eine ganze Zahl ungleich null ist.

Auf der anderen Seite, eine gruppierte Abfrage mit Aggregatfunktionen wie

select count(*), sum(*), max(*), min(*) from table group by column 

erzeugt ein Ergebnis mit null oder mehr Rekorde wo jeder Datensatz den Rückgabewert der Aggregatfunktion enthält (s) für jede identifizierte Gruppe. In diesem Fall, wenn keine Gruppen identifiziert sind, gibt es keine Gruppen für die Aggregatfunktionen, die ausgeführt werden, die Funktionen werden niemals ausgeführt und der "Abfrage-Rückgabewert" ist ein leerer Satz ohne Datensätze.

es Testen auf einem Tisch ohne Datensätze die Ergebnisse zu sehen:

create table #t (c int); 
select COUNT(c), MIN(c), MAX(c), SUM(c) from #t; --returns one record {0, null, null, null} 
select COUNT(c), MIN(c), MAX(c), SUM(c) from #t group by c; --returns no records 
drop table #t; 

Egal, ob Sie Zählung anrufen, min, max, oder die Summe, ist es wichtig, nicht nur die Rückgabewerte verstehen von einzelnen Aggregatfunktionen, aber auch der "Rückgabewert" der Abfrage selbst, und was diese Ergebnismenge enthält.

+0

Danke! Ich wollte euch nur wissen lassen, dass ich auf MySQL "SUM (*)" nicht ausführen konnte. – CMCDragonkai

Verwandte Themen