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 NULL
WHERE 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.
| İfade | Anlamı | Eşdeğeri |
|---|---|---|
x > ALL (liste) | listedeki her değerden büyük | x > MAX(liste) |
x > ANY (liste) | en az birinden büyük | x > MIN(liste) |
x < ALL (liste) | hepsinden küçük | x < MIN(liste) |
x = ANY (liste) | listede var | x IN (liste) |
x <> ALL (liste) | listede yok | x 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ş liste
x > 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.