Veri Tabanı Yönetimi ve SQL

Alt Sorgu Subquery Yazımı ve İç İçe Sorgu Örnekleri

SQL veritabanı yönetiminde alt sorgu (subquery); ana sorgunun filtreleme veya hesaplama adımlarına temel oluşturmak üzere, parantez içinde yerleştirilen iç içe sorgu yapısıdır. Veri tabanı sorgularında dinamik koşullar kurgulamak ve karmaşık iş mantıklarını tek hamlede çözmek adına alt sorgu yazımı ve iç içe sorgu kullanımı büyük bir önem taşır.

⚡ Kısa Cevap: Alt sorgu (subquery), bir SQL sorgusunun WHERE, FROM, HAVING veya SELECT cümleciklerinde parantez içinde tanımlanan iç içe sorgudur. Dış sorguya dinamik veri aktararak iki aşamalı mantıksal sorgulamaları tek adımda çalıştırmayı sağlar.
🎯 Bu Derste Öğrenecekleriniz
  • Alt sorgu (subquery) mantığını ve sorguların arka plandaki çalışma sırasını öğreneceksiniz.
  • Tek satır (single-row) ve çok satır (multi-row) alt sorgu türlerini ayırt edebileceksiniz.
  • IN, ANY, ALL ve EXISTS gibi çoklu satır operatörlerini doğru kullanmayı kavrayacaksınız.
  • İlişkili (correlated) ve ilişkisiz alt sorgular arasındaki farkları kavrayacaksınız.
  • Gerçek hayat senaryolarına dayalı çözümlü SQL iç içe sorgu örnekleriyle pratik yapacaksınız.
📌 Kısa ve Net Bilgiler
  • Alt sorgular daima parantez () içerisinde yazılır ve genellikle içten dışa doğru çalışır.
  • Karşılaştırma operatörlerinin (=, >, <) sağ tarafında tek satır döndüren alt sorgular yer almalıdır.
  • Birden fazla değer döndüren sorgularda IN, ANY veya ALL operatörleri tercih edilmelidir.
  • İlişkili alt sorgular (correlated subquery), dış sorgunun işlediği her bir satır için yeniden çalıştırılır.

SQL Alt Sorgu (Subquery) Nedir ve Nasıl Çalışır?

Veri tabanında sorgu yürütürken aradığımız nihai sonuca ulaşmak için çoğunlukla öncül bir bilgiye ihtiyaç duyarız. Söz gelimi bir şirkette “ortalama maaşın üzerinde kazanan çalışanları” listelemek istediğimizde süreç iki adımlı bir mantığa dayanır: Şirketin ortalama maaşı kaç TL’dir ve bu tutarı aşan çalışanlar kimlerdir? İşte alt sorgular, bu tür iki aşamalı ihtiyaçları tek bir yapıda buluşturarak tam da bu noktada devreye girer.

SQL alt sorguları, mantıksal olarak iç içe geçmiş (nested) yapılardan oluşur. En dışta yer alan ifadeye dış sorgu (outer query) veya ana sorgu; parantez içinde kalan kısma ise iç sorgu (inner query) ya da alt sorgu denir. Standart bir çalışma akışında SQL motoru ilk olarak içteki sorguyu icra eder. Buradan elde edilen sonuç, dış sorgunun koşul parametresi olarak aktarılır ve nihai veri kümesi ekrana yansıtılır.

Genel söz dizimi (syntax) yapısı ise şu şekildedir:

SELECT sutun1, sutun2 FROM tablo1 WHERE sutun1 OPERATOR (SELECT sutun1 FROM tablo2 WHERE kosul);

Alt Sorgu Türleri ve Kullanım Şekilleri

Alt sorgular, ürettikleri veri tipine ve dış sorguyla kurdukları bağa göre farklı sınıflara ayrılır. Yazdığınız SQL kodlarının hatasız ve yüksek performanslı çalışabilmesi adına bu türlerin davranış biçimlerini doğru kavramak büyük önem taşır.

