EMZETT.
Увійти

Підзапити 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, віконні функції