2013-08-17 25 views
24

Recentemente mi è stata posta questa domanda in un'intervista. Ho provato questo in mySQL e ho ottenuto gli stessi risultati (risultati finali). Tutti hanno dato il numero di righe in quella particolare tabella. Qualcuno può spiegare la principale differenza tra loro.Qual è la differenza tra count (0), count (1) .. e count (*) in mySQL/SQL?

+1

Hanno un valore 'nullo' in una colonna. Quindi fai un conteggio sulla colonna. Guarda come differiscono i conti. Selezionando '0' o '1' è solo selezionando una costante per ogni riga, non sarà coinvolto' nullo'. – Glenn

+0

possibile duplicato di [In SQL, qual è la differenza tra count (column) e count (\ *)?] (Http://stackoverflow.com/questions/59294/in-sql-whats-the-difference- between betweencountcolumn -e-count) – newtover

risposta

30

Nulla di veramente, a meno che non si specifica un campo in una tabella o un'espressione all'interno parantheses invece di valori costanti o *

mi permetta di dare una risposta dettagliata. Count ti darà il numero di record non nullo del campo dato. Diciamo che avete una tabella denominata Un

select 1 from A 
select 0 from A 
select * from A 

saranno tutti tornare stesso numero di record, che è il numero di righe nella tabella A. Ancora l'output è diverso. Se ci sono 3 record nella tabella. Con X e Y come nomi di campo

select 1 from A will give you 

1 
1 
1 

select 0 from A will give you 
0 
0 
0 

select * from A will give you (assume two columns X and Y is in the table) 
X  Y 
--  -- 
value1 value1 
value2 (null) 
value3 (null) 

Quindi, tutte e tre le query restituiscono lo stesso numero. Meno di utilizzare

select count(Y) from A 

poiché c'è solo un valore non nullo si ottiene 1 come uscita

+1

Quindi, perché esattamente i valori integrali sono passati alla funzione di conteggio? – Dhruv

+0

@DhruvSingh ti ha fornito maggiori dettagli nella mia risposta – Bren

+0

@Bren ci sono differenze in termini di prestazioni? –

20

COUNT(*) conta il numero di righe, mentre COUNT(expression) conterà valori non nulli nell'espressione e COUNT(column) sarà conta tutti i valori non nulli nella colonna.

Poiché entrambi 0 e 1 sono valori non nulli, COUNT(0)=COUNT(1) e entrambi saranno equivalenti al numero di righe COUNT(*). È un concetto diverso, ma il risultato sarà lo stesso.

+0

Grazie a fthiella. @brhneser ha una risposta molto dettagliata per un principiante come me. – Dhruv

+1

Sì, hai ragione, ma penso che 'count (*)' impiegherà più tempo di 'count (1)', non è vero? Se sì, allora usare 'count (1)' sarebbe meglio per il modo di performance. :) – Yubaraj

+3

@Yubaraj count (1) utilizzato per avere prestazioni migliori del conteggio (*), almeno su alcuni dbms, ma al giorno d'oggi l'ottimizzatore è in grado di fare il conteggio (*) equivalente al conteggio (1) – fthiella

10

Ora - dovrebbero tutti eseguire identicamente.

In passato, tuttavia, COUNT (1) (o qualsiasi altra costante che si scegliesse) a volte veniva raccomandato su COUNT (*) perché uno scarso codice di ottimizzazione delle query avrebbe consentito al database di recuperare tutti i dati del campo prima dell'esecuzione del conteggio . COUNT (1) era quindi più veloce, ma non dovrebbe importare ora.