1. Tek Satır (Single-Row) Alt Sorgular

İç sorgu yürütüldüğünde geriye yalnızca tek bir satır ve tek bir sütun (yani ölçeksel/skaler tek bir değer) döndürüyorsa bu yapı tek satır alt sorgu olarak adlandırılır. Tek bir değer üreten bu sorgularda standart karşılaştırma operatörlerinden faydalanılır: =, >, <, >=, <=, <>.

📖 Örnek: Ortalama Üzerindeki Değerleri Bulma

Sınav notu genel ortalamanın üzerinde olan öğrencileri listeleyen sorguyu yazalım:

SELECT ogrenci_adi, notu FROM ogrenciler WHERE notu > (SELECT AVG(notu) FROM ogrenciler);

Bu senaryoda içte yer alan (SELECT AVG(notu) FROM ogrenciler) ifadesi tek bir sayısal ortalama değer (örneğin 75) üretir. Dış sorgu ise not sütunu 75’in üzerinde kalan tüm öğrencileri süzerek listeler.

2. Çok Satır (Multi-Row) Alt Sorgular

İç sorgunun geriye birden fazla satır çıkardığı senaryolardır. Bu tip sorgularda standart eşittir veya büyüktür gibi operatörler doğrudan kullanılamaz. Elde edilen çok satırlı veri kümesini işleyebilmek için özel SQL operatörlerine başvurulur:

  • IN: Alt sorgudan dönen liste içerisindeki değerlerden herhangi biriyle eşleşen satırları seçer.
  • ANY (veya SOME): Alt sorgudan dönen değerlerden en az biriyle karşılaştırma koşulunu sağlayan satırları getirir.
  • ALL: Alt sorgudan dönen değerlerin tamamıyla karşılaştırma koşulunu sağlayan satırları filtreler.
⚠️ Dikkat: Tek satır bekleyen eşittir (=) gibi bir operatör kullandığınızda alt sorgu birden fazla satır üretirse, veri tabanı motoru “Subquery returned more than 1 value” hatası fırlatır. Böyle durumlarda = yerine mutlaka IN operatörünü tercih etmelisiniz.

İlişkili (Correlated) ve İlişkisiz Alt Sorgular

Alt sorguların çalışma dinamiği, dış sorgu ile aralarında bir veri bağı bulunup bulunmamasına göre ikiye ayrılır. Bu teknik ayrım, yazılan sorgunun çalışma performansını doğrudan şekillendirir.

İlişkisiz Alt Sorgu (Uncorrelated Subquery): İç sorgunun dış sorgudan bağımsız şekilde yalnızca bir defa çalıştırıldığı modeldir. Sistem iç sorguyu bir kez icra eder, ürettiği çıktıyı dış sorguya aktarır ve işlemi bitirir. Az önce incelediğimiz ortalama not örneği, ilişkisiz bir alt sorgu yapısıdır.

İlişkili Alt Sorgu (Correlated Subquery): İç sorgunun, dış sorgudaki tablonun sütunlarına doğrudan referans verdiği ve dış sorguda işlenen her bir satır için baştan tekrar çalıştırıldığı yapıdır. Çoğunlukla departman bazlı hesaplamalarda ya da gruba özel filtrelemelerde öne çıkar. Veri tabloları arasındaki mantıksal bağların nasıl kurulduğunu incelemek isterseniz Veri Tabanı İlişkileri: Bire Bir, Bire Çok, Çoka Çok başlıklı içeriğimize göz atabilirsiniz.

📖 Örnek: İlişkili Alt Sorgu (Departman Ortalamasını Geçenler)

Çalışanların, yalnızca kendi çalıştıkları departmanın ortalama maaşını aşıp aşmadığını tespit edelim:

SELECT c.calisan_adi, c.maas, c.departman_id FROM calisanlar c WHERE c.maas > (SELECT AVG(d.maas) FROM calisanlar d WHERE d.departman_id = c.departman_id);

