Підзапити SQL і CTE
Коротко: Підзапит — запит усередині іншого запиту. CTE («common table expression», WITH) дає проміжному запиту назву й робить довгі запити читабельними.
Докладніше: Обидва розв’язують завдання, які не виконати одним простим запитом, наприклад «клієнти з оборотом вище середнього».
Подробиці
- Скалярний: Повертає рівно одне значення:
WHERE amount > (SELECT AVG(amount) FROM orders). - Список:
WHERE customer_id IN (SELECT id FROM customer WHERE country = 'DE'). - EXISTS:
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id)перевіряє, чи є хоча б один рядок, і зупиняється на першому збігу. Часто швидше й безпечніше заIN, особливо щодо пасток NULL (див. NULL у SQL). - Корельований: Підзапит посилається на зовнішній рядок і логічно виконується для кожного рядка.
- У FROM: Підзапит як «похідна таблиця», якій дається псевдонім.
- CTE:
WITH revenue AS (SELECT customer_id, SUM(amount) s FROM orders GROUP BY customer_id) SELECT ... FROM revenue .... Кілька CTE поспіль структурують складні вибірки. Рекурсивні: рекурсивні CTE. - Вибір: Читабельність важлива. Сучасні оптимізатори часто обробляють підзапити як з’єднання.
Див. також: JOIN в SQL, віконні функції