Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

SQL Alt Sorgu Nasıl Yazılır? WHERE ve SELECT İçinde Kullanım

sql-alt-sorgu-nasil-yazilir-where-ve-select-icinde-kullanim
Bu yazıda neler var?
  1. Alt Sorgu Nedir, Nasıl Yazılır?
  2. Kaç Satır Kaç Sütun Döner? Karar Tablosu
  3. SELECT İçinde Alt Sorgu Kullanımı
  4. WHERE İçinde Tek Değer Karşılaştırma
  5. IN ve EXISTS ile Çok Satırlı Alt Sorgular
  6. Korelasyonlu Alt Sorguya Giriş
  7. Gereksiz İç İçe Sorgudan Kaçınma ve SSS

Bir SQL alt sorgu, başka bir sorgunun içine parantez içinde yazılan ve ona bir veya birden fazla değer sağlayan bağımsız bir SELECT ifadesidir. Alt sorgu yazmak için ana sorgunun ihtiyaç duyduğu yere (SELECT, FROM, WHERE) parantez açıp içine tam bir sorgu yazılır; kullanılacak operatör (=, IN, EXISTS) alt sorgunun kaç satır ve kaç sütun döndürdüğüne göre seçilir. Bu makalede alt sorguların SELECT ve WHERE içindeki kullanımını, satır/sütun sayısına göre doğru operatör seçimini ve korelasyonlu alt sorgu mantığını örneklerle ele alıyoruz.

Alt Sorgu Nedir, Nasıl Yazılır?

Alt sorgu (subquery), bir SQL ifadesinin içine gömülen ve o ifadeye veri sağlayan başka bir SELECT sorgusudur. Mantık basittir: bazen bir koşulu yazmak için önce başka bir sorgudan sonuç almanız gerekir. Örneğin "ortalamanın üzerinde maaş alan çalışanları getir" dediğinizde, önce ortalama maaşı hesaplamanız, sonra bu değeri ana sorguda karşılaştırma olarak kullanmanız gerekir. İşte bu iki adımı tek sorguda birleştiren yapı alt sorgudur.

Yazım olarak alt sorgu her zaman parantez içine alınır ve ana sorgunun bir parçası gibi davranır:

SELECT ad, maas
FROM calisanlar
WHERE maas > (SELECT AVG(maas) FROM calisanlar);

Buradaki (SELECT AVG(maas) FROM calisanlar) ifadesi önce çalışır, tek bir sayı üretir ve ana sorgu bu sayıyı WHERE koşulunda kullanır. Alt sorgu SELECT içinde, FROM içinde veya WHERE içinde yer alabilir; ancak hangi operatörü kullanacağınız alt sorgunun ürettiği sonucun şekline bağlıdır. Bu yüzden alt sorgu yazmadan önce "bu sorgu bana tek bir değer mi, bir liste mi, yoksa tam bir tablo mu verecek?" sorusunu sormak, doğru operatör seçimini kolaylaştırır.

Kaç Satır Kaç Sütun Döner? Karar Tablosu

Alt sorgularda en sık yapılan hata, alt sorgunun döndürdüğü satır/sütun sayısıyla uyumsuz bir operatör kullanmaktır. Örneğin birden fazla satır dönen bir alt sorguyu = ile karşılaştırmaya çalışmak hataya yol açar. Aşağıdaki tablo hangi durumda hangi operatörün kullanılacağını özetler:

Alt Sorgu Sonucu Kullanılacak Operatör Örnek Kullanım
Tek satır, tek sütun (tek değer) =, >, <, >=, <= WHERE maas > (SELECT AVG(maas) ...)
Çok satır, tek sütun (liste) IN, NOT IN, ANY, ALL WHERE sehir_id IN (SELECT id FROM sehirler ...)
Satır var/yok kontrolü EXISTS, NOT EXISTS WHERE EXISTS (SELECT 1 FROM siparisler ...)
Çok sütun IN (satır karşılaştırma) veya JOIN WHERE (sehir_id, kategori_id) IN (SELECT ...)