Bu örnekte iç sorgudaki WHERE d.departman_id = c.departman_id ifadesi, dış sorgudaki o anki satıra ait departman bilgisini okur ve ortalama tutarı o departmana özel dinamik olarak hesaplar.

💡 İpucu: İlişkili alt sorgular devasa veri kümelerinde ciddi performans kayıplarına yol açabilir. Örneğin dış sorgu 10.000 satır döndürüyorsa, iç sorgu da 10.000 kez yeniden icra edilir. Yüksek performans gerektiren senaryolarda EXISTS mantığı ya da JOIN yapıları tercih edilmelidir.

WHERE, HAVING ve SELECT Cümleciklerinde Subquery Kullanımı

Alt sorgular sadece WHERE koşul alanıyla sınırlı kalmaz; SQL komutlarının farklı ifadelerinde de esnek bir biçimde konumlandırılabilir.

SELECT Cümleciğinde Alt Sorgu

Raporlama ekranlarında her bir satırın yanına hesaplanmış skaler bir veri eklemek amacıyla kullanılır. Burada iç sorgunun tek bir hücre (tek satır, tek sütun) döndürmesi şarttır.

SELECT calisan_adi, maas, (SELECT AVG(maas) FROM calisanlar) AS genel_ortalama FROM calisanlar;

HAVING Cümleciğinde Alt Sorgu

Gruplanmış veriler üzerinde toplulaştırma (aggregation) filtreleri uygularken de alt sorgulardan etkin biçimde yararlanabilirsiniz.

SELECT departman_id, AVG(maas) FROM calisanlar GROUP BY departman_id HAVING AVG(maas) > (SELECT AVG(maas) FROM calisanlar);

SQL Alt Sorgu (Subquery) ve JOIN Karşılaştırması

Pek çok SQL geliştiricisi, hedeflenen veri kümesine ulaşırken alt sorgu mu yoksa JOIN yapısı mı seçilmesi gerektiği konusunda kararsız kalır. İki yaklaşım arasındaki belirgin farklar aşağıdaki tabloda karşılaştırılmıştır:

ÖzellikAlt Sorgu (Subquery)JOIN İşlemi
Okunabilirlikİç içe mantıksal sorgularda anlaşılması daha kolaydır.Karmaşık birleştirmelerde sorgu uzayabilir.
PerformansBüyük verisetlerinde ve ilişkili sorgularda yavaşlayabilir.Sorgu optimizasyonu daha iyidir, genelde daha hızlıdır.
Kullanım AmacıTekil değer karşılaştırma ve varlık kontrolü (EXISTS).Birden fazla tablodan sütun birleştirip getirme.
Sütun ErişimiSadece dış sorgunun tablolarındaki sütunlar seçilebilir.Birleştirilen tüm tabloların sütunlarına erişilebilir.

Çözümlü İç İçe Sorgu Örnekleri ve Senaryoları

Öğrenilen teorik bilgileri pekiştirmek adına, gerçek hayat senaryolarından derlenen çözümlü SQL alıştırmalarını inceleyelim.

📖 Senaryo 1: Hiç Sipariş Vermeyen Müşterileri Bulma (NOT IN)

Problem: Sistemde kayıtlı olan ancak bugüne kadar hiç sipariş oluşturmamış müşterilerin adını listeleyin.

Çözüm:

SELECT musteri_adi FROM musteriler WHERE musteri_id NOT IN (SELECT DISTINCT musteri_id FROM siparisler);

Açıklama: İç sorgu siparişler tablosundaki benzersiz müşteri ID’lerini listeler. Dış sorgu ise bu listede bulunmayan müşterileri süzerek getirir. Dilerseniz SQL Subquery (Alt Sorgu) Kullanımı ve Örnekleri rehberimizden ek örneklere de ulaşabilirsiniz.

📖 Senaryo 2: EXISTS Operatörü ile Varlık Kontrolü

Problem: Fiyatı 500 TL’den büyük en az bir ürünü sipariş etmiş olan müşterileri bulun.

