Ana içeriğe geç
Kesit SQL
Orta · Küme ve Alt Sorgular

İlişkili alt sorgular (correlated subquery) ve EXISTS

Dış sorgunun her satırı için çalışan alt sorgular.

Uygulamada aç, 9 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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;
Alıştırmalara geç (9)