ClickHouse/docs/ru/sql-reference/aggregate-functions/reference/count.md
2021-06-29 16:27:54 +03:00

4.0 KiB
Raw Blame History

toc_priority
1

count

Вычисляет количество строк или не NULL значений.

ClickHouse поддерживает следующие виды синтаксиса для count:

  • count(expr) или COUNT(DISTINCT expr).
  • count() или COUNT(*). Синтаксис count() специфичен для ClickHouse.

Аргументы

Функция может принимать:

Возвращаемое значение

  • Если функция вызывается без параметров, она вычисляет количество строк.
  • Если передаётся выражение, то функция подсчитывает количество раз, когда выражение не равно NULL. Если выражение имеет тип Nullable, то результат count не становится Nullable. Функция возвращает 0, если выражение равно NULL для всех строк.

В обоих случаях тип возвращаемого значения UInt64.

Подробности

ClickHouse поддерживает синтаксис COUNT(DISTINCT ...). Поведение этой конструкции зависит от настройки count_distinct_implementation. Она определяет, какая из функций uniq* используется для выполнения операции. По умолчанию — функция uniqExact.

Запрос SELECT count() FROM table не оптимизирован, поскольку количество записей в таблице не хранится отдельно. Он выбирает небольшой столбец из таблицы и подсчитывает количество значений в нём.

При этом запрос SELECT count(nullable_column) FROM table может быть оптимизирован включением настройки optimize_functions_to_subcolumns. При optimize_functions_to_subcolumns = 1 функция читает только подстолбец null вместо чтения всех данных таблицы. Запрос SELECT count(n) FROM table преобразуется к запросу SELECT sum(NOT n.null) FROM table.

Примеры

Пример 1:

SELECT count() FROM t
┌─count()─┐
│       5 │
└─────────┘

Пример 2:

SELECT name, value FROM system.settings WHERE name = 'count_distinct_implementation'
┌─name──────────────────────────┬─value─────┐
│ count_distinct_implementation │ uniqExact │
└───────────────────────────────┴───────────┘
SELECT count(DISTINCT num) FROM t
┌─uniqExact(num)─┐
│              3 │
└────────────────┘

Этот пример показывает, что count(DISTINCT num) выполняется с помощью функции uniqExact в соответствии со значением настройки count_distinct_implementation.