Çözüm:

SELECT m.musteri_adi FROM musteriler m WHERE EXISTS (SELECT 1 FROM siparisler s INNER JOIN urunler u ON s.urun_id = u.urun_id WHERE s.musteri_id = m.musteri_id AND u.fiyat > 500);

Açıklama: EXISTS yapısı, alt sorgunun sonucunda bir verinin var olup olmadığını sorgular. Eşleşen ilk satırı gördüğü anda TRUE değer döndürerek aramayı sonlandırır ve bu sayede ciddi bir performans avantajı sağlar.

📖 Senaryo 3: En Yüksek İkinci Maaşı Alma (İç İçe Sorgu)

Problem: Şirketteki en yüksek ikinci maaşı alan çalışanın bilgilerini getirin.

Çözüm:

SELECT MAX(maas) FROM calisanlar WHERE maas < (SELECT MAX(maas) FROM calisanlar); Büyük veri kümelerinde bu tür sorguların hızını artırmak adına SQL Index (Dizin) Nedir? Ne İşe Yarar? başlıklı rehberimizden yararlanabilirsiniz.

Açıklama: İç sorgu tablodaki en yüksek maaşı hesaplar (örneğin 50.000 TL). Dış sorgu ise maaşı 50.000 TL’nin altında kalan çalışanlar arasındaki en büyük değeri getirerek ikinci en yüksek maaşı verir.

Alt Sorgularda Performans ve İpuçları

Alt sorgular hazırlanırken gözden kaçan küçük detaylar, sunucu üzerinde ciddi iş yükü yaratabilir. Yazdığınız SQL kodlarını optimize etmek için şu kritik noktalara dikkat etmelisiniz:

  • NULL Değer Riskleri: NOT IN ifadesiyle çalışırken alt sorgu kümesinde NULL bir değer varsa, dış sorgu tamamen boş bir sonuç döndürebilir. Bu mantıksal hatanın önüne geçmek için alt sorgunuza WHERE sutun IS NOT NULL şartını eklemeli veya alternatif olarak NOT EXISTS yapısını kullanmalısınız.
  • Gereksiz Alt Sorgu Kullanımı: Yalın biçimde iki tabloyu birleştirmek için alt sorgu yazmak yerine, indeks destekli JOIN işlemlerini tercih edin.
  • EXISTS ve IN Karşılaştırması: Alt sorgunun tarayacağı veri kümesi genişledikçe EXISTS yapısı, IN operatörüne kıyasla belirgin şekilde daha hızlı sonuç üretir.
✏️ Kendinizi Test Edin
  1. Bir alt sorgunun dış sorguya birden fazla satır döndürmesi durumunda hangi karşılaştırma operatörü kullanılamaz? (A: IN, B: =, C: ANY, D: ALL)
  2. İlişkili (correlated) alt sorgunun temel çalışma özelliği nedir?
  3. Bir e-ticaret veritabanında satışı hiç yapılmayan ürünleri bulmak için hangi subquery desenini kullanırsınız?
  4. EXISTS ve IN operatörleri arasındaki performans farkı hangi durumda ortaya çıkar?
📝 Konu Özeti
  • SQL Alt Sorgu (Subquery), parantez içinde yazılan ve dış sorguya dinamik veri sağlayan iç sorgulardır.
  • Tek satır alt sorgularında matematiksel operatörler (=, >, <); çok satırlı alt sorgularda ise IN, ANY, ALL kullanılır.
  • İlişkili alt sorgular, dış sorgunun her satırı için tekrar çalıştırıldığından performans takibi gerektirir.
  • Veri varlığı kontrollerinde EXISTS mantığı bellek dostu bir seçenektir.
  • Karmaşık veri analizi ve dinamik filtreleme gereksinimlerinde iç içe sorgular en büyük yardımcınızdır.

Öğrendiklerinizi Pekiştirin ve Uygulayın

