ORDER BY в SQL

В этой статье вы научитесь сортировать данные, которые возвращает SQL-запрос.

Обычно, когда вы используете оператор SELECT для получения данных из таблицы, строки в результате располагаются в том порядке, в котором они записаны в таблицу. Если вы хотите получить набор результатов в определенном порядке, можно использовать ORDER BY — этот оператор указывает, как сортировать полученные данные. Порядок сортировки по умолчанию — по возрастанию.

Синтаксис

Конструкция ORDER BY позволяет сортировать данные, которые возвращает запрос, по определенному столбцу, а также указывать порядок сортировки: по возрастанию или по убыванию. Вот ее синтаксис:

SELECT список_столбцов FROM имя_таблицы ORDER BY имя_столбца ASC|DESC;

Пример

Используем ORDER BY на датасете из предыдущих статей. Если еще не работали с ним, скачайте и установите в свою СУБД таблицу Austin_Animal_Center_Intakes.csv (Google Disc →).

Допустим, нам нужны данные по котам, упорядоченные сначала по году, а затем по месяцу.

Для этого можно написать такой запрос:

SELECT year,
       month,
       count,
       animal_type
  FROM austin_animal_center_intakes_by_month
 WHERE animal_type = "Cat"
ORDER BY year, month

Первые несколько строк результата: 

year month count animal_type
2013 10 542 Cat
2013 11 436 Cat
2013 12 331 Cat
2014 1 335 Cat
2014 2 269 Cat
2014 3 353 Cat
2014 4 566 Cat
2014 5 901 Cat
2014 6 821 Cat
2014 7 881 Cat

Теперь используем модификатор DESC, чтобы отсортировать результаты в порядке убывания.

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

SELECT year,
       month,
       count,
       animal_type
  FROM austin_animal_center_intakes_by_month
 WHERE animal_type = "Cat"
 ORDER BY count DESC

Первые несколько строк результата: 

year month count animal_type
2015 6 1103 Cat
2015 5 1009 Cat
2016 5 921 Cat
2017 5 914 Cat
2014 5 901 Cat
2017 6 895 Cat
2014 7 881 Cat
2014 6 821 Cat
2015 8 812 Cat

Примечание. Существует также модификатор ASC, который сортирует результаты в порядке возрастания. На самом деле, добавление этого модификатора избыточно, поскольку SQL и так по умолчанию сортирует по возрастанию.

ORDER BY особенно полезен, когда у вас есть несколько столбцов, которые вы хотите отсортировать в определенном порядке, и вы можете указать для каждого столбца, в каком порядке вы хотите получить значения — по возрастанию или по убыванию.

Представьте, что нам нужно переделать предыдущий запрос, чтобы он показывал сначала самые последние данные. Это можно сделать так:

SELECT year,
       month,
       count,
       animal_type
  FROM austin_animal_center_intakes_by_month
 WHERE animal_type = "Cat"
 ORDER BY year DESC, month DESC

Как и ожидалось, результаты будут начинаться с данных за декабрь 2017 года:

Примечание. Если в таблице есть ячейки со значениями NULL, они включаются в сортировку и по умолчанию отображаются последними. Если вы хотите заставить их отображаться первыми, добавьте модификатор NULLS FIRST либо после имени столбца, либо после DESC, если вы сортируете в порядке убывания.

SELECT austin_animal_center_outcomes.monthyear,
       austin_animal_center_outcomes.animal_type,
       austin_animal_center_outcomes.outcome_type,
       austin_animal_center_outcomes.outcome_subtype,
       austin_animal_center_outcomes.sex_upon_outcome,
       austin_animal_center_outcomes.age_upon_outcome
  FROM austin_animal_center_outcomes
 WHERE austin_animal_center_outcomes.outcome_type = "Adoption"
       AND austin_animal_center_outcomes.animal_type = "Cat"
 ORDER BY austin_animal_center_outcomes.outcome_subtype NULLS FIRST
monthyear animal_type outcome_type outcome_subtype sex_upon_outcome age_upon_outcome
2013-10 Cat Adoption   Neutered Male 1 month
2013-10 Cat Adoption   Intact Female 1 month
2013-10 Cat Adoption   Intact Female 1 month
2013-10 Cat Adoption   Intact Male 1 month
2013-10 Cat Adoption   Spayed Female 1 month

Примечание. Существует также модификатор NULLS LAST, но он избыточен, поскольку в ORDER BY значения NULL по умолчанию ставятся последними.

Проверьте себя
1. Какой порядок сортировки используется по умолчанию в ORDER BY?
AПо убыванию (DESC)
BВ порядке вставки строк
CВ случайном порядке
DПо возрастанию (ASC)
2. Что вернёт запрос SELECT year, month, count FROM intakes ORDER BY year DESC, month DESC?
AДанные, отсортированные сначала по месяцу по убыванию, потом по году
BДанные, отсортированные по убыванию count
CОшибку — нельзя указывать DESC для нескольких столбцов
DДанные, отсортированные по году по убыванию, а внутри одного года — по месяцу по убыванию
3. Где окажутся строки со значением NULL при сортировке ORDER BY column (без дополнительных модификаторов)?
AВ начале результата
BВ конце результата
CNULL-строки исключаются из результата
DNULL сортируется как 0
4. Какой запрос вернёт кошек из таблицы intakes, отсортированных по количеству от наибольшего к наименьшему?
ASELECT * FROM intakes WHERE animal_type = 'Cat' ORDER BY count ASC;
BSELECT * FROM intakes WHERE animal_type = 'Cat' SORT BY count DESC;
CSELECT * FROM intakes WHERE animal_type = 'Cat' ORDER BY count DESC;
DSELECT * FROM intakes ORDER BY count DESC WHERE animal_type = 'Cat';