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