Ana içeriğe atla

SQL'de Bağıntılı (Correlated) Alt Sorgu: Nasıl Çalışır? Örneklerle Açıklama

Bağıntılı alt sorguların SQL'de satır satır karşılaştırmaları nasıl yaptığını öğrenin. Kullanım alanlarını keşfedin ve JOIN'ler, pencere fonksiyonları veya bağıntısız sorgulardan farklarını görün.
Güncel 4 May 2026  · 9 dk. oku

İlişkisel veritabanlarında satırlar çoğu zaman birbirine bağımlıdır ve karmaşık bir soruyu yanıtlamak, sorgunun işlediği tabloya tekrar bakmasını gerektirebilir.

Bu tür tabloları sorgulamak için SQL, iç sorgunun dış sorgudaki değerlere bağlı olduğu belirli bir ilişki tanımlayan bağıntılı alt sorgular kullanmanıza olanak tanır. Standart bir alt sorgu bir kez çalışıp biterken, bağıntılı bir alt sorgu dinamiktir; ana sorgunun değerlendirdiği her bir satır için tekrar tekrar yürütülür.

Bu eğitimde, SQL'de bağıntılı bir alt sorgunun nasıl çalıştığını, performansla ilgili hususları ve JOIN'ler ile pencere fonksiyonlarına kıyasla ne zaman doğru tercih olduğunu açıklayacağım. SQL'e yeniyseniz, SQL'e Giriş kursumuzla başlayın; biraz deneyiminiz varsa Orta Düzey SQL kursunu tercih edebilirsiniz. 

Bağıntılı Alt Sorgu Nedir?

Bağıntılı alt sorgu, çalışmak için dış sorgudaki değerlere bağlı olan bir alt sorgu türüdür. 

Bir kez çalışıp sabit bir sonuç döndürmek yerine, alt sorgu dış sorgunun işlediği her satır için bir kez değerlendirilir. Bunun nedeni, iç sorgunun dış sorgudan bir sütuna atıfta bulunması ve iki sorgu arasında doğrudan bir bağ kurmasıdır.

Karşılaştırma yapmak gerekirse, bağıntısız bir alt sorgu dış sorgudan bağımsız olarak çalışır. Bir kez yürütülür, bir sonuç kümesi veya değer döndürür ve dış sorgu bu sonucu alt sorguyu her satır için yeniden çalıştırmadan kullanır.

Bağıntılı Alt Sorgu Nasıl Çalışır

SQL'de tipik bir bağıntılı alt sorgunun iş akışı şöyledir:

Bağıntılı alt sorgu nasıl çalışır. Görsel: Gemini.

  • Dış sorgu bir satır seçer: SQL dış sorgunun tablosunu taramaya başlar ve ilk satırı seçer. 
  • Atıf (referans verme): İç sorgu çoğunlukla bir takma ad (alias) kullanarak o belirli satırdan bir değer çeker.
  • Yürütme: İç sorgu bu değeri kullanarak çalışır.
  • Filtre/güncelleme: Sonuç, satırın dahil edilip edilmeyeceğine karar vermesi için dış sorguya geri iletilir.
  • Yineleme: İşlem, tablo bitene kadar bir sonraki satır için tekrar eder.

SQL'de Bağıntılı Alt Sorgu Örneği

Şimdiye kadar anlattıklarım kavramsaldı. Öğrenmenin en iyi yolu örnekler üzerinde çalışmaktır.

Örnek 1: Bölüm ortalamasının üzerinde kazanan çalışanlar

Elinizde çalışan maaşları ve bölüm kimliklerinin bulunduğu bir employees tablosu olduğunu varsayalım. Amacınız, kendi bölümlerindeki ortalama maaştan fazla kazanan çalışanları bulmaktır.

