Упорядочение результата запроса. Предложение ORDER BY
По определению результат отображения никак не упорядочивается. Мы можем видеть, что в нашем случае он соответствует порядку помещения записей в базу данных (это видно по возрастанию значения первичного ключа, кода человека), однако никакого порядка реляционные базы данных не гарантируют. Чтобы явно задать нужный нам порядок в оператор следует ввести предложение ORDER BY. В предложении перечисляются имена столбцов таблицы или порядковые номера столбцов, указанных в списке выбора. По умолчанию сортировка выполняется в возрастающем порядке, как если бы вы задали ключевое слово ASCENDING, однако для различных столбцов в одном и том же предложении вы можете указать и убывающий порядок, задав ключевое слово DESCENDING. Для ключевого слова ASCENDING допустимо сокращение ASC, для DESCENDING — DESC. Предложение ORDER BY имеет следующий синтаксис: ORDER BY {<имя столбца> | <номер столбца>} [{ASC[ENDING] | DESC[ENDING]]} Помимо имен столбцов в этом предложении мы можем указать и порядковые номера столбцов в списке выбора. Столбцы в списке нумеруются, начиная с единицы. Чтобы можно было использовать номера столбцов, вы должны явно перечислить столбцы в списке выбора. Вариант * в этом случае недопустим. Что интересно — столбцы, по которым выполняется сортировка данных, вовсе не обязательно должны быть включены в состав выбираемых столбцов, хотя и не совсем понятно, кому это может понадобиться. Такую сортировку допускают делать далеко не все реляционные базы данных. Рассмотрим примеры с нашей таблицей людей. Введите и выполните:[6] SELECT PR_NAME2 AS "Имя", PR_NAME3 AS "Отчество", 'Фамилия:' AS "Текст", PR_NAME AS "Фамилия", PR_BIRTHDAY AS "Дата рождения" FROM PERSON
ORDER PR_NAME, PR_NAME2; Вначале выполняется упорядочение списка по столбцу PR_NAME (фамилия), а затем внутри списка еще и по PR_NAME2 (имя). Второй уровень сортировки называется вложенной (nested) сортировкой. Количество уровней вложенности не ограничивается. В нашем примере мы получили список, отсортированный по фамилиям в возрастающем порядке. Если несколько человек имеют одну и ту же фамилию, то строки еще упорядочиваются и по именам. Как и должно быть. Если нужно, мы можем добавить еще один уровень сортировки — по отчествам. Кстати, такая сортировка строковых полей называется сортировкой в лексикографическом порядке, когда порядок символов в точности соответствует расположению букв в алфавите соответствующего языка. Зададим упорядочение не в виде имен столбцов, а указанием их номеров. Напомню, что столбцы в списке выбора нумеруются начиная с единицы, а в самом списке выбора нельзя указывать символ *.[7] SELECT PR_NAME2 AS "Имя", PR_NAME3 AS "Отчество", 'Фамилия:' AS "Текст", PR_NAME AS "Фамилия", PR_BIRTHDAY AS "Дата рождения" FROM PERSON ORDER 3, 2; Получаем такой же упорядоченный список, как и в предыдущем случае, что мы видели в листинге 3. Проверим, можно ли в одном предложении указывать и номера, и имена. Введем и выполним:[8] SELECT PR_NAME2 AS "Имя", PR_NAME3 AS "Отчество", 'Фамилия:' AS "Текст", PR_NAME AS "Фамилия", PR_BIRTHDAY AS "Дата рождения" FROM PERSON ORDER BY PR_NAME, 2; Это работает точно так же, как и в обоих предыдущих случаях. Теперь проверим, действительно ли работает вариант различного направления сортировки в разных столбцах в одном предложении. Изменим оператор, добавив упорядочение по столбцу PR_NAME3 (имя человека) в убывающем порядке:[9] SELECT PR_NAME2 AS "Имя", PR_NAME3 AS "Отчество", 'Фамилия:' AS "Текст", PR_NAME AS "Фамилия", PR_BIRTHDAY AS "Дата рождения" FROM PERSON ORDER BY PR_NAME, PR_NAME2 DESC; Все работает замечательно Фамилии сортируются в возрастающем порядке, а имена у однофамильцев — в убывающем.
Интересно, как поведут себя пустые значения (NULL) в результате сортировки? Стандарт допускает помещение всех таких строк либо в самое начало списка, либо в самый конец сортируемого набора данных. Посмотрим, как решается этот вопрос в наших системах управления базами данных.[10] SELECT PR_NAME2 AS "Имя", PR_NAME3 AS "Отчество", 'Фамилия:' AS "Текст", PR_NAME AS "Фамилия", PR_BIRTHDAY AS "Дата рождения" FROM PERSON ORDER BY PR_BIRTHDAY, PR_NAME Получим следующий список, упорядоченный по датам рождения. Листинг 5. Список личностей упорядоченный по дате рождения
Видно, что все пустые значения помещаются в самый конец списка. Этот результат мы получим при использовании Firebird версии 1.5, в Firebird 2.0 все получается с точностью до наоборот — пустые значения находятся в начале списка.
Читайте также: II. Требования к результатам освоения Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|