Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информационное обеспечение систем управления. Построение запросов пр.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
3.76 Mб
Скачать

ФИО

Дата рождения

Васильева Наталья Васильевна

09.11.1980

Зеленина Екатерина Владимировна

16.12.1977

Зеленина Надежда Александровна

11.12.1965

Зеленина Наталья Александровна

23.09.1990

Зеленина Ольга Викторовна

30.04.1958

Култышева Лиана Валентиновна

22.01.1970

Култышева Наталья Сергеевна

 

Лобанов Алексей Викторович

18.11.1951

Лобанов Владимир Николаевич

 

Лядова Надежда Вячеславовна

 

Лядова Наталья Викторовна

12.01.1973

Некрасова Елена Павловна

08.09.1970

Некрасова Татьяна Николаевна

04.12.1949

Новикова Вера Валерьевна

09.03.1947

Новикова Марина Рафаиловна

30.11.1975

Рожкова Анастасия Сергеевна

 

Рожкова Оксана Юрьевна

 

Степанова Ирина Борисовна

 

Степанова Наталья Алексеевна

09.11.1969

Обратите внимание на то, что в данном случае мы обязаны для таблиц указывать псевдонимы, чтобы точно определить в операто­ ре, к какой именно таблице относится тот или иной столбец. В на­ шем случае используются псевдонимы Р1, Р2. Имея два псевдони­ ма, таблицу можно рассматривать как две разные таблицы.

6. ИСПОЛЬЗОВАНИЕ ПОДЗАПРОСОВ В ОПЕРАТОРАХ SQL

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

связанным с аэропортами вылета, находящимися в городе Перми. Для Т°г0 чтобы это сделать, нужно во внешний запрос добавить объединение с таблицей CITY и наложить условие (предложение WHERE) по названию города, во внутреннем запросе нужно искать минимУм не из всех возможных строк таблицы TARIFF, а только из те?4’ У котоРых К°Д аэропорта вылета (TR_AP_FROM) совпадает

с долУстимыми аэропортами. (1олучаем следующий запрос:44

SELECT Т. TR_AL_NUM AS "Номер Авиалинии",

AFROM.APJNAME AS "Аэропорт вылета", ATO.APJNAME AS "Аэропорт прилета",

S.SL_NAME AS "Салон",

T.TR_COSTAS "Стоимость" fROM TARIFF T

INNER JOIN AIRPORT AFROM ON (T. TR_AP_FROM =

AFROM.AP_CODE)

INNER JOIN AIRPORT ATO ON (T.TR_AP_TO = ATO.AP_CODE)

INNER JOIN SALON S ON (T.TR_SL_TYPE = S.SL_TYPE) INNER JOIN CITY C ON (AFROM.AP_CT_CODE -

C.CT_CODE)

WHERE (C.CTJNAME = 'Пермь')

AND (T.TR_COST = (SELECT MIN(TR_COST) FROM TARIFF

WHERE TR_AP_FROM = AFROM.AP_CODE))

Другим примером может быть использование вложенного под­ запроса с функцией COUNT. Найдем фамилию, имя, отчество чле­ нов экипажа, совершивших в феврале 2008 г. более одного полета, иными словами - тех, для кого в таблице EQUIPAGE содержится более одной записи, датируемой февралем.45

SELECT PRJNAME2 AS "Имя",

PRJNAME3 AS "Отчество",

PR_NAME AS "Фамилия" FROM PERSON

WHERE ( SELECT COUNT(*) FROM EQUIPAGE

WHERE EQ_FL_DATE BETWEEN 4.02.08'

AND '29.02.08'

AND EQ_PR_CODE = PERSON.PR CODE) > 1

Самый внутренний оператор SELECT подсчитывает количест­ во строк исходной таблицы EQUIPAGE, попадающих на февраль, имеющих одно и то же значение кода человека. Предложение WHERE во внешнем запросе задает для выборки только те строки, где это количество больше единицы. Мы ссылаемся на коды людей во внутреннем операторе SELECT и на коды людей в операторе SELECT более высокого уровня.

В результате получаем результат:

Листинг 23

Список членов экипажа совершивших в феврале 2008 г. более одного полета

Имя

Отчество

Фамилия

Евгений

Андреевнич

Болотов

Марина

Владимировна

Волченко

Анна

Валерьевна

Грунтович

Замечание. Точно такого же результата можно было до­ биться, построив запрос с использованием группировки по колон­ кам PRNAME2, PRNAME3, PRNAME и применив HAVING COUNT(*) >/.

Следующий запрос проиллюстрирует другой пример использо­ вания функции COUNT в подзапросе (в этом случае использование подзапроса является единственным способом получения результа­ та). Итак, получим фамилию, имя, отчество пассажиров, которые приобрели более одного билета в течении 2008 г., также выведем номер авиалинии и дату вылета из билета. Внутренний подзапрос подсчитает количество билетов за 2008 г. для каждой личности, ко­ торые извлекаются внешним запросом. При этом внешний запрос выбирает только те строки, где количество, найденное внутренним запросом, будет больше одного (иными словами, у этой личности больше одного билета), а также производит внутреннее объедине­ ние таблиц PERSON и TICKET. Внутренний и внешний запрос свя­ заны при помощи приравнивания кода личности из внешнего запро­