Aşağıdaki sorguyu kullanacaksınız; burada:

  • Dış sorgu employees tablosundan çalışanları seçer.

  • Alt sorgu, aynı bölüm için ortalama maaşı hesaplar.

  • e2.department_id = e.department_id koşulu, dış sorgu takma adı olan e'ye atıfta bulunur.

 -- Fetch employees earning more than the average salary in dept
SELECT 
    e.employee_id,
    e.employee_name,
    e.salary,
    e.department_id
FROM employees e
WHERE e.salary > (
    SELECT AVG(e2.salary)                 -- Calculate the average salary
    FROM employees e2
    WHERE e2.department_id = e.department_id  
    -- Correlation: references the outer query's department_id
);

Örnek 2: Bağıntılı alt sorguyla EXISTS() kullanmak

Ayrıca, bağıntılı bir alt sorguyla EXISTS() işleçini kullanarak başka bir tabloda ilişkili kayıtların var olup olmadığını kontrol edebilirsiniz.

Diyelim ki customers ve orders tablolarında kayıtlar var. En az bir sipariş vermiş müşterileri listelemek istiyorsunuz. Aşağıdaki sorguyu kullanacaksınız; burada:

  • customers tablosundaki satırları dış sorgu tarar.

  • Alt sorgu, o müşteri için en az bir sipariş olup olmadığını kontrol eder.

  • o.customer_id = c.customer_id koşulu, alt sorguyu dış sorguya bağlar.

-- Fetch customers with at least one order
SELECT 
    c.customer_id,
    c.customer_name
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id  
    -- Correlation: references the outer query customer_id
);

Yukarıdaki sorguda, SQL siparişler tablosunda eşleşen bir satır olup olmadığını kontrol eder. Varsa, EXISTS() işleci true döndürür ve müşteri sonuca dahil edilir.

Bağıntılı ve Bağıntısız Alt Sorgular

Daha önce öğrendiğimiz gibi, SQL'deki alt sorgular bağıntısız veya bağıntılı alt sorgular olarak ikiye ayrılır. Temel fark, iç sorgunun dış sorguya bağlı olup olmamasıdır.

Bağıntısız bir alt sorgu için veritabanı onu bir kez çalıştırır, ardından sonucu dış sorguda kullanır.

Örneğin, aşağıdaki sorgu genel ortalama maaştan fazla kazanan çalışanları bulur.

-- Query employees who earn more than the overall average salary
SELECT 
    employee_id,
    employee_name,
    salary
FROM employees
WHERE salary > (
    SELECT AVG(salary) 
    FROM employees
);

Yukarıdaki sorguda, alt sorgu tüm tablo için ortalama maaşı hesaplar ve tek sefer çalışır. Dış sorgu daha sonra her çalışanın maaşını bu tek değere göre karşılaştırır.

Bağıntısız alt sorgular bir kez çalıştığından, sonucu yeniden kullanılabildiğinde genellikle daha hızlıdır. Genel ortalamalar ve toplamlar gibi küresel karşılaştırmalar için en uygunudur.

Buna karşın, bağıntılı alt sorgular büyük tablolar üzerinde daha yavaş olabilir. Koşulların her bir satıra göre değerlendirilmesi gerektiğinde, örneğin bölüm düzeyinde karşılaştırmalar veya varlık kontrollerinde kullanışlı hale gelirler.

Gruplama ve veri toplamayı, ayrıca tabloları birleştirmeyi daha fazla öğrenmek için  SQL Server'a Giriş kursumuzu öneririm.

Bağıntılı Alt Sorgu vs. JOIN

Birçok bağıntılı alt sorgu, JOIN kullanılarak yeniden yazılabilir. İlişkisel veritabanlarında JOIN'ler genellikle daha iyi performans gösterir çünkü veritabanı ilişkileri satır satır yerine küme bazında işleyebilir.

Aşağıdaki, bağıntılı bir alt sorgu kullanan sorguyu ele alın. Bu sorgu, bölümünde ortalama maaşın üzerinde ücret alan çalışanları listeler

-- Use subquery to fetch employees earning more than the average salary in dept
SELECT 
    e.employee_id,
    e.employee_name,
    e.salary,
    e.department_id
FROM employees e
WHERE e.salary > (
    SELECT AVG(e2.salary)
    FROM employees e2
    WHERE e2.department_id = e.department_id
);

Aynı sonuçları üretmek için sorguyu JOIN ifadesini kullanarak yeniden yazabilirsiniz.

-- Use JOIN to fetch employees earning more than the average salary in dept
SELECT 
    e.employee_id,
    e.employee_name,
    e.salary,
    e.department_id
FROM employees e
JOIN (
    SELECT 
        department_id,
        AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
    -- Precompute the department average once per department
) dept_avg
ON e.department_id = dept_avg.department_id
-- Match employees with their department averages
WHERE e.salary > dept_avg.avg_salary;
-- Compare salary with the computed department average

Aşağıdaki tablo, SQL'de bağıntılı alt sorgular ile JOIN arasındaki farkları özetler.

Özellik

Bağıntılı Alt Sorgu

JOIN

Okunabilirlik

Mantık doğrudan WHERE koşulunda ifade edildiği için sıklıkla okumak daha kolaydır.

Türemiş tablolar veya CTE'ler gerektirebileceğinden biraz daha karmaşık olabilir.

Mantık İfadesi

Koşulları doğal biçimde ifade eder. Örneğin, “maaş bölüm ortalamasından büyük”.

Önce toplulaştırılmış değerlerin hesaplanmasını, ardından ana tabloyla birleştirilmesini gerektirir.

Yürütme Davranışı

Alt sorgu, dış sorgudaki her satır için bir kez çalışabilir.

Toplu sonuçlar genellikle bir kez hesaplanır ve yeniden kullanılır.

Performans

Tekrarlı çalışmadan ötürü büyük veri kümelerinde daha yavaş olabilir.

Genellikle büyük tablolar için daha verimlidir.

Yaygın Kullanım Alanları

EXISTS() ile ilişkili veri kontrolü, satır bazlı toplamlarla karşılaştırmalar veya satıra özel koşulların denetlenmesi.

Raporlama sorguları, toplulaştırmalar ve performans hassas iş yükleri.

SQL'de farklı JOIN türlerini ve veritabanındaki farklı ilişkili tablolarla nasıl çalışılacağını öğrenmek için şu

SQL'de Verileri Birleştirme kursumuzu öneririm.

Bağıntılı Alt Sorgu vs. Pencere Fonksiyonları

Modern SQL'de, pencere fonksiyonları olan AVG() ve OVER (PARTITION BY) gibi fonksiyonlar, tek bir taramada satır başına toplulaştırma hesaplayabilir. 

Örneğin aşağıdaki sorgu, maaşı bölümünün ortalama maaşından yüksek olan çalışanları döndürür. Alt sorgu içinde, toplulaştırmayı bir pencere fonksiyonuna dönüştürmek için OVER () ve tabloyu bölümlere ayırmak için PARTITION BY department_id kullanılır.

-- Use window function to get employees earning more than dept average salary
SELECT 
    employee_id,
    employee_name,
    salary,
    department_id
FROM (
    SELECT 
        employee_id,
        employee_name,
        salary,
        department_id,
        AVG(salary) OVER (PARTITION BY department_id) AS dept_avg_salary
        -- Window function calculates department average once per partition
    FROM employees
) t
WHERE salary > dept_avg_salary;

Bununla birlikte, tablolar arasındaki ilişkileri test etmek için EXISTS() veya NOT EXISTS() kullanmak istediğinizde bağıntılı alt sorgular hâlâ kullanışlıdır. Ayrıca pencere fonksiyonlarının bulunmadığı veritabanlarında veya durumlarda bağıntılı alt sorgular kullanabilirsiniz.

Bağıntılı Alt Sorgu Performansı

Bağıntılı alt sorgular güçlü olmakla birlikte, sıklıkla bazı performans sorunlarını beraberinde getirir. 

