От автора: в SQL подзапросы — или внутренние запросы, или вложенные запросы — это запрос внутри другого запроса SQL, который вложен в условие WHERE.
Подзапрос используется для возврата данных, которые будут использоваться в основном запросе, в качестве условия для дальнейшей фильтрации данных, подлежащих извлечению.
Подзапросы могут использоваться с инструкциями SELECT, INSERT, UPDATE и DELETE вместе с операторами типа =, <,>,> =, <=, IN, BETWEEN и т. д.
Существует несколько правил, которые применяются к подзапросам:
Подзапросы должны быть заключены в круглые скобки.
Подзапрос может иметь только один столбец в условии SELECT, если только несколько столбцов не указаны в основном запросе для подзапроса для сравнения выбранных столбцов.
Команда ORDER BY не может использоваться в подзапросе, хотя в основном запросе она использоваться может. В подзапросе может использоваться команда GROUP BY для выполнения той же функции, что и ORDER BY.
Подзапросы, которые возвращают более одной строки, могут использоваться только с несколькими операторами значений, такими как оператор IN.
Список SELECT не может содержать ссылки на значения, которые вычисляются для BLOB, ARRAY, CLOB или NCLOB.
Подзапрос не может быть сразу заключен в функцию set.
С подзапросом не может использоваться оператор BETWEEN. Однако оператор BETWEEN может использоваться внутри подзапроса.
Подзапросы с инструкцией SELECT
Подзапросы чаще всего используются с инструкцией SELECT. При этом используется следующий синтаксис:
1 2 3 4 5 6 |
SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE]) |
Пример
Рассмотрим таблицу CUSTOMERS, содержащую следующие записи:
Теперь давайте выполним следующий подзапрос с инструкцией SELECT.
1 2 3 4 5 |
SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500) ; |
В результате мы получим следующее.
Подзапросы с инструкцией INSERT
Подзапросы также могут использоваться с инструкцией INSERT. Инструкция INSERT использует данные, возвращаемые из подзапроса, для вставки в другую таблицу. Выбранные в подзапросе данные могут быть изменены с помощью любых функций символа, даты или числа. Основной синтаксис следующий.
1 2 3 4 |
INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ] |
Пример
Рассмотрим таблицу CUSTOMERS_BKP со структурой аналогичной таблице CUSTOMERS. Теперь, чтобы скопировать всю таблицу CUSTOMERS в таблицу CUSTOMERS_BKP, вы можете использовать следующий синтаксис.
1 2 3 4 |
INSERT INTO CUSTOMERS_BKP SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS) ; |
Подзапросы с инструкцией UPDATE
Подзапрос может использоваться в сочетании с инструкцией UPDATE. Один или несколько столбцов в таблице могут быть обновлены при использовании подзапроса с помощью инструкции UPDATE. Основной синтаксис следующий.
1 2 3 4 5 6 |
UPDATE table SET column_name = new_value [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ] |
Пример
Исходя из того, что у нас есть таблица CUSTOMERS_BKP, которая является резервной копией таблицы CUSTOMERS, в следующем примере для всех записей, для которых AGE больше или равно 27, применяет коэффициент 0,25.
1 2 3 4 |
UPDATE CUSTOMERS SET SALARY = SALARY * 0.25 WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 ); |
В результате будут изменены две строки, и таблица CUSTOMERS будет выглядеть следующим образом.
Подзапросы с инструкцией DELETE
Подзапрос может использоваться в сочетании с инструкцией DELETE, так же как и со всеми описанными выше инструкциями. Основной синтаксис следующий.
1 2 3 4 5 |
DELETE FROM TABLE_NAME [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ] |
Пример
Предположим, у нас есть таблица CUSTOMERS_BKP, которая является резервной копией таблицы CUSTOMERS. В следующем примере удаляются записи из таблицы CUSTOMERS для всех клиентов, AGE которых больше или равно 27.
1 2 3 |
DELETE FROM CUSTOMERS WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 ); |
В результате будут изменены две строки и таблица CUSTOMERS будет выглядеть следующим образом.
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.