DISTINCT оператор
SQL оператор DISTINCT используется для удаления дубликатов из результирующего набора SELECT.
Синтаксис
SELECT DISTINCT expressions
FROM tables
[WHERE conditions];
Параметры или аргументы
expressions — столбцы или расчеты, которые вы хотите получить.
tables – таблицы из которых вы хотите выгрузить данные. После оператора FROM должна быть указана хотя бы одна таблица.
WHERE conditions . Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны.
Примечание
- Когда в операторе DISTINCT содержится только одно выражение, запрос будет возвращать уникальные значения для этого выражения.
- Когда в операторе DISTINCT содержится более одного выражения, запрос будет возвращать уникальные комбинации для перечисленных выражений.
- Оператор DISTINCT не игнорирует NULL значения. Таким образом, при использовании DISTINCT в вашем SQL запросе, ваш результирующий набор будет включать в себя NULL в качестве отдельного значения.
Пример с одним полем
Рассмотрим на примере простой SQL DISTINCT запрос. Здесь используется SQL оператор DISTINCT, который возвращает одно поле, в котором удалены дубликаты из результирующего набора.
Оператор SQL DISTINCT
Оператор SQL DISTINCT используется для указания на то, что следует работать только с уникальными значениями столбца.
Оператор SQL DISTINCT нашел широкое применение в операторе SQL SELECT, для выборки уникальных значений. Так же используется в агрегатных функциях.
Оператор SQL DISTINCT имеет следующий синтаксис:
SELECT DISTINCT column_name FROM table_name
Примеры оператора SQL DISTINCT. Имеется следующая таблица Artists:
| Singer | Album | Year | Sale |
| The Prodigy | Invaders Must Die | 2008 | 1200000 |
| Drowning Pool | Sinner | 2001 | 400000 |
| Massive Attack | Mezzanine | 1998 | 2300000 |
| The Prodigy | Fat of the Land | 1997 | 600000 |
| The Prodigy | Music For The Jilted Generation | 1994 | 1500000 |
| Massive Attack | 100th Window | 2003 | 1200000 |
| Drowning Pool | Full Circle | 2007 | 800000 |
| Massive Attack | Danny The Dog | 2004 | 1900000 |
| Drowning Pool | Resilience | 2013 | 500000 |
Пример 1. Используя оператор SQL DISTINCT вывести, какие исполнители (Singer) имеются в таблице:
SELECT DISTINCT Singer FROM Artists
| Singer |
| The Prodigy |
| Drowning Pool |
| Massive Attack |
Пример 2. Используя оператор SQL DISTINCT вывести количество уникальных исполнителей в таблице:
SELECT COUNT(DISTINCT Singer) AS CountOfSingers FROM Artists
| CountOfSingers |
| 3 |
Секция DISTINCT
Если указан SELECT DISTINCT , то в результате запроса останутся только уникальные строки. Таким образом, из всех наборов полностью совпадающих строк в результате останется только одна строка.
Вы можете указать столбцы, по которым хотите отбирать уникальные значения: SELECT DISTINCT ON (column1, column2. ) . Если столбцы не указаны, то отбираются строки, в которых значения уникальны во всех столбцах.
┌─a─┬─b─┬─c─┐ │ 1 │ 1 │ 1 │ │ 1 │ 1 │ 1 │ │ 2 │ 2 │ 2 │ │ 2 │ 2 │ 2 │ │ 1 │ 1 │ 2 │ │ 1 │ 2 │ 2 │ └───┴───┴───┘
Использование DISTINCT без указания столбцов:
SELECT DISTINCT * FROM t1;
┌─a─┬─b─┬─c─┐ │ 1 │ 1 │ 1 │ │ 2 │ 2 │ 2 │ │ 1 │ 1 │ 2 │ │ 1 │ 2 │ 2 │ └───┴───┴───┘
Использование DISTINCT с указанием столбцов:
SELECT DISTINCT ON (a,b) * FROM t1;
┌─a─┬─b─┬─c─┐ │ 1 │ 1 │ 1 │ │ 2 │ 2 │ 2 │ │ 1 │ 2 │ 2 │ └───┴───┴───┘
DISTINCT и ORDER BY
ClickHouse поддерживает использование секций DISTINCT и ORDER BY для разных столбцов в одном запросе. Секция DISTINCT выполняется до секции ORDER BY .
Таблица для примера:
┌─a─┬─b─┐ │ 2 │ 1 │ │ 1 │ 2 │ │ 3 │ 3 │ │ 2 │ 4 │ └───┴───┘
При выборе данных с помощью SELECT DISTINCT a FROM t1 ORDER BY b ASC , мы получаем следующий результат:
┌─a─┐ │ 2 │ │ 1 │ │ 3 │ └───┘
Если мы изменим направление сортировки SELECT DISTINCT a FROM t1 ORDER BY b DESC , мы получаем следующий результат:
┌─a─┐ │ 3 │ │ 1 │ │ 2 │ └───┘
Ряд 2, 4 был разрезан перед сортировкой.
Учитывайте эту специфику при разработке запросов.
Обработка NULL
DISTINCT работает с NULL как-будто NULL — обычное значение и NULL==NULL . Другими словами, в результате DISTINCT , различные комбинации с NULL встретятся только один раз. Это отличается от обработки NULL в большинстве других контекстов.
Альтернативы
Можно получить такой же результат, применив GROUP BY для того же набора значений, которые указан в секции SELECT , без использования каких-либо агрегатных функций. Но есть несколько отличий от GROUP BY :
- DISTINCT может применяться вместе с GROUP BY .
- Когда секция ORDER BY опущена, а секция LIMIT присутствует, запрос прекращает выполнение сразу после считывания необходимого количества различных строк.
- Блоки данных выводятся по мере их обработки, не дожидаясь завершения выполнения всего запроса.
Как работает distinct sql
В некоторых ситуациях SQL запрос на выборку может возвращать повторяющиеся строки данных.
Например, давайте выведем поле class из таблицы Student_in_class из базы данных, в которой организовано хранение информации о расписании занятий в школе.
MySQLSELECT class FROM Student_in_class;
class 9 9 9 9 9 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 1 1 1 1 1 1 1 Поскольку в одном классе возможно нахождение нескольких студентов, то не удивительно, что при выводе мы можем наблюдать одинаковые значения. Чтобы при выборке избежать такого дублирования, есть оператор DISTINCT .
MySQLSELECT [DISTINCT] поля_таблиц FROM наименование_таблицы;То есть в нашем случае запрос на получение уникальных классов, в которых есть хотя бы один студент, будет выглядеть следующим образом:
MySQLSELECT DISTINCT class FROM Student_in_class;
class 9 8 7 6 5 4 3 2 1 Предыдущая запись
