T-SQL - Подзапросы
А sub-query или же Inner query или же Nested queryявляется запросом в другом запросе SQL Server и встроенным в предложение WHERE. Подзапрос используется для возврата данных, которые будут использоваться в основном запросе в качестве условия для дальнейшего ограничения извлекаемых данных.
Подзапросы могут использоваться с операторами SELECT, INSERT, UPDATE и DELETE вместе с такими операторами, как =, <,>,> =, <=, IN, BETWEEN и т. Д.
Есть несколько правил, которым должны следовать подзапросы:
Вы должны заключить подзапрос в круглые скобки.
Подзапрос должен включать предложение SELECT и предложение FROM.
Подзапрос может включать необязательные предложения WHERE, GROUP BY и HAVING.
Подзапрос не может включать предложения COMPUTE или FOR BROWSE.
Вы можете включить предложение ORDER BY только тогда, когда включено предложение TOP.
Вы можете вкладывать подзапросы до 32 уровней.
Подзапросы с оператором 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 32 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.
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.
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.
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 32 Ahmedabad 500.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.
DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )
Это повлияет на две строки, и, наконец, таблица CUSTOMERS будет иметь следующие записи.
ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00