
- •Информационное обеспечение систем управления Построение запросов при работе с базой данных (Учебное пособие)
- •Тестовая база данных
- •Выборка данных. Команда select
- •Синтаксис оператора select
- •Простые варианты поиска данных
- •Упорядочение результата запроса. Предложение order by
- •Использование ключевого слова distinct
- •Предложение where
- •Синтаксис предложения where
- •Использование операторов сравнения
- •Использование варианта between
- •Проверка на присутствие в списке значений (вариант in)
- •Проверка на пустое значение
- •Поиск в строковых столбцах
- •Вариант like
- •Использование логических операций в условиях поиска
- •Порядок выполнения логических операций
- •Преобразование данных при выборке
- •Обобщение Данных с помощью Агрегатных Функций
- •Использование distinct с count
- •Предложение group by
- •Предложение having
- •Соединение таблиц
- •Внутренние соединения (связывание по равенству)
- •Внешние соединения
- •Левое внешнее соединение
- •Правое внешнее соединение
- •Полное внешнее соединение
- •Более сложные примеры соединений
- •Рефлексивное соединение, или самосоединение
- •Использование подзапросов в операторах sql
- •Выбор одного
- •Использование в подзапросе агрегатных функций
- •Связанные подзапросы
- •Использование оператора exists
- •Использование варианта in с подзапросами
- •Использование not exists
- •Объединение запросов
- •Команда union
- •Добавление данных. Команда insert
- •Добавление отдельной строки
- •Добавление группы строк
- •Обновление уже имеющихся данных. Команда update
- •Удаление данных из таблиц. Команда delete
- •Генераторы и их использование
- •Создание генераторов
- •Использование генераторов
- •Увеличение значения генератора
- •Получение значения генератора в приложение
- •Триггер
Объединение запросов
Составные запросы используются для того, чтобы комбинировать результаты двух операторов SELECT. Использование составного запроса позволяет организовать или, наоборот, подавить вывод повторяющихся записей. С помощью таких запросов можно выводить одновременно аналогичные данные, хранящиеся в разных столбцах
Команда union
Команда UNION используется для объединения результатов двух или более операторов SELECT с исключением повторяющихся строк. Другими словами, если строка попадает в вывод одного запроса, то второй раз она не выводится, даже если она возвращается вторым запросом. При использовании UNION в каждом из связываемых операторов SELECT должно быть выбрано одинаковое число столбцов, столбцы должны быть одинакового типа и следовать в том же порядке.
В составных запросах можно использовать ключевое слово ORDER BY. Однако ключевое слово ORDER BY в них можно использовать только для упорядочения результатов окончательного вывода обоих запросов. Поэтому в составном запросе допускается использовать только одно выражение с ключевым словом ORDER BY, хотя сам составной запрос может состоять из нескольких операторов SELECT На столбцы в выражении ключевого слова ORDER BY можно ссылаться как по псевдонимам, так и по их номерам в списке выбора
Допустим нам нужно найти всех прилетевших из Перми в Москву за определенное число. Человек может прилететь в качестве члена экипажа (если коды этой личности присутствует в таблице EQUIPAGE на заданное число), или в качестве пассажира (если у него есть билет на заданное число). Таким образом, требуется объединить два запроса, первый найдет фамилию, имя, отчество для всех членов экипажа прилетевших из Перми в Москву за 11.01.2008, а второй выведет фамилию, имя, отчество тех кто имеет билеты из Перми в Москву на это же число (такой запрос мы уже делали, когда исследовали соединения таблиц). Для того чтобы отличать пассажира от члена экипажа сделаем следующее, добавим в результат новое поле, где для первого запроса будет во всех строках содержаться один и тот же текст — «Член экипажа», второй запрос разместит в этом поле текст «Пассажир». Это дополнительное поле озаглавим как «Тип». Кроме этого добавим еще одно поле, в которое будем выводить дополнительную информацию, для запроса по членам экипажа будем выводить роль для данного члена, а для пассажиров номер места указанный в билете. Соответственно это поле мы так и озаглавим «Роль/Место».
Обратим внимание, что вновь введенные поля в двух запросах не совпадают по типу. Для того чтобы можно было использовать команду UNION необходимо привести типы этих полей во втором запросе к тому же типу, что и в первом. Преобразование данных к требуемому типу обеспечивает функция CAST. Для поля «Тип» должно быть сделано преобразование к типу CHAR(12), а для поля «Роль/Место» к типу VARCHAR(20).
Получаем запрос:lii
SELECT P.PR_NAME2 AS "Имя",
P.PR_NAME3 AS "Отчество",
P.PR_NAME AS "Фамилия",
'Член экипажа' AS "Тип",
R.RNK_NAME AS "Роль/Место"
FROM PERSON P
INNER JOIN EQUIPAGE EQ ON EQ.EQ_PR_CODE = P.PR_CODE
INNER JOIN RANK R ON R.RNK_CODE = EQ.EQ_RNK_CODE
INNER JOIN AIRLINE AL ON AL.AL_NUM = EQ.EQ_FL_NUM
INNER JOIN AIRPORT AFROM ON AFROM.AP_CODE = AL.AL_AP_FROM
INNER JOIN CITY CFROM ON CFROM.CT_CODE = AFROM.AP_CT_CODE
INNER JOIN AIRPORT ATO ON ATO.AP_CODE = AL.AL_AP_TO
INNER JOIN CITY CTO ON CTO.CT_CODE = ATO.AP_CT_CODE
WHERE CFROM.CT_NAME = 'Пермь' AND CTO.CT_NAME = 'Москва'
AND EQ.EQ_FL_DATE = '11.01.2008'
UNION
SELECT P.PR_NAME2, P.PR_NAME3, P.PR_NAME,
CAST('Пассажир' AS CHAR(12)),
CAST(TC.TC_SEAT AS VARCHAR(20))
FROM PERSON P
INNER JOIN TICKET TC ON TC.TC_PR_CODE = P.PR_CODE
INNER JOIN TARIFF TR ON TR.TR_CODE = TC.TC_TR_CODE
INNER JOIN AIRPORT AFROM ON AFROM.AP_CODE = TR.TR_AP_FROM
INNER JOIN CITY CFROM ON CFROM.CT_CODE = AFROM.AP_CT_CODE
INNER JOIN AIRPORT ATO ON ATO.AP_CODE = TR.TR_AP_TO
INNER JOIN CITY CTO ON CTO.CT_CODE = ATO.AP_CT_CODE
WHERE CFROM.CT_NAME = 'Пермь' AND CTO.CT_NAME = 'Москва'
AND TC.TC_FL_DATE = '11.01.2008'
В результате выполнения запроса получаем список:
Листинг 25. Результат объединения запросов (команды UNION) – список всех прилетевших из Перми в Москву 11.01.2008
Имя |
Отчество |
Фамилия |
Тип |
Роль/Место |
Александр |
Александрович |
Чудинов |
Пассажир |
5Г |
Владимир |
Николаевич |
Карпов |
Пассажир |
3Б |
Владимир |
Юрьевич |
Войтович |
Пассажир |
2Б |
Елена |
Павловна |
Бельтюкова |
Пассажир |
5А |
Ирина |
Валентиновна |
Щекина |
Пассажир |
4A |
Константин |
Игоревич |
Баталов |
Пассажир |
4Б |
Лариса |
Вилльевна |
Вашкарина |
Член экипажа |
Борт проводник |
Максим |
Владимирович |
Бычков |
Член экипажа |
Командир |
Наталья |
Васильевна |
Вожакова |
Пассажир |
2А |
Олег |
Владимирович |
Лядов |
Член экипажа |
Пилот |
Ольга |
Юрьевна |
Боброва |
Пассажир |
4Г |
Светлана |
Александровна |
Ветошкина |
Член экипажа |
Борт проводник |
Светлана |
Леонидовна |
Верушкина |
Пассажир |
5В |
Сергей |
Владимирович |
Богатырев |
Пассажир |
6А |
Татьяна |
Викторовна |
Владысик |
Пассажир |
3Г |
Елена |
Александровна |
Воронюк |
Пассажир |
20А |
Мария |
Ивановна |
Выгузова |
Пассажир |
20Б |
Ольга |
Николаевна |
Вяткина |
Пассажир |
20В |
Юлия |
Дмитриевна |
Гаевская |
Пассажир |
20Г |
Василий |
Александрович |
Глазов |
Пассажир |
20Д |
Дмитрий |
Федорович |
Глумов |
Пассажир |
21А |