SQL DISTINCT

SELECT DISTINCT в SQL: как убрать дубликаты из результата запроса, DISTINCT по нескольким столбцам и поведение с NULL.

DISTINCT — ключевое слово в SELECT, которое оставляет в результате только уникальные строки, убирая дубликаты.

Синтаксис

SELECT DISTINCT столбец1, столбец2, ...
FROM имя_таблицы;

Пример 1: дубликаты есть — DISTINCT убирает

В таблице customers два клиента из Мадрида. Обычный SELECT вернёт Мадрид дважды:

SELECT city FROM customers;

Результат:

+-----------+
| city      |
+-----------+
| Berlin    |
| Madrid    |
| Paris     |
| Turin     |
| Portland  |
| Madrid    |
+-----------+

Добавляем DISTINCT — каждый город встречается ровно один раз:

SELECT DISTINCT city FROM customers;

Результат:

+-----------+
| city      |
+-----------+
| Berlin    |
| Madrid    |
| Paris     |
| Turin     |
| Portland  |
+-----------+

Пример 2: DISTINCT по нескольким столбцам

Когда указано несколько столбцов, DISTINCT убирает строки, у которых совпадают все указанные значения одновременно.

-- Уникальные пары (отдел, город) среди клиентов — иллюстративный пример
-- Демонстрируем на customers: уникальные сочетания city + postal_code
SELECT DISTINCT city, postal_code FROM customers;

Результат:

+-----------+-------------+
| city      | postal_code |
+-----------+-------------+
| Berlin    | 12209       |
| Madrid    | 28023       |
| Paris     | 75016       |
| Turin     | 10100       |
| Portland  | 97219       |
| Madrid    | 28001       |
+-----------+-------------+

Теперь Мадрид встречается дважды — потому что у двух мадридских клиентов разные почтовые индексы.

DISTINCT и NULL

DISTINCT считает все NULL-значения одинаковыми и оставляет ровно одно:

-- dept_id у Martin Blank = NULL; среди остальных нет повторов
SELECT DISTINCT dept_id FROM employees;

Результат:

+---------+
| dept_id |
+---------+
|    NULL |
|       1 |
|       3 |
|       4 |
|       5 |
+---------+

Отличие от UNIQUE. Ограничение UNIQUE на столбце разрешает несколько NULL (каждый NULL уникален), тогда как SELECT DISTINCT схлопывает все NULL в одно значение.

Частые ошибки

  • DISTINCT — не функция. Писать SELECT DISTINCT(city) можно, но скобки здесь не нужны — это не вызов функции.
  • Один DISTINCT на весь SELECT. Нельзя написать SELECT DISTINCT city, cust_name и ожидать, что DISTINCT применится только к city. Он всегда работает для всей строки целиком.

Коротко

  • SELECT DISTINCT убирает дублирующиеся строки из результата.
  • При нескольких столбцах уникальность проверяется по всем столбцам вместе.
  • DISTINCT схлопывает несколько NULL в одно значение.
  • Пишется сразу после SELECT и применяется ко всей строке — не к отдельному столбцу.
Проверьте себя
1. Для чего используется ключевое слово DISTINCT в запросе SELECT?
AДля сортировки уникальных значений по алфавиту
BДля подсчёта уникальных значений в столбце
CДля удаления дублирующихся строк из результата запроса
DДля выбора строк с уникальным первичным ключом
2. Таблица customers содержит 6 строк, среди которых Madrid встречается 2 раза. Сколько строк вернёт запрос SELECT DISTINCT city FROM customers?
A6 строк — DISTINCT не убирает дубликаты при одном столбце
B2 строки — только дублирующиеся значения
C5 строк — Madrid появится один раз
D1 строку — только первое уникальное значение
3. Как DISTINCT обрабатывает значения NULL при нескольких NULL в столбце?
AОставляет только одно NULL-значение, остальные удаляет
BУдаляет все строки с NULL из результата
CОставляет все NULL-значения как уникальные
DЗаменяет NULL на пустую строку ''
4. В чём разница между ограничением UNIQUE (при создании таблицы) и ключевым словом DISTINCT (в запросе)?
AНикакой разницы — оба работают одинаково
BUNIQUE ограничивает данные при вставке; DISTINCT фильтрует дубликаты только в результате запроса
CDISTINCT работает быстрее, чем UNIQUE
DUNIQUE применяется к строкам, DISTINCT — к столбцам