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.
- 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.
- 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,ANYveyaALLoperatö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: =, >, <, >=, <=, <>.
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.
=) 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.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.
Ç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.
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:
| Özellik | Alt Sorgu (Subquery) | JOIN İşlemi |
|---|---|---|
| Okunabilirlik | İç içe mantıksal sorgularda anlaşılması daha kolaydır. | Karmaşık birleştirmelerde sorgu uzayabilir. |
| Performans | Bü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şimi | Sadece 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.
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.
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.
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 INifadesiyle çalışırken alt sorgu kümesindeNULLbir değer varsa, dış sorgu tamamen boş bir sonuç döndürebilir. Bu mantıksal hatanın önüne geçmek için alt sorgunuzaWHERE sutun IS NOT NULLşartını eklemeli veya alternatif olarakNOT EXISTSyapı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
JOINişlemlerini tercih edin. - EXISTS ve IN Karşılaştırması: Alt sorgunun tarayacağı veri kümesi genişledikçe
EXISTSyapısı,INoperatörüne kıyasla belirgin şekilde daha hızlı sonuç üretir.
- 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) - İlişkili (correlated) alt sorgunun temel çalışma özelliği nedir?
- Bir e-ticaret veritabanında satışı hiç yapılmayan ürünleri bulmak için hangi subquery desenini kullanırsınız?
EXISTSveINoperatörleri arasındaki performans farkı hangi durumda ortaya çıkar?
- 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 iseIN,ANY,ALLkullanı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
EXISTSmantığı 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
- 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