Kısaca: alt sorgu tek bir değer üretiyorsa karşılaştırma operatörleri güvenlidir; bir liste üretiyorsa IN veya EXISTS gerekir. Bu ayrımı yapmadan operatör seçmek, "subquery returns more than one row" gibi hataların en yaygın sebebidir.

SELECT İçinde Alt Sorgu Kullanımı

Alt sorgular sadece WHERE'de değil, SELECT ifadesinin içinde de kullanılabilir. Bu durumda alt sorgu her satır için hesaplanan ek bir sütun gibi davranır ve kesinlikle tek bir değer döndürmelidir. ogrenciler ve notlar adında iki tablo düşünelim; her öğrencinin adının yanında sınıf ortalamasını göstermek istediğimizde alt sorgu şöyle yazılır:

SELECT
    o.ad,
    o.soyad,
    (SELECT AVG(n.puan) FROM notlar n) AS sinif_ortalamasi
FROM ogrenciler o;

Bu sorgu çalıştığında her öğrenci satırında aynı sınıf ortalaması tekrar eder, çünkü alt sorgu her satır için sabit bir değer üretir:

ad     | soyad   | sinif_ortalamasi
-------|---------|-----------------
Ayşe   | Yılmaz  | 72.5
Mehmet | Kaya    | 72.5
Zeynep | Demir   | 72.5

Burada dikkat edilmesi gereken nokta, alt sorgunun tek bir satır ve tek bir sütun döndürmesi zorunluluğudur. Eğer alt sorgu birden fazla satır döndürürse veritabanı hata verir, çünkü SELECT listesindeki bir sütun için tek bir değer beklenir. SELECT içindeki alt sorguyu her öğrenciye özgü hale getirmek için tabloları ilişkilendiren korelasyonlu alt sorgu gerekir; bu konuya ilerleyen bölümde değineceğiz.

WHERE İçinde Tek Değer Karşılaştırma

WHERE cümlesinde alt sorgu kullanmanın en temel hali, tek bir değer döndüren bir sorguyu =, >, < gibi operatörlerle karşılaştırmaktır. Bu yöntem özellikle "ortalamanın üstünde kalanlar" ya da "en yüksek değere sahip olan" gibi soruların cevabını ararken işe yarar.

Örneğin öğrencilerin notlarının tutulduğu bir notlar tablosunda, sınıf ortalamasının üzerinde not alan öğrencileri bulmak isteyelim:

SELECT ogrenci_id, not_puani
FROM notlar
WHERE not_puani > (SELECT AVG(not_puani) FROM notlar);

Buradaki alt sorgu (SELECT AVG(not_puani) FROM notlar) tek bir sayı döndürür, yani tek satır tek sütun. Bu yüzden > operatörüyle doğrudan karşılaştırılabilir. Eğer alt sorgu birden fazla satır döndürseydi, bu sorgu çalışma anında hata verirdi. Bu nedenle tek değer karşılaştırmalarında alt sorgunun gerçekten tek satır döndürdüğünden emin olmak gerekir; genellikle AVG, MAX, MIN, COUNT gibi agregasyon fonksiyonları bu garantiyi sağlar.

IN ve EXISTS ile Çok Satırlı Alt Sorgular

Alt sorgu birden fazla satır döndürüyorsa, = yerine IN veya EXISTS kullanılır. İkisi de benzer amaca hizmet eder ama çalışma mantıkları farklıdır.

IN, alt sorgunun döndürdüğü değer listesiyle karşılaştırma yapar. Örneğin, "Veritabanı" dersine kayıtlı öğrencilerin bilgilerini almak isteyelim:

SELECT ad, soyad
FROM ogrenciler
WHERE ogrenci_id IN (
    SELECT ogrenci_id
    FROM dersler
    WHERE ders_adi = 'Veritabanı'
);

Burada alt sorgu bir liste döndürür ve ana sorgu bu listedeki değerlerle eşleşen satırları getirir.

EXISTS ise farklı çalışır; alt sorgunun sonucuna değil, satır döndürüp döndürmediğine bakar. Aynı sorguyu EXISTS ile yazarsak:

SELECT ad, soyad
FROM ogrenciler o
WHERE EXISTS (
    SELECT 1
    FROM dersler d
    WHERE d.ogrenci_id = o.ogrenci_id
      AND d.ders_adi = 'Veritabanı'
);

