# Оператор DISTINCT

PostgreSQL оператор `DISTINCT` используется для удаления дубликатов из набора результатов. `DISTINCT` может использоваться только с операторами `SELECT`.

## Синтаксис

Синтаксис для оператора DISTINCT в PostgreSQL:

```postgresql
SELECT DISTINCT | DISTINCT ON (distinct_expressions) expressions FROM tables [WHERE conditions];
```

**Параметры и аргументы**

- `distinct_expressions` - выражения, используемые для удаления дубликатов.
- `expressions` - столбцы или вычисления, которые вы хотите получить.
- `tables` - таблицы, из которых вы хотите получить записи. В операторе FROM должна быть указана хотя бы одна таблица.
- `WHERE conditions` - необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны.

## Примечание

- Если в `DISTINCT` указано только одно выражение, запрос возвратит уникальные значения для этого выражения.
- Если в `DISTINCT` указано несколько выражений, запрос извлекает уникальные комбинации для перечисленных выражений.
- Если заданы ключевые слова `DISTINCT ON` , запрос возвратит уникальные значения для `distinct_expressions` и вернет другие поля для выбранных записей на основе предложения `ORDER BY (limit 1)` .
- В `PostgreSQL DISTINCT` не игнорирует значения `NULL`. Поэтому при использовании `DISTINCT` в вашем операторе `SQL` ваш результирующий набор будет содержать значение `NULL` как отдельное значение.

## Пример с одним выражением

Рассмотрим на простейший пример **DISTINCT** в PostgreSQL. Мы можем использовать оператор `DISTINCT`, чтобы вернуть одно поле, которое удаляет дубликаты из набора результатов.  
Например:

```postgresql
SELECT DISTINCT last_name
FROM contacts
ORDER BY last_name;
```

В этом PostgreSQL примере **DISTINCT** будут возвращены все уникальные значения `<span class="arg">last_name</span>` из таблицы `<span class="arg">contacts</span>`.

## Пример с несколькими выражениями

Давайте посмотрим, как вы можете использовать оператор PostgreSQL `DISTINCT` для удаления дубликатов из более чем одного поля в вашем операторе `SELECT`.  
Например:

```postgresql
SELECT DISTINCT last_name, city, state
FROM contacts
ORDER BY last_name, city, state;
```

Этот пример будет возвращать каждую уникальную комбинацию `<span class="arg">last_name</span>`, `<span class="arg">city</span>` и `<span class="arg">state</span>` из таблицы `<span class="arg">contacts</span>`. В этом случае `DISTINCT` применяется к каждому полю, указанному после ключевого слова `DISTINCT`, и, следовательно, возвращает различные комбинации.

## Пример DISTINCT ON

Одна вещь, которая уникальна в PostgreSQL, по сравнению с другими базами данных, заключается в том, что у вас есть еще одна опция при использовании оператора `DISTINCT`, которая называется `DISTINCT ON`.  
`DISTINCT ON` вернет только первую строку для `<span class="arg">DISTINCT ON (diver_expressions)</span>` на основе оператора `ORDER BY`, предоставленного в запросе. Любые другие поля, перечисленные в операторе `SELECT`, будут возвращены для этой первой строки. Это похоже на выполнение `LIMIT` в 1 для каждой комбинации `<span class="arg">DISTINCT ON (different_expressions)</span>`.  
Давайте подробнее рассмотрим, как использовать DISTINCT ON в операторе DISTINCT и что он возвращает.  
Таким образом, мы могли бы изменить пример выше:

```postgresql
SELECT DISTINCT ON (last_name) last_name, city, state
FROM contacts
ORDER BY last_name, city, state;
```

Этот пример `DISTINCT`, в котором используются ключевые слова `DISTINCT ON`, вернет все уникальные значения `<span class="arg">last_name</span>`. Но в этом случае для каждого уникального значения `<span class="arg">last_name</span>` он будет возвращать только первую уникальную запись `<span class="arg">last_name</span>`, с которой он сталкивается, на основе оператора `ORDER BY` вместе с `<span class="arg">city</span>` и `<span class="arg">state</span>` значениями из этой записи.  
Он не возвращает уникальные комбинации `<span class="arg">last_name</span>`, `<span class="arg">city</span>` и `<span class="arg">state</span>`. По сути, он выполняет `LIMIT`, равный 1, для каждого `DISTINCT ON (<span class="arg">last_name</span>)` и возвращает соответствующие значения `<span class="arg">city</span>` и `<span class="arg">state</span>` после того, как он выбрал возвращенные записи.

## Список используемых источников

- [PostgreSQL оператор DISTINCT](https://oracleplsql.ru/distinct-postgresql.html)