2010-03-31 15 views
28

Se corro una ricerca del tipo:Does COUNT (*) restituisce sempre un risultato?

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

Intende tornare sempre un risultato, anche quando la query non corrisponde ad alcun record? O devo convalidare e assicurarmi che una riga venga restituita come risultato?

+9

È troppo difficile da testare? –

+0

@col yea :) ',' –

+1

@col non provando e solo facendo clic qui, suppongo che vuole che gli spettatori facciano clic su "Upvote" alle sue domande. – raj

risposta

42

Sì, perché è un aggregato e restituisce lo zero. A meno che non si aggiunga GROUP BY in tal caso nessun risultato perché non vi è alcun gruppo ...

MAX/SUM ecc. Restituirebbe NULL a meno che non si aggiunga GROUP BY e quindi non ci siano righe. Solo COUNT restituisce un numero di risultati

Modifica, un po 'tardi: SUM sarebbe ritornato NULL come MAX

Modifica, maggio 2013: questo vale per tutti RDBMS principale. Immagino come per lo standard ANSI

+0

Dice che posso accettare in 11 minuti, wtf ... –

+0

Per quanto riguarda le funzioni come SUM(), restituiscono 0 o NULL? –

+2

@Click Upvote: mi dispiace, non ho risposto. SUM restituisce NULL come MAX. Solo COUNT restituisce 0 – gbn

2

Sì verrà restituito un numerica sempre

5

aggregata Count function() restituisce sempre il valore

+3

... a meno che non si aggiunga GROUP BY? – gbn

+1

... per chiarire: Il "valore di ritorno della funzione 'count'" è SEMPRE un numero intero non nullo, senza eccezioni. Menzionando "group by", si fa riferimento alla query contenente e si modifica l'oggetto di "valore di ritorno" da "funzione di conteggio" a "set di risultati della query". Una query di conteggio non raggruppata produce un set di risultati di un singolo record contenente il valore di ritorno del conteggio. In alternativa, una query di conteggio raggruppato produce un set di risultati in cui ogni record contiene un valore di conteggio. In tal caso, se non ci sono gruppi su cui eseguire il conteggio, il conteggio non viene mai eseguito e il "valore di ritorno della query" è un insieme vuoto. – Triynko

2

Sì, tornerà 0 in questi casi.

2

Ci sarà sempre una fila di risultato come questo:

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

se non ci sono corrispondenze.

A proposito, preferirei contare solo la chiave primaria anziché *.

+2

'COUNT (*)' non è uguale a 'COUNT (colonna)' in generale. Il conteggio di una colonna verifica la presenza di valori distinti, non tutti i record. Certo, quando conti la tua chiave primaria otterrai tutti i record perché le chiavi primarie devono essere uniche, ma non sarà più veloce di 'COUNT (*)' e potrebbe essere più lenta (a meno che MySQL non si auto-ottimizzi nuovamente a 'COUNT (*) '). –

+3

@Ty W - "Il conteggio di una colonna verifica la presenza di valori distinti". No, questo non è vero a meno che non si specifica la parola chiave 'distinct'. Conta valori che non sono 'NULL' –

2

se nessun record è abbinato il conteggio restituirà 0. (quindi sì, contare sempre restituisce un risultato, a meno che non hai qualche errore di sintassi)

7

Sì, il valore di ritorno della funzione "conteggio" è sempre un numero intero non nullo, senza eccezioni.

Detto questo, si può essere più interessati al valore di ritorno della vostra interrogazione, che è in realtà un risultato set. Se questo è il caso, devi semplicemente considerare se la tua query include una clausola "group by".

A non raggruppata interrogazione con funzioni di aggregazione come

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

produce un set di risultati con un singolo record contenente il valore restituito (s) della funzione di aggregazione (s). In questo caso, il set di risultati avrà sempre esattamente un record, con colonne contenenti i valori di ritorno di qualsiasi funzione aggregata che hai incluso. All'interno di questo record solitario, il valore di ritorno del conteggio sarà sempre un numero intero non nullo, mentre i valori di ritorno delle altre funzioni di aggregazione quali min, max e somma potrebbero essere nulli. Nell'esempio precedente, il record restituito può essere "zero, null, null, null", ma non sarà mai "null, null, null, null", poiché count non restituisce mai null. Quindi, se stai chiamando solo "conta", allora quella colonna in quel record restituito conterrà sempre il valore di ritorno non nullo del conteggio; quindi puoi essere certo che il valore di ritorno scalare della tua query di conteggio sarà sempre un numero intero non nullo.

D'altra parte, un query raggruppata con funzioni di aggregazione come

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

produce un set di risultati con zero o più record dove ciascun record contiene il valore di ritorno della funzione di aggregazione (s) per ciascun gruppo identificato. In questo caso, se non ci sono gruppi identificati, non ci sono gruppi per l'esecuzione delle funzioni aggregate, le funzioni non vengono mai eseguite e il "valore di ritorno della query" sarà un insieme vuoto senza alcun record.

provarlo su un tavolo con nessun record per vedere i risultati:

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; 

Quindi, se si sta chiamando conteggio, min, max, o somma, è importante capire non solo i valori di ritorno delle singole funzioni di aggregazione, ma anche il "valore di ritorno" della query stessa e ciò che contiene il set di risultati.

+0

Grazie! Volevo solo farti sapere che su MySQL non potevo eseguire 'SUM (*)'. – CMCDragonkai

Problemi correlati