Bağıntılı alt sorgular tekrar tekrar çalışır

Sorgu dış sorgudaki her satır için bir kez çalıştığından, iç veriyi defalarca yeniden tarayarak büyük tablolarda sorguyu yavaşlatabilir. Dış tablonuzda 100.000 satır varsa, veritabanı 100.000 alt görev gerçekleştirir.

Darboğazlar

Doğru optimizasyon yapılmazsa, bağıntılı sorgular yüksek CPU kullanımı ve uzun bekleme sürelerine yol açabilir; özellikle iç sorgu karmaşık hesaplamalar yapıyorsa veya büyük tabloları tarıyorsa.

Sütunları indekslemek

Bağıntıda kullanılan sütunları indekslemek, veritabanının alt sorguda ilgili satırı tüm iç tabloyu her seferinde taramak yerine neredeyse anında bulmasına yardımcı olur.

Sorgu Planlayıcı optimizasyonu

Modern veritabanları çoğu zaman bağıntılı alt sorguları dahili olarak optimize eder. Sorgu planlayıcı, sorguyu bir JOIN'e veya önbelleğe alınmış bir toplulaştırmaya dönüştürerek daha verimli bir hale getirebilir ve sorgu süresini önemli ölçüde azaltabilir.

Bağıntılı Alt Sorguyu Ne Zaman Kullanmalı

Aşağıdaki durumlarda bağıntılı alt sorguları kullanabilirsiniz:

  • Satıra özgü toplamlarla filtreleme: Bir değeri her satıra göre kıyaslamanız gerektiğinde kullanın; örneğin, bölüm ortalamasının üzerinde kazanan çalışanlar.

  • EXISTS() ile ilişkili veriyi kontrol etmek: İlişkili satırların var olup olmadığını test etmek için EXISTS() ile bağıntılı alt sorgular kullanabilirsiniz.

  • Karmaşık iç içe mantığı ifade etmek: Bağıntılı alt sorgular, uzun JOIN zincirlerine kıyasla karmaşık koşulları okumayı ve ifade etmeyi kolaylaştırabilir.

Şu durumlarda ise bağıntılı alt sorgulardan kaçının:

  • Basit bir JOIN iş görüyorsa: Aynı sonucu bir LEFT JOIN veya INNER JOIN ile elde edebiliyorsanız bunu kullanın; her zaman daha hızlı olacaktır.

  • Büyük verilerle çalışırken: Bağıntılı koşul indekslenmemiş büyük tablolara başvuruyorsa, tekrarlı değerlendirmeler sorguyu ciddi biçimde yavaşlatabilir.

Bağıntılı Alt Sorgularda Yaygın Hatalar

Bağıntılı alt sorguları kullanırken karşılaşabileceğiniz yaygın sorunlardan bazıları ve nasıl giderebileceğiniz şöyledir:

  • Bağıntı koşulunu unutmak: Bağıntılı bir alt sorgu, dış sorgudan bir sütuna atıfta bulunmalıdır. Bu koşul eksikse, alt sorgu bağımsız hale gelir ve yanlış sonuçlar üretebilir.
  • Yürütme sırasını yanlış anlamak: Her zaman dış sorgunun önce, iç sorgunun sonra çalıştığını unutmayın. Bunu kafanızda tersine çevirmek hatalı sonuçlara yol açabilir.
  • Gereksiz iç içe geçirme: Bazen basit bir değeri, standart bir alt sorgunun yeterli olacağı yerde bağıntılı bir alt sorguyla sarmalayabilirsiniz. İç sorgunun çalışması için dış satıra ihtiyacı yoksa, performans için bağıntıyı kaldırın.
  • Performans etkisini göz ardı etmek: Bağıntılı alt sorgular küçük veri kümelerinde mükemmel çalışabilir, ancak tablolar büyüdükçe yavaşlayabilir. Bunu önlemek için sorgularınızı gerçekçi veri boyutlarıyla test edin ve performans sorun olursa indekslemeyi veya sorguyu yeniden yazmayı düşünün.

