> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по предложению DISTINCT

# Предложение DISTINCT

Если указан `SELECT DISTINCT`, в результате запроса останутся только уникальные строки. Иными словами, из каждого набора полностью совпадающих строк в результате останется только одна строка.

Можно указать список столбцов, значения в которых должны быть уникальными: `SELECT DISTINCT ON (column1, column2,...)`. Если столбцы не указаны, учитываются все.

Рассмотрим таблицу:

```text theme={null}
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
```

Использование `DISTINCT` без указания столбцов:

```sql theme={null}
SELECT DISTINCT * FROM t1;
```

```text theme={null}
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
```

Использование `DISTINCT` с указанными столбцами:

```sql theme={null}
SELECT DISTINCT ON (a,b) * FROM t1;
```

```text theme={null}
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
```

<div id="distinct-and-order-by">
  ## DISTINCT и ORDER BY
</div>

ClickHouse поддерживает использование предложений `DISTINCT` и `ORDER BY` для разных столбцов в одном запросе. Предложение `DISTINCT` выполняется до предложения `ORDER BY`.

Рассмотрим таблицу:

```text theme={null}
┌─a─┬─b─┐
│ 2 │ 1 │
│ 1 │ 2 │
│ 3 │ 3 │
│ 2 │ 4 │
└───┴───┘
```

Выборка данных:

```sql theme={null}
SELECT DISTINCT a FROM t1 ORDER BY b ASC;
```

```text theme={null}
┌─a─┐
│ 2 │
│ 1 │
│ 3 │
└───┘
```

Выборка данных при другом направлении сортировки:

```sql theme={null}
SELECT DISTINCT a FROM t1 ORDER BY b DESC;
```

```text theme={null}
┌─a─┐
│ 3 │
│ 1 │
│ 2 │
└───┘
```

Строка `2, 4` была отброшена до сортировки.

Учитывайте эту особенность реализации при составлении запросов.

<div id="null-processing">
  ## Обработка NULL
</div>

`DISTINCT` работает с [NULL](/ru/reference/syntax#null) так, как будто `NULL` — это конкретное значение и `NULL==NULL`. Иными словами, в результатах `DISTINCT` разные комбинации с `NULL` встречаются только один раз. Это отличается от обработки `NULL` в большинстве других случаев.

<div id="alternatives">
  ## Альтернативы
</div>

Того же результата можно добиться, применив [GROUP BY](/ru/reference/statements/select/group-by) к тому же набору значений, что указан в предложении `SELECT`, не используя при этом агрегатные функции. Однако по сравнению с подходом `GROUP BY` есть несколько отличий:

* `DISTINCT` можно использовать вместе с `GROUP BY`.
* Если [ORDER BY](/ru/reference/statements/select/order-by) опущен, а [LIMIT](/ru/reference/statements/select/limit) задан, выполнение запроса прекращается сразу после чтения необходимого количества различных строк.
* Блоки данных выводятся по мере обработки, без ожидания завершения всего запроса.
