- •ОГЛАВЛЕНИЕ
- •3. Простые варианты поиска данных
- •3.2. Использование ключевого слова DISTINCT
- •3.3. Предложение WHERE
- •4.1. Использование DISTINCT с COUNT
- •4.3. Предложение HAVING
- •5.2. Внешние соединения
- •6. ИСПОЛЬЗОВАНИЕ ПОДЗАПРОСОВ В ОПЕРАТОРАХ SQL
- •6.4. Использование оператора EXISTS
- •6.5. Использование варианта IN с подзапросами
- •6.6. Использование NOT EXISTS
- •8. ДОБАВЛЕНИЕ ДАННЫХ. КОМАНДА INSERT
- •8.1. Добавление отдельной строки
- •9. ОБНОВЛЕНИЕ УЖЕ ИМЕЮЩИХСЯ ДАННЫХ.
- •КОМАНДА UPDATE
- •10. УДАЛЕНИЕ ДАННЫХ ИЗ ТАБЛИЦ. КОМАНДА DELETE
- •11. ГЕНЕРАТОРЫ И ИХ ИСПОЛЬЗОВАНИЕ
- •11.1. Создание генераторов
- •ПРИМЕРЫ ЗАПРОСОВ
ФИО |
Дата рождения |
Васильева Наталья Васильевна |
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. Внутренний и внешний запрос свя заны при помощи приравнивания кода личности из внешнего запро