Veritabanı yönetiminde ve büyük veri analizlerinde ihtiyaç duyduğumuz sonuçları elde etmek için tek ve basit bir SQL SELECT sorgusu çoğu zaman yeterli olmaz. Daha önceki içeriklerimizde verileri filtrelemeyi (WHERE), gruplandırmayı (GROUP BY) ve tabloları birleştirmeyi (JOIN) öğrenmiştik. Ancak bazen bir sorunun yanıtını alabilmek için, arka planda önce başka bir soruyu veritabanına yöneltmeniz gerekir. İşte SQL’de “sorgu içinde sorgu” yazmamıza olanak tanıyan, esnek ve dinamik filtreleme yapmamızı sağlayan bu güçlü yapıya Alt Sorgular (Subqueries) denir.
Alt Sorgu (Subquery) Nedir?
Alt sorgu (İç sorgu veya Nested Query), genellikle daha büyük bir ana SQL sorgusunun (Dış sorgu – Outer Query) içine yerleştirilmiş bağımsız bir sorgudur. Temel amacı, dış sorgunun üzerinde işlem yapacağı, filtreleyeceği veya kullanacağı veriyi arka planda geçici olarak üretmektir.
Alt sorgular SQL’de yalnızca SELECT ile veri okurken değil; INSERT, UPDATE ve DELETE gibi veri işleme (DML) komutlarında da son derece aktif bir biçimde kullanılır. Bununla birlikte =, <, >, >=, <=, IN, BETWEEN, EXISTS, ANY, ALL gibi farklı operatörlerle kusursuz bir uyum içinde çalışırlar.
Alt Sorgu Yazım Kuralları
Başarılı bir alt sorgu yazmak için sistemin uyduğu bazı katı kurallar şunlardır:
- Parantez Kullanımı: Alt sorgular daima parantez
()içerisine alınmalıdır. - Sütun Kısıtlaması: Çoğu temel kullanımda, alt sorgunun
SELECTbloğunda yalnızca tek bir sütun bulunmalıdır (özel satır testleri veyaEXISTSoperatörü hariç). Dış sorgunun bu değeri doğru bir biçimde kıyaslayabilmesi için bu kural kritiktir. - ORDER BY Kısıtlaması: Alt sorgu içerisinde genellikle
ORDER BYtümcesi kullanılamaz; sıralama işlemi en son aşamada dış (ana) sorguya bırakılmalıdır.
Çıktılarına Göre Alt Sorgu Türleri
Alt sorgular, döndürdükleri veri boyutuna (satır/sütun hacmi) göre dört kategoriye ayrılır:
- Skaler Alt Sorgular (Scalar Subqueries): Sadece tek bir satır ve tek bir sütun döndüren alt sorgulardır (Yani tek bir değer). Örneğin, “Şirketteki en yüksek maaşı bulan” bir alt sorgu skalerdir ve matematiksel büyüktür/küçüktür (
> , <) gibi operatörlerle eşleşebilir. - Satır Alt Sorguları (Row Subqueries): Tek bir satır, ancak birden fazla sütun değeri döndürürler.
- Sütun Alt Sorguları (Column Subqueries): Tek bir sütun, ancak birden fazla satır (yani bir veri listesi) döndürürler.
INveANYgibi küme operatörleri ile birlikte çalışırlar. - Tablo Alt Sorguları (Table Subqueries): Birden fazla satır ve sütun barındıran tam teşekküllü bir tablo sonucu döndürürler. Çoğu zaman
FROMtümcesinin içinde kullanılarak sanal bir tablo muamelesi görürler.
İşleyiş Mantığına Göre Alt Sorgular
1. Bağımsız (Uncorrelated) Alt Sorgular
Dış sorgudan tamamen bağımsız olarak kendi başlarına çalışabilen sorgulardır. Veritabanı motoru, böyle bir alt sorguyu baştan sona sadece bir kez çalıştırır ve elde ettiği o sabit sonucu dış sorguya iletir. İşleyiş açısından çok daha hızlı ve basittir.
2. İlişkili (Correlated) Alt Sorgular
İlişkili alt sorgular, çalışmalarını tamamlayabilmek için dış sorgudaki tablodan bir veya daha fazla sütuna (Outer Reference) ihtiyaç duyan (referans veren) sorgulardır. Dış sorgu bağımsız bir şekilde işlenmez; aksine, ana sorgunun incelediği her bir veri satırı için alt sorgu tekrar tekrar (baştan) çalıştırılır.
Örneğin, “Her departmanda, o departmanın kendi ortalama maaşından daha yüksek kazanan kişileri” bulmak istediğimizde, alt sorgu her çalışanın departmanına bakarak ortalamayı sürekli yeniden hesaplamak zorunda kalır. Büyük veritabanlarında (Big Data) bu durum ciddi bir performans darboğazı (bottleneck) yaratabileceğinden dikkatli kullanılmaları gerekir.
Farklı SQL Komutlarında Alt Sorgu Kullanımı
- WHERE Tümcesinde: En yaygın senaryodur. Örneğin, satış hedefini geçemeyen ofisleri listelemek istediğinizde, ofislerin satış hedeflerini toplayan
SELECT SUM(TARGET)şeklinde bir alt sorguyuWHEREiçerisine yerleştirip filtreleme yapabilirsiniz. - HAVING Tümcesinde:
GROUP BYile oluşturulmuş veri kümelerini süzerken alt sorgular kullanılabilir. Örneğin, departmanlara göre toplam satışları bulup, sadece “şirket ortalamasının” üzerinde olan departmanları (Grupları) göstermek istiyorsanızHAVINGiçinde bir alt sorgu şarttır. - DML Komutlarında (INSERT, UPDATE, DELETE): Alt sorgular yalnızca veri okumak için değil, veri manipülasyonları için de mükemmeldir. Eski siparişleri “Arşiv” tablosuna taşımak için bir
INSERTişleminde alt sorgu ile eski kayıtlar çekilebilir. Veya iptal edilmiş ürünleriDELETEile kalıcı olarak veritabanından silerken, alt sorgu ile koşulları sağlayan id’ler kontrol edilebilir.UPDATEifadelerinde bir kaydın değerini sabit bir sayı yerine, alt sorgudan gelen dinamik bir değere eşitleyebilirsiniz.
EXISTS ve IN Operatörlerinin Optimizasyonu
Birden fazla değer (liste) dönen alt sorgularda en çok kullanılan iki operatör IN ve EXISTS‘tir. İkisi de benzer sonuçlar verebilse de çalışma mekanizmaları veri mühendisleri için çok farklıdır.
INoperatörü, yazdığınız alt sorgunun tamamını sonuna kadar çalıştırır, çıkan tüm sonuç kümesini (result set) belleğe yükler ve daha sonra dış sorguyu bu listeyle eşleştirerek arama yapar.EXISTSise veri varlığı (existence test) testi yapar.EXISTS, alt sorguda eşleşen ilk kaydı (satırı) bulduğu an işlemi durdurur ve belleği zorlamadan sonucu hemen dış sorguya “Doğru (True)” olarak aktarır. Bu yüzden çok büyük hacimli (milyonlarca satırlık) veritabanlarında arama yaparkenINyerineEXISTS(veyaNOT EXISTS) kullanmak performansı çok ciddi oranda artırır.
İleri Düzey SQL: CTE (Ortak Tablo İfadeleri) Kullanımı
Zaman zaman yazılan alt sorgular o kadar derine iner ki, kod tamamen okunmaz hale gelir (Spaghetti code). Performansı düşüren, bakımı zor olan ve aynı sorgunun sorgu metni içerisinde defalarca tekrarlandığı bu durumlara modern SQL dünyası CTE (Common Table Expressions) adını verdiğimiz yapılarla çözüm üretmiştir.
WITH yan tümcesi ile başlayan CTE’ler, temel olarak daha büyük bir SQL sorgusunun içerisinde sanal (geçici) bir tablo tanımlamak anlamına gelir. CTE kullanarak karmaşık alt sorgular kodun en üstüne, sade ve isimlendirilmiş bir blok olarak çıkartılır. Ana sorgu ise bu mantıksal bloğa sanki fiziksel bir tabloymuş gibi bağlanır. Alt sorguları CTE veya modern JOIN‘lerle değiştirmek (Subqueries vs. Joins), veri analizlerinde ve raporlama süreçlerinde performansın korunmasını sağlar.
Sonuç
Verilerin gücünü ortaya çıkartmak isteyen her veri bilimcisi veya yazılım geliştiricisinin alt sorgu (Subqueries) yeteneklerini geliştirmesi zorunludur. Ancak “iyi yazılmış” bir SQL kodunun aynı zamanda “hızlı çalışan” (Optimize) bir kod olması gerektiği de unutulmamalıdır. Mümkün olan senaryolarda JOIN‘lere ve CTE’lere öncelik vermek, büyük verilerde IN yerine EXISTS yöntemini tercih etmek ve Correlated (ilişkili) sorguların donanımınızı ne kadar yorduğunu hesaba katmak, sizi SQL’de sıradan bir kullanıcı olmaktan çıkartıp ileri düzey bir veritabanı mühendisine dönüştürecektir.





