Уникальные записи – SELECT DISTINCT
Примечание:
Во всех статьях текущей категории уроков по SQL используются примеры и задачи, основанные на учебной базе данных.
Приступая к изучению данного материала, рекомендуется ознакомиться с описанием учебной БД.
В подавляющем большинстве случаев, записи в таблицах баз данных уникальны, но в отдельных столбцах допускаются повторяющиеся значения. Если запрос выгружает столбцы не являющиеся ключевыми, то полученные строки могут дублироваться.
Избавиться от дубликатов можно, добавив в запрос ключевое слово DISTINCT. Оно указывается в предложении SELECT, сразу после ключевого слова SELECT:
SELECT DISTINCT FROM
Выбрать уникальные имена всех сотрудников.
-- Выполняем запрос в контексте учебной базы USE CallCenter SELECT DISTINCT Имя FROM Сотрудники
Общее количество записей в таблице сотрудников составляет 39, но приведенный SQL-код выгрузил 34 строки. 5-ть повторяющихся имен были удалены из результата.
Дополним синтаксис оператора SELECT, описанный в предыдущем уроке, новым ключевым словом:
SELECT [DISTINCT] [Имя_таблицы.]Имя_столбца[, [Имя_таблицы.]Имя_столбца2 …] FROM [[Имя_базы_данных.]Имя_Схемы.]Имя_таблицы
- Объединение таблиц – UNION
- Соединение таблиц – операция JOIN и ее виды
- Тест на знание основ SQL
Если материалы office-menu.ru Вам помогли, то поддержите, пожалуйста, проект, чтобы я мог развивать его дальше.
Секция 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 присутствует, запрос прекращает выполнение сразу после считывания необходимого количества различных строк.
- Блоки данных выводятся по мере их обработки, не дожидаясь завершения выполнения всего запроса.
Получение уникальных значений SQL-выборки
Как сделать следующее — Сделал я запрос на выборку. Отобразились данные, но к примеру в столбце ‘1’ — 10 одинаковых значений. То есть вывод у меня будет такой Столбец 1 f f f и т.д Как вывести только 1 f, а если к примеру появилось значение a в этом же столбце — отобразить и его.
Отслеживать
19.5k 29 29 золотых знаков 47 47 серебряных знаков 139 139 бронзовых знаков
задан 10 июн 2014 в 17:30
RattleSneyk RattleSneyk
339 1 1 золотой знак 7 7 серебряных знаков 23 23 бронзовых знака
Чтобы выбрать уникальные значения, надо использовать оператор DISTINCT: SELECT DISTINCT name FROM users
10 июн 2014 в 17:35
@Fike, сделайте ваш комментарий ответом
10 июн 2014 в 18:03
@mountpoint, автор еще не подтвердил, что это именно то, что ему нужно, и у меня есть представление, что хороший ответ должен подробно объяснять, что творится в коде (как на SO)(а мне всегда лень) я против ничего не имею, но не думаю, что это нужно
10 июн 2014 в 18:11
@Fike, я думаю, что в данном случае с DISTINCT не нужно писать кучу лапши. Вы четко и ясно озвучили решение проблемы (надеюсь это то, что нужно ТС-у)
10 июн 2014 в 19:35
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для получения уникальных значений в выборке можно воспользоваться двумя способами. Пусть имеется таблица tbl со столбцом name .
Группировка значений
Для группировки значений предназначена конструкция GROUP BY после которой следует имя столбца. Побочным эффектом группировки является тот факт, что вы получаете только уникальные значения сгруппированного поля
SELECT name FROM tbl GROUP BY name
Основное назначение конструкции GROUP BY получение групп записей для применения агрегатных функций, поэтому пуристы часто критикуют данный подход для получения уникальных значений.
Явный запрос уникальных значений
Для запрос уникальных значений можно указать перед именем столбца ключевое слово DISTINCT
SELECT DISTINCT name FROM tbl
Артём Санников
Данная книга является руководством для начинающих специалистов в области анализа и обработки данных. В книге рассматривается язык SQL и его процедурное расширение PL/SQL от компании Oracle.

Главная › Базы данных › MySQL › Выборка данных › Уникальные значения в SQL, команда DISTINCT
Уникальные значения в SQL, команда DISTINCT
DISTINCT – параметр, дающий возможность исключить дублирующие значения из результата выполнения запроса SELECT. Другими словами, DISTINCT позволяет устранить избыточные данные при формировании результата.
Синтаксис запроса SELECT с параметром DISTINCT
SELECT DISTINCT поле_таблицы FROM таблица;
Практический пример
У вас есть таблица fruits , которая содержит список фруктов, и вам нужно вывести названия всех фруктов и исключить повторяющиеся значения, если они имеются.
Произведём вывод фруктов без повторяющихся значений:
SELECT DISTINCT name fruits;
Записи по теме
- Условный оператор WHERE в SQL
- Оператор AS. Псевдонимы в SQL
- Выбор данных в SQL, команда SELECT