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