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 — к столбцам