По определению результат отображения никак не упорядочивается. Мы можем видеть, что в нашем случае он соответствует порядку помещения записей в базу данных (это видно по возрастанию значения первичного ключа, кода человека), однако никакого порядка реляционные базы данных не гарантируют.
Чтобы явно задать нужный нам порядок в оператор следует ввести предложение ORDER BY. В предложении перечисляются имена столбцов таблицы или порядковые номера столбцов, указанных в списке выбора. По умолчанию сортировка выполняется в возрастающем порядке, как если бы вы задали ключевое слово ASCENDING, однако для различных столбцов в одном и том же предложении вы можете указать и убывающий порядок, задав ключевое слово DESCENDING. Для ключевого слова ASCENDING допустимо сокращение ASC, для DESCENDING — DESC.
Предложение ORDER BY имеет следующий синтаксис:
ORDER BY {<имя столбца> | <номер столбца>} [{ASC[ENDING] | DESC[ENDING]]}
Помимо имен столбцов в этом предложении мы можем указать и порядковые номера столбцов в списке выбора. Столбцы в списке нумеруются, начиная с единицы. Чтобы можно было использовать номера столбцов, вы должны явно перечислить столбцы в списке выбора. Вариант * в этом случае недопустим.
Что интересно — столбцы, по которым выполняется сортировка данных, вовсе не обязательно должны быть включены в состав выбираемых столбцов, хотя и не совсем понятно, кому это может понадобиться. Такую сортировку допускают делать далеко не все реляционные базы данных.
Рассмотрим примеры с нашей таблицей людей. Введите и выполните:[6]
SELECT PR_NAME2 AS"Имя",
PR_NAME3AS "Отчество",
'Фамилия:' AS "Текст",
PR_NAMEAS"Фамилия",
PR_BIRTHDAYAS"Дата рождения"
FROM PERSON
ORDER PR_NAME,PR_NAME2;
Вначале выполняется упорядочение списка по столбцу PR_NAME (фамилия), а затем внутри списка еще и по PR_NAME2 (имя). Второй уровень сортировки называется вложенной (nested) сортировкой. Количество уровней вложенности не ограничивается.
В нашем примере мы получили список, отсортированный по фамилиям в возрастающем порядке. Если несколько человек имеют одну и ту же фамилию, то строки еще упорядочиваются и по именам. Как и должно быть. Если нужно, мы можем добавить еще один уровень сортировки — по отчествам.
Кстати, такая сортировка строковых полей называется сортировкой в лексикографическом порядке, когда порядок символов в точности соответствует расположению букв в алфавите соответствующего языка.
Зададим упорядочение не в виде имен столбцов, а указанием их номеров. Напомню, что столбцы в списке выбора нумеруются начиная с единицы, а в самом списке выбора нельзя указывать символ *.[7]
SELECT PR_NAME2 AS"Имя",
PR_NAME3AS "Отчество",
'Фамилия:' AS "Текст",
PR_NAMEAS"Фамилия",
PR_BIRTHDAYAS"Дата рождения"
FROM PERSON
ORDER 3, 2;
Получаем такой же упорядоченный список, как и в предыдущем случае, что мы видели в листинге 3. Проверим, можно ли в одном предложении указывать и номера, и имена. Введем и выполним:[8]
SELECT PR_NAME2 AS"Имя",
PR_NAME3AS"Отчество",
'Фамилия:' AS"Текст",
PR_NAMEAS"Фамилия",
PR_BIRTHDAYAS"Дата рождения"
FROM PERSON
ORDER BY PR_NAME, 2;
Это работает точно так же, как и в обоих предыдущих случаях.
Теперь проверим, действительно ли работает вариант различного направления сортировки в разных столбцах в одном предложении. Изменим оператор, добавив упорядочение по столбцу PR_NAME3 (имя человека) в убывающем порядке:[9]
SELECT PR_NAME2 AS"Имя",
PR_NAME3AS "Отчество",
'Фамилия:' AS "Текст",
PR_NAMEAS"Фамилия",
PR_BIRTHDAYAS"Дата рождения"
FROM PERSON
ORDER BY PR_NAME, PR_NAME2 DESC;
Все работает замечательно Фамилии сортируются в возрастающем порядке, а имена у однофамильцев — в убывающем.
Интересно, как поведут себя пустые значения (NULL) в результате сортировки? Стандарт допускает помещение всех таких строк либо в самое начало списка, либо в самый конец сортируемого набора данных. Посмотрим, как решается этот вопрос в наших системах управления базами данных.[10]
SELECT PR_NAME2 AS"Имя",
PR_NAME3AS "Отчество",
'Фамилия:' AS "Текст",
PR_NAMEAS"Фамилия",
PR_BIRTHDAYAS"Дата рождения"
FROM PERSON
ORDER BY PR_BIRTHDAY, PR_NAME
Получим следующий список, упорядоченный по датам рождения.
Листинг 5. Список личностей упорядоченный по дате рождения
Имя
Отчество
Фамилия
Дата рождения
Татьяна
Валерьевна
Веремчук
23.08.1948
Татьяна
Николаевна
Некрасова
04.12.1949
Елена
Алевтиновна
Варанкина
01.02.1952
Татьяна
Владимировна
Хемлих
25.10.1953
Татьяна
Сергеевна
Арсентьева
10.09.1954
Татьяна
Анатольевна
Баландина
11.01.1955
Кирил
Владимирович
Бешляга
07.01.1956
Марина
Валентиновна
Бычкова
01.04.1957
Людмила
Александровна
Блинова
28.08.1957
Елена
Александровна
Беляева
30.04.1958
Павел
Павлович
Попутько
05.05.1959
Татьяна
Викторовна
Владысик
19.10.1960
Светлана
Александровна
Ветошкина
23.12.1960
Татьяна
Александровна
Звездина
01.10.1961
Татьяна
Фёдоровна
Леушина
04.05.1963
Олег
Владимирович
Лядов
07.06.1964
Оксана
Васильевна
Власова
11.02.1965
Надежда
Александровна
Зеленина
11.12.1965
Татьяна
Евгеньевна
Беспалова
21.12.1965
Татьяна
Александровна
Соснина
05.12.1968
Татьяна
Александровна
Мазеина
06.04.1969
Татьяна
Геннадьевна
Зырянова
22.01.1970
Максим
Владимирович
Бычков
08.09.1970
Юлий
Альбертович
Алексеев
19.09.1974
Татьяна
Сергеевна
Бартош
02.12.1974
Александр
Анатольевич
Лебедев
03.04.1977
Татьяна
Владимировна
Алтынцева
03.09.1977
Оксана
Владимировна
Мельчакова
06.07.1978
Татьяна
Михайловна
Мосина
30.06.1979
Татьяна
Юрьевна
Шарапова
14.04.1980
Лариса
Вилльевна
Вашкарина
05.11.1980
Анна
Николаевна
Верхоланцева
06.10.1991
Наталья
Владимировна
Алавердян
Назгуль
Асановна
Алиева
Руслан
Рафаилович
Амерзянов
Ксения
Аркадьевна
Антонова
Видно, что все пустые значения помещаются в самый конец списка. Этот результат мы получим при использовании Firebird версии 1.5, в Firebird 2.0 все получается с точностью до наоборот — пустые значения находятся в начале списка.