Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Сортировка (ORDER) Основы реляционных баз данных

Попробуйте выполнить запросы из урока на локальной базе данных, которую мы установили ранее

Неопределённость порядка сортировки

Выборка данных из базы не имеет определённого порядка, точнее порядок есть, но он никак логически не обоснован. База данных, по умолчанию, возвращает данные в том порядке, в котором ей удобнее. По счастливому стечению обстоятельств этот порядок может совпасть с желаемым, но рассчитывать на это нельзя. Теоретически он может поменяться при следующем запросе или когда количество данных в таблице изменится. Обновление версии базы данных тоже может повлиять на это.

Общая схема запроса на сортировку

Сортировка данных в таблице

Сортировка задаётся с помощью части ORDER BY, за которой следует имя поля, по которому происходит сортировка:

SELECT * FROM users ORDER BY username;

База данных — умная штука, она знает, как сравнивать не только числа, но и строки, и даты. Сортировка по датам — крайне частая операция, выглядит она идентично любой другой сортировке:

SELECT * FROM users ORDER BY created_at;

Управление порядком сортировки

Если ничего дополнительно не указывать, то ORDER BY сортирует в прямом порядке — от меньшего к большему. Запрос выше — это сокращённая версия полного запроса с сортировкой: полный запрос включает в себя ASC, который подставляется автоматически, если ничего не указано:

SELECT * FROM users ORDER BY created_at ASC;
-- то же самое что и SELECT * FROM users ORDER BY created_at;

Для сортировки в обратном порядке указывается DESC:

SELECT * FROM users ORDER BY created_at DESC;

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

SELECT * FROM users ORDER BY first_name, created_at;

Порядок сортировки в таком случае задаётся для каждого поля индивидуально:

SELECT * FROM users ORDER BY first_name DESC, created_at DESC;
SELECT first_name, created_at FROM users ORDER BY first_name ASC, created_at DESC;
first_name created_at
Maryse 2019-03-04 13:03:01
Maryse 2018-12-06 10:24:04
Maryse 2018-12-06 10:09:48
Sunny 2019-03-04 13:04:28
Sunny 2018-12-06 06:19:30
Tanya 2018-12-06 07:12:01
Tanya 2018-12-05 23:55:15

В этой выборке сначала выполняется сортировка по имени в прямом порядке. Затем, внутри групп с одинаковым именем, происходит сортировка по created_at в обратном порядке.

Сортировка NULL-значений

У сортировки есть один тонкий момент, связанный с сортировкой полей, содержащих NULL. Если ничего не указано дополнительно, то считается, что NULL больше любого значения. Другими словами, при прямой сортировке они окажутся в конце выборки, а при обратной — в начале. Этим поведением можно управлять с помощью фразы NULLS FIRST:

-- сортируем по возрастанию даты (поле "created_at")
-- поведение по умолчанию:
-- поля, содержащие NULL, идут последними
SELECT * FROM users ORDER BY created_at ASC;

-- сортируем по возрастанию даты (поле "created_at")
-- поля, содержащие NULL, идут первыми
SELECT * FROM users ORDER BY created_at ASC NULLS FIRST;

и NULLS LAST:

-- сортируем по убыванию даты (поле "created_at")
-- поведение по умолчанию:
-- поля, содержащие NULL, идут первыми
SELECT * FROM users ORDER BY created_at DESC;

-- сортируем по убыванию даты (поле "created_at")
-- поля, содержащие NULL, идут последними
SELECT * FROM users ORDER BY created_at DESC NULLS LAST;

Дополнительные материалы

  1. Официальная документация

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
30 июня 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
30 июня 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
30 июня 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
30 июня 16 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
30 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»