Базовый курс SQL. Сортировка данных. ORDER BY

Forums:

[к оглавлению]

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

SELECT student_surname
FROM Students;

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

student_surname
---------------
Петрашевский                                      
Сейдинай                                          
Егорова                                           
Адамченко                                         
Легран                                            
Распопов                                          
Колобков                                          
Шульгина                                          
Римский                                           
Грошев                                            

Обычно это порядок, в котором строки записывались в таблицу. Однако, если впоследствии данные удалялись или редактировались, результат выборки будет зависеть от того, как СУБД распоряжается освободившимся местом.

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

Отсортировать строки можно с помощью ключевого слова ORDER BY, по одному или нескольким столбцам. Рассмотрим несколько примеров:

SELECT student_surname
FROM Students
ORDER BY student_surname;

Такой запрос вернут те же строки, но отсортированные в алфавитном порядке по столбцу student_surname:

student_surname
---------------
Адамченко                                         
Грошев                                            
Егорова                                           
Колобков                                          
Легран                                            
Петрашевский                                      
Распопов                                          
Римский                                           
Сейдинай                                          
Шульгина                                          

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

-- выведет список фамилий студентов, отсортированных по столбцу возраста
SELECT student_surname
FROM Students
ORDER BY student_age;

Обязательно располагать ORDER BY строго в конце запроса. Иначе мы получим сообщение об ошибке.

-- выведет ошибку
SELECT student_surname
ORDER BY student_age
FROM Students;

Сортировка по нескольким столбцам

Иногда требуется отсортировать список по двум столбцам. При этом сортировка производится последовательно, в порядке, указанном после ORDER BY. Т.е. к сортировке по второму столбцу СУБД перейдёт только если значения первого столбца совпадают.
Мы можем использовать это для сортировки студентов из одной группы по фамилии:

SELECT group_id, student_surname
FROM Students
ORDER BY group_id, student_surname;

Получим:

group_id |  student_surname
-----------------------------------
30913	|  Грошев                                            
30913	|  Егорова                                           
30913	|  Легран                                            
31548	|  Адамченко                                         
31548	|  Колобков                                          
31548	|  Петрашевский                                      
31548	|  Распопов                                          
31548	|  Сейдинай                                          
31548	|  Шульгина                                          
33018	|  Римский            

Сортировка по порядковому номеру столбца

Вместо имени столбца можно указывать порядковый номер, под которым он указан в данном запросе (не в таблице!)

SELECT student_id, group_id, student_surname
FROM Students
ORDER BY 2, 3;

Получим:

student_id |  group_id |  student_surname
-----------------------------------
92410  |	30913  |	Грошев                                            
92435  |	30913  |	Егорова                                           
92415  |	30913  |	Легран                                            
92540  |	31548  |	Адамченко                                         
92527  |	31548  |	Колобков                                          
92571  |	31548  |	Петрашевский                                      
92526  |	31548  |	Распопов                                          
92522  |	31548  |	Сейдинай                                          
92518  |	31548  |	Шульгина                                          
92599  |	33018  |	Римский                                           

ORDER BY 2, 3 означает сортировку сначала по столбцу group_id, а потом по student_surname. Обратите внимание, что сортировки по student_id нет.

Плюс такого формата записи в её краткости - не нужно дважды писать одни и те же названия. НО минусы однозначно более значительные:

  • можно получить ошибку, сменив порядок столбцов и забыв отредактировать условие сортировки
  • или даже просто ошибиться при подсчёте столбцов и указать неверный номер изначально
  • ну и Вы не сможете воспользоваться сокращённой записью, если хотите отсортировать данные по столбцу, не указанному в списке SELECT

Порядок сортировки

Чтобы изменить порядок сортировки данных (по убыванию), используется ключевое слово DESC (DESCENDING). По умолчанию сортировка производится по возрастанию, поэтому слово ASC (ASCENDING), которое явно указывает это, в коде обычно опускают.

SELECT student_age, student_surname
FROM Students
ORDER BY student_age DESC;

Получим список студентов, в порядке от старших к младшим:

student_age |  student_surname
--------------------------------------------
25   |   Сейдинай                                          
24   |	Легран                                            
23   |	Шульгина                                          
22   |	Петрашевский                                      
22   |	Распопов                                          
22   |	Колобков                                          
21   |	Римский                                           
21   |	Адамченко                                         
20   |	Грошев                                            
19   |	Егорова       

Чтобы изменить порядок сортировки по нескольким столбцам, DESC придётся указать для каждого. DESC применяется ТОЛЬКО к тому столбцу, после которого оно стоит:

SELECT student_age, student_surname
FROM Students
ORDER BY student_age DESC, student_surname DESC;

А можно изменить порядок сортировки по возрасту, а по фамилии - оставить прямой:

SELECT student_age, student_surname
FROM Students
ORDER BY student_age DESC, student_surname;

Получим:

student_age |  student_surname
--------------------------------------------
25  |	Сейдинай                                          
24  |	Легран                                            
23  |	Шульгина                                          
22  |	Колобков                                          
22  |	Петрашевский                                      
22  |	Распопов                                          
21  |	Адамченко                                         
21  |	Римский                                           
20  |	Грошев                                            
19  |	Егорова     

Порядок сортировки и регистр символов

Есть ли разница между А и а при сортировке? Если да, то а пойдёт после А или после Я?

Для большинства СУБД А и а считаются идентичными, но данный параметр можно изменить в настройках СУБД, поэтому лучше всегда проверять результаты запросов, чтобы удостовериться в корректности Ваших условий.

Кстати, обратившись к настройкам СУБД, можно создать и другие альтернативные варианты сортировки, которых Вы не сможете достичь с помощью ORDER BY.

Не полагайтесь на случай, проверяйте получаемые результаты!

Следующая страница. Извлечение данных с условиями.
Оглавление.