Учебники

SQL — подзапросы

Подзапрос, Внутренний запрос или Вложенный запрос — это запрос в другом запросе 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 будет иметь следующие записи.