Основы реляционных баз данных
Теория: DISTINCT
Чтобы узнать все имена, которые есть у наших пользователей, нужно выполнить запрос не всех полей, а только имени:
Проблема в том, что эти имена наверняка дублируются, так как у людей могут быть одинаковые имена. Избавиться от дублей можно с помощью DISTINCT. В этом уроке узнаем, как находить уникальные записи.
Находим уникальные записи
Чтобы имена из примера выше не дублировались, сделаем такой запрос:
Все повторяющиеся строки исключаются из результирующего набора. Так из каждой группы дубликатов остается одна строка.
DISTINCT позволяет указывать не одно, а сразу несколько полей:
В эту выборку попадут все значения с уникальным сочетанием имен и фамилий. Это значит, что имена и фамилии могут повторяться, но пара всегда уникальна. Если в DISTINCT добавить первичный ключ (SELECT DISTINCT id, first_name FROM users), то запрос извлечет все записи. Такой результат является следствием уникальности первичного ключа.
DISTINCT можно совмещать с агрегатными функциями. С ними будем разбираться в отдельном уроке. Например, можно посчитать количество пользователей с уникальными именами:
Такой запрос покажет количество уникальных имен.
DISTINCT ON
В отличие от базовой формы, DISTINCT ON позволяет отдельно указывать два типа полей — для проверки уникальности и для результирующей выборки:
При работе с DISTINCT ON важно правильно использовать сортировку:
Такой запрос вернет первый созданный топик для каждого пользователя. Запросы с DISTINCT ON требуют, чтобы первыми полями в ORDER BY были те, которые идут после ON. Только тогда сортировка отработает так, как ожидается. В запросе выше это user_id — указан в сортировке первым. В противном случае результат будет неверным.
В таких запросах сначала выполняется сортировка и уже после этого отрабатывает DISTINCT, так как он берет первую запись из группы. Но мы ведь не знаем какая запись первая. Нужно гарантировать порядок, в чем помогает ORDER BY.
Выводы
В этом уроке мы изучили функцию DISTINCT. С ее помощью вы можете узнать все необходимые значения, найти уникальные записи среди них и избавиться от дублей.