Yazdığın sıra ≠ çalışan sıra
Sorguyu SELECT ile başlayarak yazarız ama veritabanı onu mantıksal olarak şu sırayla işler:
- FROM (ve JOIN'ler): Hangi tablolar?
- WHERE: Satırları süz.
- GROUP BY: Grupla.
- HAVING: Grupları süz.
- SELECT: Sütunları ve ifadeleri hesapla (pencere fonksiyonları burada).
- DISTINCT: Tekrarları at.
- ORDER BY: Sırala.
- LIMIT / OFFSET: Kes.
Bu neden önemli?
- WHERE, SELECT'ten önce çalıştığı için standart SQL'de WHERE içinde SELECT takma adını kullanamazsın.
- ORDER BY, SELECT'ten sonra çalıştığı için takma adı kullanabilirsin.
- WHERE, GROUP BY'dan önce çalıştığı için içinde COUNT/SUM kullanamazsın; bu yüzden HAVING vardır.
SELECT category, AVG(price) AS ort FROM products WHERE price > 100 -- 2. adım GROUP BY category -- 3. adım HAVING AVG(price) > 500 -- 4. adım ORDER BY ort DESC -- 7. adım: takma ad burada geçerli LIMIT 3; -- 8. adım
Derinleş: mantıksal sıra bir örnekte
Aşağıdaki sorgunun veritabanında nasıl işlendiğini satır satır izle:
SELECT r.cuisine, COUNT(*) AS siparis -- 5: sütunlar FROM lk_orders o -- 1: tablolar JOIN lk_restaurants r ON r.restaurant_id = o.restaurant_id WHERE o.status = 'teslim' -- 2: satır süzme GROUP BY r.cuisine -- 3: gruplama HAVING COUNT(*) > 300 -- 4: grup süzme ORDER BY siparis DESC -- 6: sıralama LIMIT 3; -- 7: kesme
Bu sırayı bilmek, “takma adı neden WHERE'de kullanamıyorum?” ve “pencere fonksiyonu neden WHERE'de olmaz?” sorularının cevabıdır.