Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lect2_m3_ipovs_ipovs_bd_230100.doc
Скачиваний:
9
Добавлен:
27.03.2016
Размер:
94.21 Кб
Скачать

Предложение order by

Строки таблицы результатов запроса, как и строки таблицы в БД, не имеют определенного порядка. Чтобы отсортировать таблицу результатов запроса, в оператор SELECT нужно включить предложение ORDER BY (рис. 3.13).

Например, таблица результатов следующего запроса отсортирована по двум столбцам ADR и FIO:

SELECT ADR, FIO, POL, SUMD FROM PERSON ORDER BY ADR, FIO

В такой таблице легко определить жителей, проживающих в одной квартире, причем список таких жителей упорядочен по алфавиту.

Первый столбец (ADR) является главным ключом сортировки, следующие за ним (в данном примере FIO) являются все более второстепенными ключами. Можно сортировать таблицу результатов запроса по любому элементу списка возвращаемых столбцов.

В предложении ORDER BY можно задать возрастающий или убывающий порядок сортировки. По умолчанию, данные сортируются в порядке возрастания (ASC). Чтобы сортировать данные по убыванию, следует использовать ключевое слово DESC. Например:

SELECT * FROM PERSON ORDER BY SUMD DESC

Если столбец таблицы результатов, используемый для сортировки, является вычисляемым, то у него нет имени. Поэтому в таком случае вместо имени столбца необходимо указать его порядковый номер:

SELECT FIO, ADR, SUMD*0.13

FROM PERSON

ORDER BY 3 DESC

Одновременно используя имена и номера столбцов, а также возрастающий и убывающий порядки сортировки, можно сортировать таблицу результатов запроса по достаточно сложному алгоритму. Например, можно вывести список жителей, отсортированный по полу (причем сначала мужчин, затем женщин), а для каждого поля – отсортированный по возрастанию размера налога:

SELECT FIO, ADR, POL, SUMD*0.13

FROM PERSON

ORDER BY POL DESC, 4 ASC

Операторы union и union all

Иногда появляется необходимость объединения результатов двух или более запросов в одну таблицу. Язык SQL предусматривает такую возможность с помощью оператора UNION. Например, можно объединить результаты, выполнив следующий сложный оператор, и получить результат, показанный на рис. 3.14:

SELECT ADR, POL FROM PERSON

WHERE SUMD<2000.00

UNION

SELECT ADR, KCATEGORY FROM FLAT

WHERE SKV<30.00

Чтобы таблицы результатов запроса можно было объединить с помощью оператора UNION, они должны удовлетворять следующим требованиям:

1) таблицы должны содержать одинаковое число столбцов;

2) тип данных каждого столбца первой таблицы должен совпадать с типом данных соответствующего столбца во второй таблице;

3) ни одна из таблиц не может быть отсортирована с помощью предложения ORDER BY, однако объединенные результаты запроса можно отсортировать.

Обратите внимание на то, что имена столбцов в объединяемых таблицах не обязательно должны быть одинаковыми.

Стандарт SQL1 накладывает дополнительные ограничения на операторы SELECT, участвующие в операторе UNION. Он разрешает использовать в списке возвращаемых столбцов только имена столбцов или указатель на все столбцы (SELECT *) и запрещает использовать выражения. Коммерческие реализации в большинстве случаев снимают последний запрет, но могут накладывать другие ограничения.

Поскольку оператор UNION объединяет строки из двух таблиц результатов, то вполне вероятно, что в объединенной таблице будут содержаться повторяющиеся строки. По умолчанию оператор UNION в процессе своего выполнения удаляет повторяющиеся строки.

Если в результирующей объединенной таблице необходимо сохранить повторяющиеся строки, сразу за ключевым словом UNION следует указать ключевое слово ALL.

Хотя предложение ORDER BY нельзя использовать в составляющих операторах SELECT, объединенных оператором UNION, результирующую объединенную таблицу можно отсортировать, записав предложение ORDER BY за последним оператором SELECT. Поскольку столбцы в таблице результатов запроса на объединение не имеют имен, то в предложении ORDER BY следует указывать номера столбцов.

Оператор UNION можно использовать многократно, чтобы объединить результаты трех или более запросов, например:

SELECT * FROM A

UNION (SELECT * FROM B UNION SELECT * FROM C)

Скобки показывают, какой оператор UNION должен выполняться первым.

Если используются одинаковые формы оператора UNION (т.е. только UNION либо только UNION ALL), то порядок выполнения операторов не имеет значения. Следующие операторы полностью эквивалентны:

A UNION (B UNION C)

(A UNION B ) UNION C

(A UNION C) UNION B

Эквивалентными являются и такие операторы:

A UNION ALL (B UNION ALL C)

(A UNION ALL B) UNION ALL C

(A UNION ALL C) UNION ALL B

Однако если в запросы на объединения входят как операторы UNION, так и операторы UNION ALL, то порядок следования этих операторов имеет значение. Если операторы A UNION ALL B UNION C проинтерпретировать как A UNION ALL (B UNION C), то таблица результатов может содержать повторяющиеся строки. Однако если эти операторы проинтерпретировать как (A UNION ALL B) UNION C, то в таблице результатов повторяющихся строк не будет.

По этой причине всегда нужно использовать круглые скобки, чтобы указать последовательность выполнения операторов.