Sorgu içinde sorgu
Alt sorgu, parantez içindeki bir SELECT'tir. Üç yaygın yerde kullanılır.
1. Skaler alt sorgu: tek değer
-- Ortalamanın üzerindeki ürünler SELECT name, price FROM products WHERE price > (SELECT AVG(price) FROM products) ORDER BY price;
2. IN ile liste
-- Elektronik ürün almış müşteriler SELECT first_name, last_name FROM customers WHERE customer_id IN ( SELECT o.customer_id FROM orders o JOIN order_items oi ON oi.order_id = o.order_id JOIN products p ON p.product_id = oi.product_id WHERE p.category = 'Elektronik' );
3. FROM içinde: türetilmiş tablo
Önce özetle, sonra özet üzerinden sorgula:
SELECT ROUND(AVG(siparis_sayisi), 2) AS musteri_basina_ort_siparis FROM ( SELECT customer_id, COUNT(*) AS siparis_sayisi FROM orders GROUP BY customer_id ) AS t;
NOT IN ve NULLAlt sorgu tek bir NULL döndürürse
NOT IN hiç satır döndürmez (çünkü x <> NULL bilinmeyendir). NOT IN kullanırken alt sorguya WHERE ... IS NOT NULL ekle veya NOT EXISTS tercih et.Derinleş: alt sorgu nerede ne döndürmeli?
| Yer | Döndürmesi gereken | Yanlışsa |
|---|---|---|
WHERE x > (SELECT ...) | Tek değer | Birden çok satır gelirse hata |
WHERE x IN (SELECT ...) | Tek sütun, çok satır | NOT IN + NULL tuzağı |
FROM (SELECT ...) t | Tablo | Takma ad zorunlu (çoğu SQL türünde) |
SELECT (SELECT ...) | Satır başına tek değer | Büyük tablolarda yavaş olabilir |