web-dev-qa-db-fra.com

Qu'est-ce que COUNT (1) compte réellement?

Duplicata possible:
Quelle est la différence entre select count (*) et select count (any_non_null_column)?

J'ai entendu dire couramment que lors du comptage du nombre de lignes dans une requête, vous ne devriez pas faire une COUNT(*) mais vous devriez faire un compte sur une colonne indexée.

J'ai vu des administrateurs de base de données, lors du comptage du nombre de lignes, exécutez SELECT COUNT(1) FROM table;.

Quel est le 1 dans la requête?

J'ai essayé de mettre d'autres nombres (2, 0, -1) et le résultat est toujours le même que d'utiliser 1.

S'agit-il simplement d'un raccourci plutôt que d'avoir la liste d'une colonne spécifique à compter?

Existe-t-il des différences de performances entre l'utilisation d'une constante et la liste d'un nom de colonne?

J'utilise actuellement MySQl 5.1.60.

8
Patrick

si vous mettez count (*), count (1) ou count ("test") cela vous donnera le même résultat car mysql comptera le nombre de lignes, par exemple:

select count(fieldname) from table;

affichera le même résultat que

select count(*) from table;

ou

select count(1) from table

mysql> select * from language;
+-------------+----------+---------------------+
| language_id | name     | last_update         |
+-------------+----------+---------------------+
|           1 | English  | 2006-02-15 05:02:19 |
|           2 | Italian  | 2006-02-15 05:02:19 |
|           3 | Japanese | 2006-02-15 05:02:19 |
|           4 | Mandarin | 2006-02-15 05:02:19 |
|           5 | French   | 2006-02-15 05:02:19 |
|           6 | German   | 2006-02-15 05:02:19 |
+-------------+----------+---------------------+
6 rows in set (0.00 sec)

mysql> select 1 from language;
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
+---+
6 rows in set (0.00 sec)

mysql> select 'anything'from language;
+----------+
| anything |
+----------+
| anything |
| anything |
| anything |
| anything |
| anything |
| anything |
+----------+
6 rows in set (0.00 sec)

mysql> select count(1), count(*), count('anything') from language;
+----------+----------+-------------------+
| count(1) | count(*) | count('anything') |
+----------+----------+-------------------+
|        6 |        6 |                 6 |
+----------+----------+-------------------+
1 row in set (0.00 sec)

le résultat sera un nombre égal au nombre de lignes de cette table.

VEUILLEZ PRENDRE NOTE QUE LES ZONES NULES NE SERONT PAS COMPTÉES ....

mysql> select original_language_id from film where original_language_id is null;
+----------------------+
| original_language_id |
+----------------------+
|                 NULL |
|                 NULL |
|                 NULL |
|                 NULL |
|                 NULL |
|                 NULL |
|                 NULL |
......
|                 NULL |
+----------------------+
1000 rows in set (0.00 sec)

mysql> select count(original_language_id) from film where original_language_id is null;
+-----------------------------+
| count(original_language_id) |
+-----------------------------+
|                           0 |
+-----------------------------+
1 row in set (0.00 sec)

POUR CETTE RAISON SI VOUS VOULEZ COMPTER DES RANGS JE PENSE que compter (quelque chose) est une bonne option

mysql> SELECT COUNT(1) FROM film;
+----------+
| COUNT(1) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)
8
jcho360