Подзапросы в операторе SELECT
Чаще всего используются подзапросы с оператором 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 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 = '313782439');
Этот оператор SQL возвращает табельный номер служащего, фамилию, имя и норму оплаты труда для всех служащих, у которых эта норма оплаты превышает норму оплаты труда служащего с табельным номером 313782439. В данном случае нет необходимости знать (выяснять), какова норма оплаты того конкретного служащего – норма оплаты его труда нужна только для получения списка тех служащих, которые зарабатывают больше, чем он.
В следующем примере извлекается норма оплаты труда конкретного служащего. Этот запрос будет использован в качестве подзапроса в примере, следующем за этим.
|
|
SELECT PAY_RATE FROM EMPLOYEE_PAY_TBL WHERE E.EXP_IC = ' 220S84332';
PAY_RATE
Теперь используем этот запрос в качестве подзапроса в следующем запросе.
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');
EMP_ID LAST_NAM FIRST_NAM PAY_RATE
442346889 PLEW LINDA 14.75
443679012 SPURGEON TIFFANY 15
Результатом подзапроса будет 11 (это видно из предыдущего примера), поэтому второе из условий в выражении ключевого слова WHERE главного запроса преобразуется в условие
AND EP.PAY_RATE > 11
В результате выполнения запроса вы не получите норму оплаты труда указанного служащего, но сам главный запрос будет сравнивать нормы оплаты труда других служащих с результатом выполнения подзапроса.
ЕМР ID | LAST NAM | FIRST NAM | PAY_RATE |
442346889 443679012 | PLEW SPURGEON | LINDA TIFFANY | 14.75 |
Подзапросы часто используются тогда, когда в запросе требуется указать условия, точных данных для которых нет. Значения уровня оплаты труда для служащего 220984332 у вас нет, но подзапрос и создается для того, чтобы выяснить это значение
Подзапросы могут использоваться и с операторами языка манипуляций данными (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');
Этот оператор INSERT вставляет значения EMP_ID, LAST_NAME, FIRST_NAME и PAY_RATE в таблицу RICH_EMPLOYEES для всех служащих, норма оплаты труда которых превышает норму оплаты труда служащего с табельным номером 220984332.
При использовании команд DML типа INSERT не забывайте об использовании команд COMMIT и ROLLBACK