Подзапрос, Внутренний запрос или Вложенный запрос — это запрос в другом запросе SQL, который встроен в предложение WHERE.
Подзапрос используется для возврата данных, которые будут использоваться в основном запросе в качестве условия для дальнейшего ограничения данных, подлежащих извлечению.
Подзапросы могут использоваться с операторами SELECT, INSERT, UPDATE и DELETE вместе с такими операторами, как =, <,>,> =, <=, IN, BETWEEN и т. Д.
Есть несколько правил, которым должны следовать подзапросы —
-
Подзапросы должны быть заключены в круглые скобки.
-
У подзапроса может быть только один столбец в предложении SELECT, если в основном запросе нет нескольких столбцов для подзапроса для сравнения его выбранных столбцов.
-
Команда ORDER BY не может использоваться в подзапросе, хотя основной запрос может использовать ORDER BY. Команда GROUP BY может использоваться для выполнения той же функции, что и ORDER BY в подзапросе.
-
Подзапросы, которые возвращают более одной строки, могут использоваться только с несколькими операторами значений, такими как оператор IN.
-
Список SELECT не может содержать ссылки на значения, которые оцениваются как BLOB, ARRAY, CLOB или NCLOB.
-
Подзапрос не может быть сразу заключен в функцию набора.
-
Оператор BETWEEN нельзя использовать с подзапросом. Тем не менее, оператор BETWEEN может использоваться внутри подзапроса.
Подзапросы должны быть заключены в круглые скобки.
У подзапроса может быть только один столбец в предложении SELECT, если в основном запросе нет нескольких столбцов для подзапроса для сравнения его выбранных столбцов.
Команда ORDER BY не может использоваться в подзапросе, хотя основной запрос может использовать ORDER BY. Команда GROUP BY может использоваться для выполнения той же функции, что и ORDER BY в подзапросе.
Подзапросы, которые возвращают более одной строки, могут использоваться только с несколькими операторами значений, такими как оператор IN.
Список SELECT не может содержать ссылки на значения, которые оцениваются как BLOB, ARRAY, CLOB или NCLOB.
Подзапрос не может быть сразу заключен в функцию набора.
Оператор BETWEEN нельзя использовать с подзапросом. Тем не менее, оператор BETWEEN может использоваться внутри подзапроса.
Подзапросы с оператором SELECT
Подзапросы чаще всего используются с оператором SELECT. Основной синтаксис выглядит следующим образом —
SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE])
пример
Рассмотрим таблицу CUSTOMERS, имеющую следующие записи:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 35 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
Теперь давайте проверим следующий подзапрос с помощью инструкции SELECT.
SQL> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500) ;
Это дало бы следующий результат.
+----+----------+-----+---------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+---------+----------+ | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+---------+----------+
Подзапросы с оператором INSERT
Подзапросы также могут использоваться с операторами INSERT. Оператор INSERT использует данные, возвращенные из подзапроса, для вставки в другую таблицу. Выбранные данные в подзапросе могут быть изменены с помощью любой символьной, даты или числовой функции.
Основной синтаксис выглядит следующим образом.
INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ]
пример
Рассмотрим таблицу CUSTOMERS_BKP с такой же структурой, что и таблица CUSTOMERS. Теперь, чтобы скопировать полную таблицу CUSTOMERS в таблицу CUSTOMERS_BKP, вы можете использовать следующий синтаксис.
SQL> INSERT INTO CUSTOMERS_BKP SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS) ;
Подзапросы с оператором UPDATE
Подзапрос может использоваться вместе с оператором UPDATE. Можно использовать один или несколько столбцов в таблице при использовании подзапроса с оператором UPDATE.
Основной синтаксис выглядит следующим образом.
UPDATE table SET column_name = new_value [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
пример
Предполагая, что у нас есть таблица CUSTOMERS_BKP, которая является резервной копией таблицы CUSTOMERS. В следующем примере значение SALARY обновляется в таблице CUSTOMERS в 0,25 раза для всех клиентов, возраст которых больше или равен 27.
SQL> UPDATE CUSTOMERS SET SALARY = SALARY * 0.25 WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 );
Это повлияет на две строки, и, наконец, таблица CUSTOMERS будет иметь следующие записи.
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 35 | Ahmedabad | 125.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 2125.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
Подзапросы с оператором DELETE
Подзапрос может использоваться вместе с оператором DELETE, как и любые другие операторы, упомянутые выше.
Основной синтаксис выглядит следующим образом.
DELETE FROM TABLE_NAME [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
пример
Предполагая, что у нас есть таблица CUSTOMERS_BKP, которая является резервной копией таблицы CUSTOMERS. В следующем примере удаляются записи из таблицы CUSTOMERS для всех клиентов, возраст которых больше или равен 27.
SQL> DELETE FROM CUSTOMERS WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 );
Это повлияет на две строки, и, наконец, таблица CUSTOMERS будет иметь следующие записи.