Genel kural şu: alt sorgu büyük bir veri kümesinden sabit bir liste çıkarıyorsa IN daha okunaklıdır. Ancak alt sorgu ana tablonun her satırına bağlı çalışıyorsa (yukarıdaki EXISTS örneğinde olduğu gibi) ve tablolar büyükse, EXISTS genellikle daha iyi performans gösterir çünkü ilk eşleşmeyi bulduğu anda durur, tüm listeyi oluşturmaz.

Korelasyonlu Alt Sorguya Giriş

Yukarıdaki EXISTS örneğinde fark edilmesi gereken önemli bir detay var: alt sorgu içindeki d.ogrenci_id = o.ogrenci_id satırı, ana sorgudaki o tablosuna referans veriyor. Bu, alt sorgunun bağımsız çalışmadığı, ana sorgudaki her satır için yeniden değerlendirildiği anlamına gelir. Buna korelasyonlu alt sorgu denir.

Normal alt sorgular bir kez çalışıp sonucu döndürür; korelasyonlu alt sorgular ise ana sorgudaki satır sayısı kadar tekrar tekrar çalışır. Basit bir örnekle göstermek gerekirse, her öğrencinin kendi sınıf ortalamasının üstünde olup olmadığını bulmak isteyelim:

SELECT n.ogrenci_id, n.not_puani
FROM notlar n
WHERE n.not_puani > (
    SELECT AVG(n2.not_puani)
    FROM notlar n2
    WHERE n2.sinif_id = n.sinif_id
);

Burada iç sorgu, dış sorgudaki n.sinif_id değerine bağlı olarak her satır için farklı bir ortalama hesaplar. Bu yapı güçlüdür ama dikkatli kullanılmalıdır; çünkü büyük tablolarda satır sayısı kadar tekrar çalışan bir alt sorgu performansı ciddi şekilde etkileyebilir.

Gereksiz İç İçe Sorgudan Kaçınma ve SSS

Alt sorgu her zaman doğru araç değildir. Bazı durumlarda JOIN aynı sonucu daha hızlı ve daha okunabilir şekilde verir. Bir alt sorgu yazmadan önce şu üç soruyu sormak yeterli:

  1. Sonuçtan iki tablonun sütunlarına birlikte mi ihtiyacım var? Cevap evetse JOIN kullan; alt sorgu sadece bir tablodan sütun döndürür, diğer tablo yalnızca filtre amaçlı kalır.
  2. Alt sorgu her satır için tekrar tekrar çalışıyor mu (korelasyonlu)? Büyük tablolarda bu performansı ciddi şekilde düşürür. Aynı mantığı JOIN + GROUP BY ile kurabiliyorsan bu tercih edilmelidir.
  3. Sadece varlık/yokluk kontrolü mü yapıyorum? EXISTS veya IN bu iş için JOIN'den daha net okunur; gereksiz yere JOIN'e çevirip DISTINCT eklemek karmaşıklık yaratır.

Kısacası: filtre amaçlıysa alt sorgu, veri birleştirme amaçlıysa JOIN.

Sık Sorulan Sorular

Alt sorgu ile JOIN performans farkı var mı? Genelde JOIN daha hızlıdır çünkü veritabanı motoru tek seferde birleştirme yapar. Korelasyonlu alt sorgular satır sayısı arttıkça yavaşlar.

Alt sorgu içinde ORDER BY kullanılır mı? SELECT ve WHERE içindeki alt sorgularda genelde gerekmez, çünkü tek değer veya filtre listesi döner; sıralamanın bir etkisi olmaz.

Kaç seviye alt sorgu iç içe yazılabilir? Teknik olarak sınır yoktur ama üç seviyeden sonra okunabilirlik düşer, CTE (WITH) kullanmak daha sağlıklı olur.

Alt sorgular, doğru yerde kullanıldığında SQL sorgularını sadeleştiren güçlü bir araçtır. Önemli olan hangi durumda tek değer, hangi durumda liste, hangi durumda ise JOIN gerektiğini ayırt edebilmektir.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara