Лекция 5.7 Использование подзапросов
Подзапрос — это запрос, содержащийся в выражении ключевого слова WHERE другого запроса с целью дополнительных ограничений на выводимые данные. Подзапросы называют также вложенными запросами. Подзапрос в содержащем его запросе используют для наложения условий на выводимые данные. Подзапросы могут использоваться с операторами SELECT, INSERT, UPDATE или DELETE. В некоторых случаях подзапрос можно использовать вместо связывания таблиц, тем самым связывая данные таблиц неявно. При использовании в запросе подзапроса сначала выполняется подзапрос, а только потом — содержащий его запрос, причем с учетом условий выполнения подзапроса. Результаты выполнения подзапроса используются при обработке условий в выражении ключевого слова WHERE основного запроса Подзапрос можно использовать либо в выражении ключевого слова WHERE, либо в выражении ключевого слова HAVING главного запроса. Логические операции и операции сравнения типа =, >, <, о, IN, NOT IN, AND, OR и т п. можно использовать как в подзапросе, так и для обработки результатов подзапроса в выражениях ключевых слов WHERE и HAVING. Все, что применимо к обычному запросу, применимо и к подзапросу Операции связывания, функции, преобразования данных и многое другое можно использовать и в подзапросах При составлении подзапросов необходимо придерживаться следующих правил. • Подзапрос необходимо заключить в круглые скобки. BLOB, ARRAY, CLOB ИЛИ NCLOB. • Подзапрос нельзя непосредственно использовать как аргумент допускающей множество значений функяии.
FROM таблица WHERE имя_столбца = (SELECT имя__столбца FROM таблица WHERE условия); Обратите внимание на отступы в примерах Отступы используются исключительно в целях оформления. Практика показывает, что чем аккуратнее выглядят операторы SQL, тем проще они для понимания и тем легче искать и исправлять в них ошибки, если таковые вдруг обнаруживаются. Рассмотрим примеры правильного и неправильного использования операции BETWEEN в операторе с подзапросом. Вот пример правильного использования BETWEEN: SELECT имя_столбца FROM таблица WHERE имя_столбца ОПЕРАЦИЯ (SELECT имя_столбца FROM таблица WHERE значение BETWEEN значение); Вот пример неправильного использования BETWEEN: SELECT имя_столбца FROM таблица WHERE имя_столбца BETWEEN значение AND (SELECT имя_столбца FROM таблица); Подзапросы в операторе 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 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. В данном случае нет необходимости знать (выяснять), какова норма оплаты того конкретного служащего — норма оплаты его труда нужна только для получения списка тех служащих, которые зарабатывают больше, чем он. В следующем примере извлекается норма оплаты труда конкретного служащего Этот запрос будет использован в качестве подзапроса в примере, следующем за этим Ввод: 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 В результате выполнения запроса вы не получите норму оплаты труда указанного служащего, но сам главный запрос будет сравнивать нормы оплаты труда других служащих с результатом выполнения подзапроса.
Подзапросы часто используются тогда, когда в запросе требуется указать условия, точных данных для которых нет. Знамения уровня оплаты труда для служащего 220Э84332 у вас нет, но подзапрос и создается для того, чтобы выяснить это значение Подзапросы в операторе INSERT Подзапросы могут использоваться и с операторами языка манипуляций данными (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 с подзапросом можно обновлять данные как одного, так и нескольких столбцов сразу. Базовый синтаксис оператора следующий. UPDATE таблица SET имя_столбца [, имя_столбца ] = (SELECT имя_столбца [,имя_столбца ] FROM таблица [ WHERE ]) Рассмотрим примеры, разъясняющие использование оператора UPDATE с подзапросом. Сначала рассмотрим запрос, возвращающий табельные номера служащих из Индианаполиса. Как видите, таких служащих четыре. Ввод:
|