Базовый курс SQL. Сортировка данных. ORDER BY
Primary tabs
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.
Не полагайтесь на случай, проверяйте получаемые результаты!
Следующая страница. Извлечение данных с условиями.
Оглавление.
- Log in to post comments
- 2857 reads