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

EXISTS, NOT EXISTS, ANY ve ALL: yarı ve karşıt birleştirmeler

Var mı / yok mu soruları, NOT IN ve NULL tuzağı, ANY/ALL ile karşılaştırma.

Uygulamada aç, 7 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ç.

EXISTS: “en az bir tane var mı?”

EXISTS (alt sorgu), alt sorgu en az bir satır döndürürse doğrudur. Alt sorgunun SELECT listesi önemsizdir (SELECT 1 yazılır). Bu desene yarı birleştirme (semi-join) denir: müşteri satırı çoğalmaz.

-- En az bir iade siparişi olan müşteriler
SELECT c.customer_id, c.first_name
FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o
              WHERE o.customer_id = c.customer_id AND o.status = 'returned')
ORDER BY c.customer_id
LIMIT 5;

NOT EXISTS: karşıt birleştirme

-- Hiç sipariş vermemiş müşteriler
SELECT COUNT(*) AS siparissiz
FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
NOT IN ve NULLWHERE x NOT IN (SELECT y ...) listesinde tek bir NULL varsa koşul hiçbir satır için doğru olmaz ve sonuç boş döner. NOT EXISTS bu tuzağa düşmez. Alışkanlık edin: “yok mu?” sorularında NOT EXISTS.
-- Departmanı olmayan çalışan (dept_id NULL) yüzünden boş sonuç:
SELECT name FROM departments
WHERE dept_id NOT IN (SELECT dept_id FROM employees);
-- Doğrusu
SELECT name FROM departments d
WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.dept_id = d.dept_id);

ANY / SOME ve ALL

Bir değeri alt sorgunun döndürdüğü listeyle karşılaştırır. Oracle sertifika sınavında sık sorulur.

İfadeAnlamıEşdeğeri
x > ALL (liste)listedeki her değerden büyükx > MAX(liste)
x > ANY (liste)en az birinden büyükx > MIN(liste)
x < ALL (liste)hepsinden küçükx < MIN(liste)
x = ANY (liste)listede varx IN (liste)
x <> ALL (liste)listede yokx NOT IN (liste)
SELECT name, price
FROM products
WHERE price > ALL (SELECT price FROM products WHERE category = 'Kitap')
  AND category = 'Giyim'
ORDER BY price;
Boş listex > ALL (boş) her zaman doğrudur, x > ANY (boş) her zaman yanlıştır. MAX/MIN eşdeğerinde boş liste NULL verir; bu ince farka dikkat.
Alıştırmalara geç (7)