count (*) vs count (nome-colonna) – che è più corretto?

Fa la differenza se count(*) vs count(column-name) come in questi due esempi?

Ho la tendenza a scrivere sempre count(*) perché sembra adattarsi meglio nella mia idea con la nozione di essere una funzione aggregata, se questo ha senso.

Ma non sono sicuro che sia tecnicamente migliore visto che tendo a vedere codice di esempio scritto senza * più delle volte.

contare(*):

 select customerid, count(*), sum(price) from items_ordered group by customerid having count(*) > 1; 

vs. count (nome-colonna):

 SELECT customerid, count(customerid), sum(price) FROM items_ordered GROUP BY customerid HAVING count(customerid) > 1; 

  • COUNT(*) conta tutte le righe
  • COUNT(column) conta solo i non NULL
  • COUNT(1) è uguale a COUNT(*) perché 1 è un’espressione non nulla

L’utilizzo di COUNT(*) o COUNT(column) dovrebbe basarsi solo sull’output desiderato.

Questo vale per MySQL. Non sono sicuro degli altri.

La differenza è:

  • COUNT(*) conterrà il numero di record.
  • COUNT(column_name) conteggia il numero di record in cui column_name non è nullo.

Pertanto, COUNT(*) è ciò che dovresti usare. Se si utilizza MyISAM e non esiste una clausola WHERE , l’ottimizzatore non deve nemmeno guardare la tabella, poiché il numero di righe è già memorizzato nella cache.

Quando si tratta di un identificatore (e garantito che non è NULL ), probabilmente non ha importanza.

Tuttavia, c’è una differenza tra COUNT(*) e COUNT(column) in generale, in quanto COUNT(column) restituirà un conteggio dei valori non NULL nella colonna. C’è anche la variante COUNT(DISTINCT column) che restituisce il numero di valori unici, non NULL .

Generalmente è lo stesso, ma nei dettagli AFAIK “count (*)” è meglio b / c “count (columnname)” impone al DB di eseguire un po ‘più di codice per cercare il nome della colonna (ma non è necessario).

Sì, c’è una differenza nelle prestazioni. A seconda della query e dell’indicizzazione della tabella in questione, può essere più veloce ottenere il conteggio dall’indice anziché passare alla tabella per i dati. Quindi probabilmente dovresti specificare il nome del campo, invece di usare *.