2009-08-30 10 views
12

Ai-je raison de dire:MySQL COUNT() et nulls

COUNT(expr) 
WHERE expr IS NOT * 

ne comptera que non nuls?

Est-ce que COUNT(*) comptera toujours toutes les lignes? Et que se passe-t-il si toutes les colonnes sont nulles?

Répondre

16

Correct. COUNT (*) correspond à toutes les lignes de la table, COUNT (Expression) à l'emplacement où l'expression est non nulle uniquement.

Si toutes les colonnes sont NULL (ce qui indique que vous n'avez pas de clé primaire, cela ne devrait pas se produire dans une base de données normalisée) COUNT (*) retourne toutes les lignes insérées. Ne fais pas ça.

Vous pouvez considérer le symbole * comme signifiant "dans le tableau" et non "dans n'importe quelle colonne".

+0

Est-il possible de compter nulls aussi, avec COUNT (expression)? –

+0

Si vous faites un COUNT (*) alors toutes les lignes sont comptées quel que soit le contenu de ces lignes. Si vous voulez voir les lignes totales * et * le nombre de lignes avec des valeurs pour SomeColumn, faites un SELECT COUNT (*) comme AllRows, COUNT (SomeColumn) comme SomeColumnCount. AllRows sera le nombre total de lignes renvoyées par la requête, tandis que SomeColumnCount sera le nombre de lignes où SomeColumn a une valeur. – Godeke

2

count(*) n'est pas pour les colonnes non nulles, c'est juste la façon de demander de compter toutes les lignes. Approximativement équivalent à count(1).

4

viens de vérifier:

select count (*)

de retour 1 avec un enregistrement rempli de NULLs

select count (champ)

renvoie 0.

Je ne Ne vois pas le point dans l'enregistrement avec des valeurs NULL. Un tel enregistrement ne doit pas exister.

+0

"Je ne vois pas le point dans l'enregistrement avec des valeurs NULL". oh ça m'est juste venu à l'esprit. Maintenant, quand vous dites cela je me suis dit que vous avez raison, je n'ai pas pensé quand j'ai demandé. – iceangel89

12

Si vous voulez compter NULLs aussi bien, essayez

SELECT COUNT(IFNULL(col, 1)) FROM table; 
+0

Superbe addition @Roey –