Від автора: у SQL підпорядкований або внутрішні запити, або вкладені запити — це запит всередині іншого запиту SQL, який вкладений в умова WHERE.
Підзапит використовується для повернення даних, які будуть використовуватися в основному запиті, в якості умови для подальшої фільтрації даних, що підлягають вилученню.
Підпорядкований можуть використовуватися з інструкціями SELECT, INSERT, UPDATE і DELETE разом з операторами типу =, ,> =, <=, IN, BETWEEN і т. д.
Існує кілька правил, які застосовуються до подзапросам:
Підпорядкований повинні бути укладені в круглі дужки.
Підзапит може мати тільки один стовпець умови SELECT, якщо тільки декілька стовпців не вказані в основному запиті для подзапроса для порівняння обраних стовпців.
Команда ORDER BY не може використовуватися в підзапитів, хоча в основному запиті вона може використовуватися. В підзапитів може використовуватися команда GROUP BY для виконання тієї ж функції, що і ORDER BY.
Підпорядкований, які повертають більше одного рядка, можуть використовуватися тільки з декількома операторами значень, такими як оператор IN.
Список SELECT не може містити посилання на значення, які обчислюються для BLOB, ARRAY, CLOB або NCLOB.
Підзапит не може бути відразу укладений у функцію set.
З підзапит не може використовуватись оператор 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, містить наступні записи:
Тепер давайте виконаємо наступний підзапит до інструкції SELECT.
SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS
WHERE SALARY > 4500) ;
В результаті ми отримаємо наступне.
Підпорядкований з інструкцією 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, у наступному прикладі для всіх записів, для яких AGE більше або дорівнює 27, застосовує коефіцієнт 0,25.
UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 27 );
В результаті будуть змінені два рядки, і таблиця CUSTOMERS буде виглядати наступним чином.
Підпорядкований з інструкцією 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 буде виглядати наступним чином.