Подзапросы внутри подзапросов

Подзапросы в операторе DELETE

Подзапросы в операторе UPDATE

Подзапросы можно использовать в операторе UPDATE. С помощью оператора UPDATE с подзапросом можно обновлять данные как одного, так и нескольких столбцов сразу.

Базовый синтаксис оператора следующий.

UPDATE таблица SET имя_столбца [, имя_столбца ] =

(SELECT имя_столбца [,имя_столбца ] FROM таблица [ WHERE ])

Рассмотрим примеры, разъясняющие использование оператора UPDATE с подзапросом. Сначала рассмотрим запрос, возвращающий табельные номера служащих из Индианаполиса. Как видите, таких служащих четыре.

SELECT EMP_ID FROM EMPLOYEE_TBL WHERE CITY = 'INDIANAPOLIS';

EMP_ID

Этот запрос будет использован в качестве подзапроса в следующем операторе 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');

Как и ожидалось, были обновлены данные четырех строк. Здесь следует обратить внимание на то, что в отличие от примеров в предыдущих разделах в данном случае подзапрос возвращает несколько строк данных. Ввиду того, что ожидается получить от подзапроса несколько строк, используется ключевое слово IN, позволяющее сравнить данное значение со списком значений. При использовании для сравнения знака равенства было бы возвращено сообщение об ошибке.

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

Подзапросы можно использовать в операторе DELETE. Базовый синтаксис оператора следующий.

DELETE FROM имя_таблицы [ WHERE ОПЕРАЦИЯ [ значение ] (SELECT имя_столбца

FROM имя_таблицы [ WHERE ])

В следующем примере из таблицы EMPLOYEE_PAY_TBL удаляется запись с информацией о служащем по имени BRANDON GLASS. Табельный номер этого служащего не известен, но можно создать подзапрос, который найдет этот номер в таблице EMPLOYEE_TBL по значениям столбцов с именами (FIRST_NAME) и фамилиями (LAST_NAME) служащих.

DELETE FROM EMPLOYEE_PAY_TBL WHERE EMP_ID = (SELECT EMP_ID

FROM EMPLOYEE_PAY_TBL WHERE LAST_NAME = 'GLASS' AND FIRST_NAME = 'BRANDON');

He забывайте использовать воператорах UPDATE и DELETE ключевое слово WHERE. Если последнее не использовать, будут обновлены или удалены данные всех столбцов

Точно так же, как подзапрос можно вложить в главный запрос, подзапрос можно вложить и в подзапрос. В главном запросе подзапрос выполняется до выполнения главного, точно так же и в подзапросе вложенный в него подзапрос будет выполнен первым

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

Базовый синтаксис для операторов, использующих вложенные подзапросы, должен быть следующим

SELECT имя_столбца [, имя_столбца ] FROM таблица1 [, таблица2 ]

WHERE имя_столбца ОПЕРАЦИЯ (SELECT имя__столбца

FPOM таблица WHERE имя_столбца ОПЕРАЦИЯ (SELECT имя_столбца FROM таблица

[WHEREимя_столбца ОПЕРАЦИЯ значение]))

В следующем примере используются два подзапроса, вложенные один в другой. Требуется выяснить, какие покупатели заказали товаров на сумму большую, чем сумма цен всех товаров

SELECT CUST_ID, CUST_NAME FROM CUSTOMER_TBL

WHERE CUST_ID IN (SELECT O.CUST_ID

FROM ORDERS_TBL O, PRODUCTS_TBL P WHERE 0 PROD_ID = P.PROD_ID

AND O.QTY * P.COST > (SELECT SUM(COST) FROM PRODUCTS_TBL));

CUST_ID CUST_NAME

287 GAVINS PLACE

43 SCHYLERS NOVELTIES

В результате оказались выбранными 2 строки, удовлетворяющие условиям обоих подзапросов.

Вот как последовательно выполнялись запросы в данном операторе.

SELECT SUM(COST) FROM PRODUCTS_TBL));

SUM(COST)

138.08

SELECT O.CUST_ID FROM ORDERS_TBL O, PRODUCTS_TBL P

WHERE О PROD_ID = P.PROD_ID AND O.QTY * P.COST > 138.08;

CUST_ID

После подстановки в главный запрос результатов внутреннего подзапроса главный запрос принимает следующий вид

SELECT CUST_ID, CUST_NAME FROM CUSTOMER_TBL WHERE CUST_ID IN (SELECT O.CUST_ID

FROM ORDERS_TBL O, PRODUCTS_TBL P WHERE О PROD_ID = P.PROD_ID AND O.QTY * P.COST > 138.08);

А вот что получается после выполнения следующего подзапроса

SELECT CUST_ID, CUST_NAME FROM CUSTOMER_TBL WHERE CUST_ID IN '287’, '43');

Поэтому в результате имеем

CUST_ID CUST_NAME

287 GAVINS PLACE

43 SCHYLERS NOVELTIES

При использовании в операторе нескольких подзапросов увеличивается время, необходимое для обработки запроса, и повышается вероятность ошибок из-за усложнения оператора.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: