Count (*) и count (column_name), что такое diff?

count(*) и count(column_name), какая разница в mysql.

Ответ 1

  • COUNT(*) подсчитывает все строки в результирующем наборе (или группе, если используется GROUP BY).
  • COUNT(column_name) учитывает только те строки, где column_name не является NULL. Это может быть медленнее в некоторых ситуациях, даже если нет значений NULL, потому что значение должно быть проверено (если только столбец не имеет значения NULL).
  • COUNT(1) совпадает с COUNT(*), поскольку 1 никогда не может быть NULL.

Чтобы увидеть разницу в результатах, вы можете попробовать этот небольшой эксперимент:

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;

Результат:

a   b   c
3   2   3

Ответ 2

В зависимости от определения столбца -i.e, если ваш столбец разрешает NULL - вы можете получить разные результаты (и в некоторых ситуациях он может быть медленнее с count (столбец), как уже сказал Марк).

Ответ 3

Нет разницы в производительности между COUNT (*), COUNT (ColumnName), COUNT (1).

Теперь, если у вас есть COUNT (ColumnName), тогда база данных должна проверить, имеет ли столбец значение NULL, а NULL исключены из агрегатов. Поэтому COUNT (*) или COUNT (1) предпочтительнее COUNT (ColumnName), если вы не хотите COUNT (DISTINCT ColumnName)

Ответ 4

В большинстве случаев небольшая разница и COUNT(*) или COUNT(1) обычно предпочтительнее. Однако есть одна важная ситуация, когда вы должны использовать COUNT(columnname): внешние соединения.

Если вы выполняете внешнее соединение из родительской таблицы в дочернюю таблицу, и вы хотите получить нулевые подсчеты в строках, которые не имеют связанных элементов в дочерней таблице, вы должны использовать COUNT(column in child table). Если нет совпадений, этот столбец будет NULL, и вы получите нулевое количество отсчетов (на самом деле вы получите NULL, но вы можете преобразовать его в 0 с помощью IFNULL() или COALESCE()). Если вы используете COUNT(*), он подсчитывает строку из родительской таблицы, поэтому вы получите счетчик 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