İlişkisel veritabanı yönetim sistemlerinde karmaşık veri kümeleri üzerinde çalışırken, tek bir basit filtreleme veya birleştirme işlemi her zaman ihtiyacı karşılamaz. Birden fazla adımda hesaplanması gereken ya da başka bir tablodaki dinamik bir koşula bağlı olan verileri çekmek için iç içe sorgular oluşturulur. Bu mimarinin temel yapı taşı SQL subquery, yani alt sorgu kavramıdır.
Alt sorgular, bir ana sorgunun ihtiyaç duyduğu veriyi anlık olarak üretip ana sorguya teslim eden mekanizmalardır. Bu sayede veritabanı istemcisi tarafında geçici tablolar oluşturmaya gerek kalmadan doğrudan SQL motoru üzerinde katmanlı sorgulamalar yürütülebilir.
Alt Sorgu (Subquery) Nedir?
Alt sorgu; SELECT, INSERT, UPDATE veya DELETE gibi bir ana SQL ifadesinin içine parantez içinde yerleştirilmiş ikincil bir SELECT sorgusudur. Alt sorguya iç sorgu (inner query), onu çevreleyen yapıya ise ana sorgu veya dış sorgu (outer query) adı verilir.
İşleyiş kuralı basittir: SQL motoru önce iç kısımdaki alt sorguyu çalıştırır, bu sorgudan dönen sonucu alır ve ardından dış sorgudaki filtreleme ya da hesaplama işlemine dahil eder.
Alt sorguların kullanımında dikkat edilmesi gereken temel kurallar şunlardır:
- Alt sorgular daima parantez
()içerisine yazılmalıdır. - Kullanıldığı yere bağlı olarak tek bir değer (skaler), tek bir sütun veya tam bir tablo sonucu döndürebilirler.
ORDER BYifadesi, ana sorguya sıralı veri döndürmesi zorunlu olmayan alt sorgularda performans kaybına yol açabileceği için genellikle kullanılmaz.
Alt Sorgu Türleri
Döndürdükleri veri biçimine ve dış sorguyla olan ilişkilerine göre alt sorgular farklı kategorilere ayrılır.
1. Tek Satırlı (Single-Row) Alt Sorgular
Bu tür sorgular ana sorguya yalnızca tek bir satır ve tek bir sütundan oluşan skaler bir değer döndürür. Eşitlik (=), büyüktür (>), küçüktür (<) gibi standart karşılaştırma operatörleri ile birlikte kullanılırlar.
Örnek olarak, ortalama maaşın üzerinde kazanan çalışanları bulalım:
SELECT ad, soyad, maas
FROM calisanlar
WHERE maas > (
SELECT AVG(maas)
FROM calisanlar
);
Bu örnekte içteki sorgu şirket genelindeki ortalama maaşı hesaplar ve örneğin 45000 gibi tek bir sayı döndürür. Dış sorgu ise maaşı bu değerden yüksek olan personeli filtreler.
2. Çok Satırlı (Multi-Row) Alt Sorgular
Ana sorguya tek bir sütun altında birden fazla satır döndüren sorgulardır. Bu sonuçları tekil bir değermiş gibi karşılaştıramayacağımız için IN, NOT IN, ANY veya ALL gibi çoklu küme operatörleri kullanılır.
Örnek olarak, henüz hiç sipariş vermemiş müşterileri listeleyelim:
SELECT musteri_id, musteri_adi
FROM musteriler
WHERE musteri_id NOT IN (
SELECT DISTINCT musteri_id
FROM siparisler
);
İçteki sorgu, siparişler tablosundaki tüm benzersiz müşteri numaralarını bir liste olarak döndürür. Dış sorgu ise NOT IN ifadesiyle bu listenin dışında kalan müşterileri seçer.
3. İlişkili (Correlated) Alt Sorgular
Standart alt sorgulardan farklı olarak, ilişkili alt sorgular dış sorgudan bağımsız bir şekilde tek başına çalıştırılamaz. İç sorgu, dış sorgudan gelen her bir satır için ayrı ayrı tetiklenir ve dış tablodaki sütun değerlerine referans verir.
Örnek olarak, çalıştığı departmanın ortalama maaşından daha yüksek maaş alan çalışanları getirelim:
SELECT c1.ad, c1.departman_id, c1.maas
FROM calisanlar c1
WHERE c1.maas > (
SELECT AVG(c2.maas)
FROM calisanlar c2
WHERE c2.departman_id = c1.departman_id
);
Bu sorguda iç kısımdaki AVG(c2.maas) ifadesi, dış sorgunun o an işlediği satırdaki c1.departman_id değerini filtre parametresi olarak alır. Dolayısıyla her personel, kendi departmanının ortalamasıyla karşılaştırılır.
SQL Tümcelerinde Alt Sorgu Kullanımı
SQL subquery yapıları sadece filtreleme (WHERE) amacıyla sınırlandırılmamıştır. Sorgunun farklı bölümlerinde stratejik avantajlar sunarlar.
SELECT Listesinde Alt Sorgu
Her satırın yanına ek bir hesaplama getirmek amacıyla sütun alanında skaler alt sorgu kullanılabilir:
SELECT
urun_adi,
fiyat,
(SELECT AVG(fiyat) FROM urunler) AS genel_ortalama_fiyat
FROM urunler;
Bu ifade, her bir ürünün adı ve fiyatının yanına tüm tablonun ortalama fiyatını üçüncü bir sütun olarak ekler.
FROM Tümcesinde Alt Sorgu (Derived Tables)
Alt sorgular FROM tümcesinde kullanılarak geçici sanal tablolar gibi davranabilir. Bu tür yapılara türetilmiş tablo (derived table) denir ve genellikle bir takma ad (alias) verilmesi zorunludur.
SELECT departman_id, personel_sayisi
FROM (
SELECT departman_id, COUNT(*) AS personel_sayisi
FROM calisanlar
GROUP BY departman_id
) AS departman_ozet
WHERE personel_sayisi > 10;
Burada önce her departmanın personel sayısı hesaplanmış, ardından elde edilen bu geçici tablo üzerinden personel sayısı 10’dan büyük olanlar filtrelenmiştir.
Performans ve Dikkat Edilmesi Gereken Noktalar
Alt sorgular kodun okunabilirliğini artırsa da veritabanı performansı üzerinde doğrudan etkili olabilir. Özellikle büyük veri kümelerinde aşağıdaki faktörler göz önünde bulundurulmalıdır:
- İlişkili alt sorgular (Correlated Subqueries), dış sorgudaki her satır için tekrar tekrar çalıştırıldığından büyük tablolarda ciddi yavaşlamalara neden olabilir. Mümkün olduğunda
JOINyapıları tercih edilmelidir. - Bir kaydın var olup olmadığını denetlerken
COUNT(*) > 0veyaINyerineEXISTSoperatörünü alt sorgu ile kullanmak daha hızlıdır; çünküEXISTSilk eşleşmeyi bulduğu anda aramayı durdurur. - Alt sorgunun
WHEREkoşulunda başvurduğu sütunlarda indeks bulunması sorgu optimizasyonu açısından kritik öneme sahiptir.
Özet ve Sonraki Adımlar
Alt sorgular, SQL dilinde karmaşık veri analizi senaryolarını parçalara bölerek çözmenizi sağlayan güçlü bir yaklaşımdır. Tek satırlı, çok satırlı ve ilişkili alt sorgu tiplerini doğru senaryolarda kullanmak sorgu yazımını oldukça kolaylaştırır.
Bir sonraki adım olarak, alt sorguların yerine daha performanslı ve okunabilir bir alternatif sunan Ortak Tablo İfadelerini (Common Table Expressions – CTE) ve WITH yapısını inceleyerek veritabanı sorgulama becerilerinizi ileri seviyeye taşıyabilirsiniz.


Comments
No comments yet. Write the first comment.