Sonuç

Bağıntılı alt sorguları ne zaman ve nasıl kullanacağınızı, ne zaman da diğer tekniklerle değiştireceğinizi öğrenmek; net ve verimli SQL sorguları yazmak için önemli bir beceridir.

Bir sonraki adım olarak, veri analizi için SQL kullanımındaki yetkinliğinizi göstermek ve diğer veri profesyonelleri arasından sıyrılmak için SQL Associate Sertifikasyonunu almanızı öneririm. Son olarak, veritabanları oluşturmayı ve yönetmeyi, ayrıca ihtiyaçlarınıza uygun VTYS'yi seçmeyi öğreneceğiniz Veritabanı Tasarımı kursumuzu tavsiye ederim.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Veri analitiği, iş zekâsı ve veri bilimi alanlarında pratik deneyime sahip Veri Bilimi Teknik Yazarı. SQL, Python, Power BI, Databricks ve veri mühendisliği üzerine, gerçek dünya analitik çalışmalarına dayanan, uygulamaya dönük ve sektöre odaklı içerikler yazıyorum. Yazılarım teknik derinlikle iş etkisi arasındaki köprüyü kurarak profesyonellerin veriyi güvenle karara dönüştürmelerine yardımcı olur.

SSS

Bağıntılı bir alt sorgu, sıradan bir alt sorgudan nasıl farklıdır?

Düzenli (bağıntısız) bir alt sorgu bağımsız çalışır ve genellikle bir kez yürütülür; bağıntılı bir alt sorgu ise dış sorguya bağlıdır ve her satır için tekrar tekrar yürütülebilir.

Bağıntılı alt sorgular tüm SQL veritabanlarında destekleniyor mu?

Evet. Bağıntılı alt sorgular standart SQL dilinin bir parçasıdır ve PostgreSQL, MySQL, SQL Server ve Oracle dâhil çoğu ilişkisel veritabanı sistemi tarafından desteklenir.

Bağıntı koşulunu unutursam ne olur?

Alt sorgu bağıntısız hale gelir, tüm satırlara karşı bir kez çalışır ve büyük olasılıkla hatalı sonuçlar üretir.

Bağıntılı alt sorgular her zaman JOIN'lerle değiştirilebilir mi?

Her zaman değil, ancak birçok bağıntılı alt sorgu JOIN'ler veya toplulaştırmalar kullanılarak yeniden yazılabilir. Büyük veri kümelerinde performans için genellikle JOIN'ler tercih edilir.

Konular

DataCamp ile SQL öğrenin

Kurs

Data Manipulation in SQL

4 sa
318.1K
Master the complex SQL queries necessary to answer a wide variety of data science questions and prepare robust data sets for analysis in PostgreSQL.
Ayrıntıları GörRight Arrow
Kursa Başla
Devamını GörRight Arrow
İlgili

blog

Hızlı Sevkiyat İçin Pratik Vibe Kodlama Teknoloji Yığını

Ön uç, arka uç, veritabanları, kimlik doğrulama, depolama, e-posta, test, dağıtım ve izleme için en iyi araçları keşfedin.
Abid Ali Awan's photo

Abid Ali Awan

14 dk.

blog

2026’da En Popüler 40 Yazılım Mühendisi Mülakat Sorusu

Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Dario Radečić's photo

Dario Radečić

15 dk.

Eğitim

.gitignore Nasıl Kullanılır: Örneklerle Pratik Bir Giriş

Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Kurtis Pykes 's photo

Kurtis Pykes

Eğitim

Python'da Listeyi String'e Nasıl Dönüştürürsünüz

Bu hızlı eğitimde, Python'da bir listeyi string'e nasıl dönüştüreceğinizi öğrenin.
Adel Nehme's photo

Adel Nehme

Devamını GörDevamını Gör