Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по бд.doc
Скачиваний:
0
Добавлен:
24.02.2020
Размер:
4.79 Mб
Скачать

Использование order by в составных запросах

В составных запросах можно использовать ключевое слово ORDER BY. Однако ключевое слово ORDER BY в них можно использовать только для упорядочения результатов окончательного вывода обоих запросов. Поэтому в составном запросе допускается использовать только одно выражение с ключевым словом ORDER BY, хотя сам составной запрос может состоять из нескольких операторов SELECT. На столбцы в выражении ключевого слова ORDER BY можно ссылаться как по псевдонимам, так и по их номерам в списке выбора.

Синтаксис оператора с использованием ORDER BY должен быть следующим

SELECT столбец1 [, столбец2 ] FROM таблица1 [, таблица2 ] [ WHERE ]

КОМАНДА{UNION | EXCEPT INTERSECT | UNION ALL} 

SELECT столбец1 [, столбец2 ] FROM таблица1 [, таблица2 ] [ WHERE ]

[ ORDER BY ]

Рассмотрим пример

SELECT EMP_ID FROM EMPLOYEE_TBL

UNION

SELECT EMP_ID FROM EMPLOYEE_PAY_TBL

ORDER BY 1;

В результате вывод этого составного запроса будет упорядочен по первому столбцу каждого из составляющих запросов. С помощью сортировки в составном запросе легко выявить повторяющиеся строки.

Этот оператор SQL возвращает упорядоченный список табельных номеров служащих из таблиц EMPLOYEE_TBL и EMPLOYEE_PAY_TBL без повторений.

Обратите внимание на то, что здесь выражение ключевого слова ORDER BY ссылается на столбец по номеру 1, а не по имени.

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

SELECT PROD_DESC FROM PRODUCTS_TBL

UNION

SELECT PROD_DESC FROM PRODUCTS_TBL

ORDER BY PROD_DESC;

PROD_DESC

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

КОСТЮМ ВЕДЬМЫ

КОСТЮМЫ В АССОРТИМЕНТЕ

МАСКИ В АССОРТИМЕНТЕ

ПЛАСТИКОВЫЕ ПАУКИ

ПЛАСТИКОВЫЕ ТЫКВЫ

ПОЛОЧКА ИЗ ДУБА

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ФОНАРИ

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ

В следующем примере вместо имени столбца для сортировки использован его номер

SELECT PROD_DESC FROM PRODUCTS_TBL

UNION

SELECT PROD_DESC FROM PRODUCTS_TBL

ORDER BY 1;

PROD_DESC

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

КОСТЮМ ВЕДЬМЫ

КОСТЮМЫ В АССОРТИМЕНТЕ

МАСКИ В АССОРТИМЕНТЕ

ПЛАСТИКОВЫЕ ПАУКИ

ПЛАСТИКОВЫЕ ТЫКВЫ

ПОЛОЧКА ИЗ ДУБА

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ФОНАРИ

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ

Использование group by в составных запросах

В отличие от ORDER BY, ключевое слово GROUP BY можно использовать не только в любом из входящих в составной запрос операторе SELECT, но и для всего составного запроса в целом, разместив GROUP BY в конце. Кроме того, вместе с GROUP BY в любом из входящих в составной запрос операторе SELECT можно использовать ключевое слово HAVING (которое иногда используется с GROUP BY).

Синтаксис оператора с использованием GROUP BY должен быть следующим.

SELECT столбец1 [, столбец2 ] FROM таблица1 [, таблица2 ] [ WHERE ] [GROUP BY ] [HAVING ]

КОМАНДА{UNION | EXCEPT | INTERSECT | UNION ALL} 

SELECT столбец1 [, столбец2 ]  FROM таблица1 [, таблица2 ] [ WHERE ] [ GROUP BY ] [ HAVING ]

[ ORDER BY ]

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

SELECT 'ЗАКАЗЧИКИ' TYPE, COUNT (*)

FROM CUSTOMER_TBL

UNION

SELECT 'СЛУЖАЩИЕ' TYPE, COUNT (*)

FROM EMPLOYEE_TBL

UNION

SELECT 'ТОВАРЫ' TYPE, COUNT (*)

FROM PRODUCTS_TBL

GROUP BY 1;

TYPE COUNT(*)

ЗАКАЗЧИКИ 15

СЛУЖАЩИЕ 6

ТОВАРЫ 11

Следующий запрос возвращает те же данные, но в нем дополнительно используется ключевое слово ORDER BY.

SELECT 'ЗАКАЗЧИКИ' TYPE, COUNT (*)

FROM CUSTOMER_TBL

UNION

SELECT 'СЛУЖАЩИЕ' TYPE, COUNT (*)

FROM EMPLOYEE_TBL

UNION

SELECT 'ТОВАРЫ' TYPE, COUNT (*) 

FROM PRODUCTS_TBL 

GROUP BY 1 ORDER BY 2;

TYPE COUNT(*)

СЛУЖАЩИЕ 6

ТОВАРЫ 11

ЗАКАЗЧИКИ 15

Здесь выведенные данные отсортированы по столбцу 2, представляющем результаты подсчетов. Поэтому числа во втором столбце оказываются упорядоченными от меньшего к большему.

В InterBase следует воспользоваться следующим вариантом:

SELECT CAST ('ЗАКАЗЧИКИ' as CHAR (10)) TYPE_, COUNT (*)

FROM CUSTOMER_TBL

UNION

SELECT CAST ('СЛУЖАЩИЕ' as CHAR (10)) TYPE_, COUNT (*)

FROM EMPLOYEE_TBL

UNION

SELECT CAST ('ТОВАРЫ' as CHAR (10)) TYPE_, COUNT (*)

FROM PRODUCTS_TBL

order BY 2, 1;