Основы реляционных баз данных

Сортировка (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. Официальная документация

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

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

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

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

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

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

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

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

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