count(*) и count(column_name), какая разница в mysql.
Count (*) и count (column_name), что такое diff?
Ответ 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