Пример 6: упорядочивание выборки
2.1.6. Пример 6: упорядочивание выборки
Задача 2.1.6.a{35}: показать все книги в библиотеке в порядке возрастания их года издания.
Задача 2.1.6. b{36}: показать все книги в библиотеке в порядке убывания их года издания.
Ожидаемый результат 2.1.6.a.
b_name |
b_year |
Курс теоретической физики |
1981 |
Евгений Онегин |
1985 |
Сказка о рыбаке и рыбке |
1990 |
Искусство программирования |
1993 |
Язык программирования C++ |
1996 |
Психология программирования |
1998 |
Основание и империя |
2000 |
Ожидаемый результат 2.1.6.b. |
|
b_name |
b_year |
Основание и империя |
2000 |
Психология программирования |
1998 |
Язык программирования C++ |
1996 |
Искусство программирования |
1993 |
Сказка о рыбаке и рыбке |
1990 |
Евгений Онегин |
1985 |
Курс теоретической физики |
1981 |
Решение 2.1.6.a{35}. |
|
Для упорядочивания1 результатов выборки необходимо применить конструкцию ORDER BY (строка 4 каждого запроса), в которой мы указываем:
•поле, по которому производится сортировка (b_year)
•направление сортировки (ASC). 1
MySQL і Решение 2.1.6.a
1SELECT 'b name',
2'b_year'
3 |
FROM |
'books' |
4 |
ORDER |
BY 'b_year' ASC |
MS SQL I Решение 2.1.6.a |
1SELECT [b name]
2[b_year]
3FROM [books]
4ORDER BY [b year] ASC
1В повседневной жизни всё равно большинство людей использует тут термин «сортировка» вместо «упорядочивание», но
это не совсем идентичные понятия. «Сортировка» больше относится к процессу изменения порядка, а «упорядочивание» к готовому результату.
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 40/545
Пример 6: упорядочивание выборки
Oracle Решение 2.1.6.a
1SELECT "b name"
2"b_year"
3 |
FROM |
"books" |
4 |
ORDER |
BY "b year" ASC |
|
|
|
•Ч |
Решение 2.1.6. b ■ . |
|
Здесь (в отличие от решения{35} задачи 2.1.6.a{35}) всего лишь необходимо поменять направление сортировки с «по возрастанию» (ASC) на «по убыванию»
(DESC).
Альтернативное решение можно получить добавлением знака «минус» перед именем поля, по которому сортировка реализована по возрастанию, т.е. ORDER BY
числовое_поле DESC эквивалентно ORDER BY -числовое_поле ASC.
|
Решение 2.1.6.b (альтернативный вариант) |
|
|
MySQL I Решение 2.1.6.b (альтернативный вариант) | |
|
|
||
1 |
SELECT |
[b_name] |
1 |
SELECT 'b_name', |
|
2 |
|
[b_year] |
2 |
|
'b_year' |
3 |
FROM |
[books] |
3 |
FROM |
'books' |
4 |
ORDER BY ■ [b year] ASC |
|
4 |
ORDER BY -'b year' ASC |
|
|
|
|
Oracle Решение 2.1.6.b (альтернативный вариант)
MS SQL
1SELECT "b_name"
2"b_year"
3 |
FROM |
"books" |
4 |
ORDER BY ■ "b _year" ASC |
|
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 41/545
Пример 6: упорядочивание выборки
Исследование 2.1.6.EXP.A. Ещё одна неожиданная проблема с упорядочиванием связана с тем, где различные СУБД по умолчанию располагают NULL-значения — в начале выборки или в конце. Проверим.
|
|
Снова воспользуемся готовой таблицей table_with_nulls{26}. |
В ней |
попрежнему находятся следующие данные: |
|
||
|
|
|
|
|
x |
|
|
1 __ |
|
|
|
1 __ |
|
|
|
2 _ |
|
|
|
|
|
|
|
NULL |
|
||
|
|
Выполним запросы 2.1.6.EXP.A: |
|
Результаты будут следующими (обратите внимание на то, где расположено NULL-значение):
|
x |
|
|
x _ |
_2 |
_ |
|
NULL |
|
_1 |
_ |
|
2 __ |
|
_1 |
_ |
|
1 __ |
|
|
NULL |
|
_1 _ |
|
MySQL |
MS SQL Server |
Oracle |
||
Получить в MySQL и MS SQL Server поведение, аналогичное поведению Oracle (и наоборот), можно с использованием следующих запросов:
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 42/545
Пример 6: упорядочивание выборки
В случае с Oracle мы явно указываем, поместить ли NULL-значения в начало выборки (NULLS FIRST) или в конец выборки (NULLS LAST). Поскольку MySQL и
MS SQL Server не поддерживают такой синтаксис, выборку приходится упорядочивать по двум уровням: первый уровень (строка 3 для MySQL, строки 3-6 для MS SQL Server) — по признаку «является ли значение поля NULL’ом», второй уровень — по самому значению поля.
(Ъ Задание 2.1.6.TSK.A: показать список авторов в обратном алфавитном порядке (т.е. «Я ^ А».
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 43/545
Пример 7: использование составных условий
2.1.7. Пример 7: использование составных условий
Задача 2.1.7.a{39}: показать книги, изданные в период 1990-2000 годов, представленные в библиотеке в количестве трёх и более экземпляров.
Задача 2.1.7. b{40}: показать идентификаторы и даты выдачи книг за лето 2012-го года.
Ожидаемый результат 2.1.7.a.
|
b_name |
b_year |
b_quantity |
||
Сказка о рыбаке и рыбке |
1990 |
3 |
|||
Основание и империя |
2000 |
5 |
|||
Язык программирования C++ |
1996 |
3 |
|||
Искусство программирования |
1993 |
7 |
|||
|
Ожидаемый результат 2.1.7.b. |
|
|||
|
|
|
|
|
|
|
sb_id |
sb_start |
|
|
|
|
42 |
2012-06-11 |
|
|
|
|
57 |
2012-06-11 |
|
|
|
Ч/* Решение 2.1.7. a{39}.
Для каждой СУБД приведено два варианта запроса — с ключевым словом BETWEEN (часто используемого как раз для указания диапазона дат), и без него — в
виде двойного неравенства (что выглядит более привычно для имеющих опыт программирования).
В случае использования BETWEEN, границы включаются в диапазон искомых значений.
В представленных ниже решениях отдельные условия осознанно не взяты в скобки. Синтаксически такой вариант верен и отлично работает, но он тем сложнее читается, чем больше составных частей входит в сложное условие. Потому всё же рекомендуется брать каждую отдельную часть в скобки.
MySQL |
Решение 2.1.7.a |
|
1 |
-- Вариант 1: использование BETWEEN |
|
2 |
SELECT 'b name', |
|
3 |
|
'b year', |
4 |
|
'b_quanti ty' |
5 |
FROM |
'books' |
6 |
WHERE |
'b year' BETWEEN 1990 AND 2000 |
7 |
|
AND 'b_quantity' >= 3 |
1 |
-- Вариант 2: использование двойного неравенства |
|
2 |
SELECT 'b name', |
|
3 |
|
'b_year', |
4 |
|
'b_quanti ty' |
5 |
FROM |
'books' |
6 |
WHERE |
'b year' >= 1990 |
7 |
|
AND 'b year' <= 2000 |
8 |
|
AND 'b_quantity' >= 3 |
Работа с MySQL, MS SQL Server и Oracle в примерах © Богдан Марчук Стр: 44/545