SQL — Підпорядкований

15

Від автора: у 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, містить наступні записи:

SQL — Підпорядкований

Тепер давайте виконаємо наступний підзапит до інструкції SELECT.

SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS
WHERE SALARY > 4500) ;

В результаті ми отримаємо наступне.

SQL — Підпорядкований

Підпорядкований з інструкцією 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 буде виглядати наступним чином.

SQL — Підпорядкований

Підпорядкований з інструкцією 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 буде виглядати наступним чином.

SQL — Підпорядкований