Чаще всего используются подзапросы с оператором SELECT, хотя, конечно, используются и подзапросы с операторами манипуляций данными. Подзапросы в операторе SELECT извлекают данные для главного запроса.
Базовый синтаксис соответствующего оператора должен быть следующим.
SELECT имя_столбца [, имя_столбца ]
FROM таблица1 [, таблица2 ]
WHERE имя_столбца ОПЕРАЦИЯ
(SELECT имя_столбца [, имя_столбца ]
FROM таблица1 [, таблица2 ]
[ WHERE ]);
Например,
SELECT E.EMP_ID, E.LAST_NAME, E.FIRST_NAME EP.PAY__RATE
FROM EMPLOYEEJTBL E, EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND E?.PAY_RATE > (SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE E.EMP_ID = '313782439');
Этот оператор SQL возвращает табельный номер служащего, фамилию, имя и норму оплаты труда для всех служащих, у которых эта норма оплаты превышает норму оплаты труда служащего с табельным номером 313782439. В данном случае нет необходимости знать (выяснять), какова норма оплаты того конкретного служащего - норма оплаты его труда нужна только для получения списка тех служащих, которые зарабатывают больше, чем он.
В следующем примере извлекается норма оплаты труда конкретного служащего Этот запрос будет использован в качестве подзапроса в примере, следующем за этим
SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE E.EXP_IC - ' 220S84332');
PAY_RATE 11
1 строка выбрана.
Теперь используем этот запрос в качестве подзапроса в следующемзапросе.
SELECT E.EMP_ID, E.LAST_NAME, E.FIRST_NAME EP.PAY_RATE
FROM EMPLOYEEJTBL E, EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND EP.PAY_RATE > (SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE E.EMP_ID = '220984332');
EMP_ID LAST_NAM FIRST_NAM PAY_RATE
442346889 PLEW LINDA 14.75
443679012 SPURGEON TIFFANY 15
2 строки выбраны.
Результатом подзапроса будет 11 (это видно из предыдущего примера), поэтому второе из условий в выражении ключевого слова WHERE главного запроса преобразуется в условие
AND EP.PAY_RATE > 11
В результате выполнения запроса вы не получите норму оплаты труда указанного служащего, но сам главный запрос будет сравнивать нормы оплаты труда других служащих с результатом выполнения подзапроса.
ЕМР ID | LAST NAM | FIRST NAM | PAY_RATE | |
442346889 443679012 | PLEW SPURGEON | LINDA TIFFANY | 14.75 15 |
Подзапросы часто используются тогда, когда в запросе требуется указать условия, точных данных для которых нет. Знамения уровня оплаты труда для служащего 220Э84332 у вас нет, но подзапрос и создается для того, чтобы выяснить это значение
Подзапросы могут использоваться и с операторами языка манипуляций данными (DML). Первым из таких операторов мы рассмотрим оператор INSERT. Оператор INSERT использует данные, возвращаемые подзапросом, для помещения их в другую таблицу. Выбранные в подзапросе данные можно модифицировать с помощью символьных или числовых функций, а также функций дат и времени.
Базовый синтаксис соответствующего оператора должен быть следующим.
INSERT INTO имя_таблицы [ (столбец! [, столбец2 ]) ]
SELECT [ *| столбец1 [, столбец2 ]]
FROM таблица1 [, таблица2 ]
[ WHERE значение ОПЕРАЦИЯ значение ]
Вот пример использования оператора INSERT с подзапросом.
INSERT INTO RICH_EMPLOYEES
SELECT E.EMP_ID, E.LAST_NAME, E.FIRST_NAME EP.PAY_RATE
FROM EMPLOYEE_TBL E, EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND EP.PAY_RATE > (SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE E.EMP_ID = '220984332');
2 строки созданы.
Этот оператор INSERT вставляет значения EMP_ID, LAST_NAME, FIRST_NAME и PAY_RATE в таблицу RICH_EMPLOYEES для всех служащих, норма оплаты труда которых превышает норму оплаты труда служащего с табельным номером 220984332.
При использовании команд DML типа INSERT не забывайте об использовании команд COMMIT и ROLLBACK
Подзапросы можно использовать в операторе UPDATE. С помощью оператора UPDATE с подзапросом можно обновлять данные как одного, так и нескольких столбцов сразу.
Базовый синтаксис оператора следующий.
UPDATE таблица
SET имя_столбца [, имя_столбца ] =
(SELECT имя_столбца [,имя_столбца ] FROM таблица
[ WHERE ])
Рассмотрим примеры, разъясняющие использование оператора UPDATE с подзапросом. Сначала рассмотрим запрос, возвращающий табельные номера служащих из Индианаполиса. Как видите, таких служащих четыре.
SELECT EMP_ID
FROM EMPLOYEE_TBL
WHERE CITY = 'INDIANAPOLIS';
EMP_ID
442346889
313782439
220984332
443679012
4 строки выбраны.
Этот запрос будет использован в качестве подзапроса в следующем операторе UPDATE. Вот этот оператор UPDATE с подзапросом.
UPDATE EMPLOYEE_PAY_TBL
SET PAY_RATE = PAY_RATE * 1.1
WHERE EMP_ID IN (SELECT EMP_ID
FROM EMPLOYEE_TBL
WHERE CITY = 'INDIANAPOLIS');
4 строки обновлены.