count (*) y count (column_name), ¿cuál es la diferencia?

count(*) y count(column_name) , ¿cuál es la diferencia en mysql?

  • COUNT(*) cuenta todas las filas en el conjunto de resultados (o grupo si usa GROUP BY).
  • COUNT(column_name) solo cuenta aquellas filas donde column_name NO ES NULL. Esto puede ser más lento en algunas situaciones, incluso si no hay valores NULOS porque el valor debe ser verificado (a menos que la columna no sea nula).
  • COUNT(1) es lo mismo que COUNT(*) ya que 1 nunca puede ser NULL.

Para ver la diferencia en los resultados, puedes probar este pequeño experimento:

 CREATE TABLE table1 (x INT NULL); INSERT INTO table1 (x) VALUES (1), (2), (NULL); SELECT COUNT(*) AS a, COUNT(x) AS b, COUNT(1) AS c FROM table1; 

Resultado:

 a B C
 3 2 3

Dependiendo de la definición de la columna, es decir, si su columna permite NULL, podría obtener resultados diferentes (y podría ser más lento con el recuento (columna) en algunas situaciones como Mark ya le dijo).

No hay diferencia de rendimiento entre COUNT (*) , COUNT (ColumnName) , COUNT (1) .

Ahora, si tiene COUNT (ColumnName) entonces la base de datos debe verificar si la columna tiene un valor NULL y los NULL s se eliminan de los agregados. Entonces COuNT (*) o COUNT (1) es preferible a COUNT (ColumnName) menos que desee COUNT (DISTINCT ColumnName)

En la mayoría de los casos, hay poca diferencia, y generalmente se prefiere COUNT(*) o COUNT(1) . Sin embargo, hay una situación importante en la que debe usar COUNT(columnname) : uniones externas.

Si realiza una combinación externa desde una tabla principal a una tabla secundaria y desea obtener cero recuentos en las filas que no tienen elementos relacionados en la tabla secundaria, debe usar COUNT(column in child table) . Cuando no hay coincidencias, esa columna será NULL y obtendrás el recuento de cero deseado (en realidad, obtendrás NULL , pero puedes convertirlo a 0 con IFNULL() o COALESCE() ). Si usa COUNT(*) , cuenta la fila de la tabla primaria, por lo que obtendrá un recuento de 1 .

 SELECT c.name, COALESCE(COUNT(o.id), 0) AS order_count FROM customers AS c LEFT JOIN orders AS o ON o.customer_id = c.id