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
оптимизирован по умолчанию с использованием метаданных из MergeTree. Если вы хотите управлять безопасностью на уровне строк, отключите оптимизацию при помощи настройки optimize_trivial_count_query.
При этом запрос 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
.