
Подзапрос или внутренний запрос или вложенный запрос является запросом в другом SQL запросе и встроенный в предложении WHERE.
Подзапрос используется для получения данных, которые будут использоваться в основном запросе в качестве условия для дальнейшего ограничения данных, которые будут извлечены.
Подзапросы можно использовать с SELECT, INSERT, UPDATE и заявлением DELETE вместе с операторами LIKE =, <, >, >=, <=, IN, 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])
Пример
Рассмотрим таблицу клиентов, имеющих следующие записи:
+----+----------+-----+-----------+----------+ | 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 использует данные, возвращаемые из подзапроса для вставки в другую таблицу. Выбранные данные в подзапросе могут быть изменены с помощью любой из функций символов, даты или номера.
Базовый синтаксис выглядит следующим образом.
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.
Базовый синтаксис выглядит следующим образом.
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 как и с любыми другими заявлениями, упомянутых выше.
Базовый синтаксис выглядит следующим образом.
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 | +----+----------+-----+-----------+----------+
Редактор: AndreyEx
Поделиться в соц. сетях: