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 по умолчанию ставятся последними.