У SQL ми можемо помістити один запит всередині іншого запиту (зробивши підзапит). У підзапиті результат зовнішнього запиту залежить від результатів внутрішнього запиту. Ось чому підзапити також називають вкладеними запитами. Наприклад:
|
1 2 3 4 5 6 |
SELECT * FROM Customers WHERE age = ( SELECT MIN(age) FROM Customers ); |
Тут спочатку виконується підзапит (внутрішній запит) — ми вибираємо найменше значення age з таблиці Customers. Потім виконується зовнішній запит — ми вибираємо рядки, в яких age дорівнює результату підзапиту (найменшому значенню age).

Розглянемо інший приклад. Припустимо, нам потрібні відомості про клієнтів, які розмістили замовлення. Ось як ми можемо це зробити за допомогою підзапиту:
|
1 2 3 4 5 6 |
SELECT customer_id, first_name FROM Customers WHERE customer_id IN ( SELECT customer_id FROM Orders ); |
Спочатку ми вибираємо customer_id з таблиці Orders, потім вибираємо рядки з таблиці Customers, у яких customer_id збігається з результатами підзапиту.

Підзапит та оператор JOIN в SQL
У деяких сценаріях ми можемо отримати однакові результати, використовуючи як підзапит, так і оператор JOIN. Наприклад, результат виконання наступної SQL-команди:
|
1 2 3 4 5 |
SELECT DISTINCT Customers.customer_id, Customers.first_name FROM Customers INNER JOIN Orders ON Customers.customer_id = Orders.customer_id ORDER BY Customers.customer_id; |
рівнозначний результату виконання
|
1 2 3 4 5 6 |
SELECT customer_id, first_name FROM Customers WHERE customer_id IN ( SELECT customer_id FROM Orders ); |
Примітка: Рекомендується використовувати оператор JOIN замість підзапитів (наскільки це можливо), оскільки швидкість виконання операцій з JOIN вища і процес краще оптимізований, ніж під час використання підзапитів.
