Dış sorguya bakan alt sorgu
İlişkili (correlated) alt sorgu, dış sorgudaki bir sütunu kullanır; mantıksal olarak her satır için yeniden çalışır.
-- Kendi kategorisinin ortalamasından pahalı ürünler SELECT p.name, p.category, p.price FROM products p WHERE p.price > ( SELECT AVG(p2.price) FROM products p2 WHERE p2.category = p.category );
EXISTS ve NOT EXISTS
EXISTS, alt sorgu en az bir satır döndürürse doğrudur. Satırların içeriği önemsizdir; bu yüzden SELECT 1 yazmak gelenektir.
-- Mobil kanaldan en az bir sipariş vermiş müşteriler SELECT c.first_name, c.last_name FROM customers c WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id AND o.channel = 'mobile' );
NOT EXISTS, anti-join'in en güvenli yazımıdır; NULL tuzağına düşmez.
SELECT içinde ilişkili alt sorgu
SELECT c.first_name,
(SELECT MAX(o.order_date) FROM orders o WHERE o.customer_id = c.customer_id) AS son_siparis
FROM customers c
LIMIT 10;
PerformansModern optimizasyon motorları çoğu ilişkili alt sorguyu JOIN'e dönüştürür. Yine de büyük tablolarda SELECT içindeki ilişkili alt sorgular yavaş olabilir; JOIN + GROUP BY veya pencere fonksiyonu alternatiflerini düşün.
Derinleş: ilişkili alt sorguyu pencereye çevirmek
“Kendi restoranının ortalamasından pahalı ürünler” iki biçimde yazılabilir; ikincisi tabloyu bir kez tarar:
-- ilişkili alt sorgu SELECT name FROM lk_menu_items m WHERE price > (SELECT AVG(price) FROM lk_menu_items x WHERE x.restaurant_id = m.restaurant_id); -- pencere fonksiyonu SELECT name FROM ( SELECT name, price, AVG(price) OVER (PARTITION BY restaurant_id) AS ort FROM lk_menu_items ) t WHERE price > ort;