Alt sorgu mantığına tam anlamıyla hakim olmanın en kestirme yolu, farklı veri senaryoları üzerinde pratik yapmaktır. Bilgisayarınızda yerel bir SQL Server, MySQL veya PostgreSQL veri tabanı kurarak yukarıdaki alıştırmaları kendi oluşturacağınız tablolar üzerinde deneyebilirsiniz. Bir sonraki adımda CTE (Common Table Expressions) ve Window Functions konularını inceleyerek SQL yetkinliklerinizi bir üst seviyeye çıkarabilirsiniz.

Sıkça Sorulan Sorular

❓ SQL'de Subquery (Alt Sorgu) nedir?
Alt sorgu (subquery), bir SQL sorgusunun WHERE, SELECT, HAVING veya FROM cümleciklerinin içinde parantez arasında yazılan ve dış sorguya dinamik veri sağlayan iç sorgudur.
❓ Alt sorgular kaç seviyeye kadar iç içe yazılabilir?
SQL standartlarında ve veritabanı yönetim sistemlerinde (SQL Server, Oracle vb.) 32 seviyeye kadar iç içe alt sorgu yazılabilir; ancak okunabilirlik ve performans açısından 2-3 seviyeden fazlası önerilmez.
❓ Subquery ile JOIN arasındaki fark nedir?
JOIN işlemleri iki veya daha fazla tabloyu birleştirerek tüm tabloların sütunlarına erişim sağlarken, alt sorgular filtreleme veya değer hesaplama amacıyla kullanılır ve genellikle sadece dış sorgudaki tablonun sütunlarını döndürür.
❓ Correlated (İlişkili) subquery nedir?
İlişkili alt sorgu, iç sorgunun dış sorgudaki bir tablo sütununa referans verdiği sorgu türüdür. Dış sorgudaki her bir satır için iç sorgu baştan tekrar çalıştırılır.
❓ IN ve EXISTS arasındaki fark nedir?
IN operatörü alt sorgudaki tüm verileri belleğe yükleyip karşılaştırma yaparken, EXISTS sadece eşleşen ilk kaydın varlığını kontrol eder ve bulduğu an aramayı keser. Bu nedenle büyük verisetlerinde EXISTS daha hızlıdır.
❓ Alt sorgu yazarken 'Subquery returned more than 1 value' hatası neden alınır?
Bu hata, tek satır dönmesi beklenen bir karşılaştırma operatörünün (örneğin '=') yanında kullanılan alt sorgunun birden fazla satır veya değer döndürmesi durumunda ortaya çıkar. Eşittir yerine 'IN' kullanılmalıdır.
❓ Alt sorgularda NULL değerler ne tür sorunlara yol açar?
NOT IN yapısı kullanılırken alt sorgudan dönen sonuç kümesinde tek bir NULL değer bile bulunsa, tüm NOT IN koşulu bilinmeyen (UNKNOWN) durumuna düşer ve sorgu hiçbir satır döndürmez.
❓ Alt sorgular performansı olumsuz etkiler mi?
İlişkisiz (uncorrelated) alt sorgular bir kez çalıştığı için performans sorunu yaratmaz. Ancak ilişkili (correlated) alt sorgular büyük tablolarda satır sayısı kadar çalışacağı için sorguyu yavaşlatabilir.
📚 Kaynaklar
  • Milli Eğitim Bakanlığı (MEB) — Bilişim Teknolojileri Alanı Veri Tabanı Yönetimi ve SQL Eğitim Müfredatı
  • TÜBİTAK BİLGEM — Yazılım Geliştirme ve İlişkisel Veri Tabanı Standartları Rehberi

Deniz Karay

DersMerkezi.net.tr’nin yazarı, eğitim alanında yıllara dayanan deneyime sahip bir uzmandır ve öğrencilerin öğrenme sürecini desteklemeyi hedefler. Matematik, fen bilimleri, tarih, dil ve edebiyat başta olmak üzere birçok ders alanında içerik üretir ve konuları sade, anlaşılır ve adım adım rehberler halinde sunar.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu