Подзапрос или внутренний запрос или вложенный запрос является запросом в другом SQL запросе и встроенный в предложении WHERE.
Подзапрос используется для получения данных, которые будут использоваться в основном запросе в качестве условия для дальнейшего ограничения данных, которые будут извлечены.
Подзапросы можно использовать с SELECT, INSERT, UPDATE и заявлением DELETE вместе с операторами LIKE =, <, >, >=, <=, IN, BETWEEN и т.д.
Есть несколько правил, которым подзапросы должны следовать:
Подзапросы наиболее часто используется с SELECT. Базовый синтаксис выглядит следующим образом:
SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE])
Рассмотрим таблицу клиентов, имеющих следующие записи:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Moscow | 21000.00 | | 2 | AndreyEx | 38 | Krasnodar | 55500.00 | | 3 | Oleg | 33 | Rostov | 34000.00 | | 4 | Masha | 35 | Moscow | 34000.00 | | 5 | Ruslan | 34 | Omsk | 45000.00 | | 6 | Dima | 32 | SP | 45000.00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+
Теперь, давайте проверим следующий подзапрос с оператором SELECT.
SQL> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 44000);
Это произведет следующий результат:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 2 | AndreyEx | 38 | Krasnodar | 55500.00 | | 5 | Ruslan | 34 | Omsk | 45000.00 | | 6 | Dima | 32 | SP | 45000.00 | +----+----------+-----+-----------+----------+
Подзапросы также может использоваться с операторами INSERT. Оператор INSERT использует данные, возвращаемые из подзапроса для вставки в другую таблицу. Выбранные данные в подзапросе могут быть изменены с помощью любой из функций символов, даты или номера.
Базовый синтаксис выглядит следующим образом.
INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ]
Рассмотрим таблицу CUSTOMERS_BKP с аналогичной структурой в виде таблицы клиентов. Теперь, чтобы скопировать всю таблицу CUSTOMERS в таблицу CUSTOMERS_BKP, вы можете использовать следующий синтаксис.
SQL> INSERT INTO CUSTOMERS_BKP SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS) ;
Подзапрос может быть использован в сочетании с заявлением UPDATE. Либо один или несколько столбцов в таблице, могут быть обновлены при использовании подзапросов с заявлением UPDATE.
Базовый синтаксис выглядит следующим образом.
UPDATE table SET column_name = new_value [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
Предполагая, что у нас есть таблица CUSTOMERS_BKP, которая является резервной копией таблицы Customers. Следующий пример обновляет SALARY на 0,25 раза в таблице клиентов для всех клиентов, возраст которых больше или равен 37.
SQL> UPDATE CUSTOMERS SET SALARY = SALARY * 1.2 WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 37 );
Это будет влиять на две строки и, наконец, таблица CUSTOMERS будет иметь следующие записи:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Moscow | 21000.00 | | 2 | AndreyEx | 38 | Krasnodar | 66600.00 | | 3 | Oleg | 33 | Rostov | 34000.00 | | 4 | Masha | 35 | Moscow | 34000.00 | | 5 | Ruslan | 34 | Omsk | 45000.00 | | 6 | Dima | 32 | SP | 45000.00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+
Подзапрос может быть использован в сочетании с DELETE как и с любыми другими заявлениями, упомянутых выше.
Базовый синтаксис выглядит следующим образом.
DELETE FROM TABLE_NAME [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
Предполагая, у нас есть таблица CUSTOMERS_BKP, которая является резервной копией таблицы Customers. Следующий пример удаляет записи из таблицы CUSTOMERS для всех клиентов, чей возраст больше или равен 37.
SQL> DELETE FROM CUSTOMERS WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 37 );
Это будет влиять на одну строку и, наконец, таблица CUSTOMERS будет иметь следующие записи:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Moscow | 21000.00 | | 3 | Oleg | 33 | Rostov | 34000.00 | | 4 | Masha | 35 | Moscow | 34000.00 | | 5 | Ruslan | 34 | Omsk | 45000.00 | | 6 | Dima | 32 | SP | 45000.00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+