SQL Alt Sorgular (Subqueries) – Detaylı Kurs Rehberi
📚 SQL Alt Sorgular (Subqueries)
Detaylı Kurs Rehberi – Sıfırdan İleri Seviyeye
SQL subquery
SQL alt sorgu
SQL correlated subquery
SQL IN subquery
SQL EXISTS
SQL scalar subquery
SQL nested query
SQL alt sorgu örnekleri
📋 İçindekiler
1 SQL Alt Sorgu Nedir?
1.1 Tanım
Alt sorgu (subquery), bir SQL sorgusu içinde çalışan başka bir SQL sorgusudur. Parantez () içinde yazılır ve ana sorgunun bir parçası olarak çalışır.
-- Temel Yapı
SELECT kolon1, kolon2
FROM tablo
WHERE kolon = (SELECT kolon FROM tablo2 WHERE kosul);
1.2 Neden Kullanılır?
| Amaç | Açıklama |
|---|---|
| Dinamik filtreleme | Değişken koşullara göre veri çekme |
| Karşılaştırma | Bir tablodaki değeri başka tabloyla karşılaştırma |
| Hesaplama | Ortalama, maksimum gibi değerleri dinamik hesaplama |
| Veri doğrulama | Varlık kontrolü (EXISTS) |
2 Alt Sorgu Türleri
2.1 Sonuç Türüne Göre Sınıflandırma
┌─────────────────────────────────────────────────────────┐
│ ALT SORGU TÜRLERİ │
├─────────────────────────────────────────────────────────┤
│ 1. Scalar Subquery → Tek satır, tek kolon (1 değer) │
│ 2. Single-Row Subquery→ Tek satır, birden fazla kolon │
│ 3. Multi-Row Subquery → Birden fazla satır, tek kolon │
│ 4. Multi-Column Subquery→ Birden fazla satır ve kolon │
│ 5. Correlated Subquery→ Ana sorguyla bağlantılı çalışan│
│ 6. Nested Subquery → İç içe geçmiş alt sorgular │
└─────────────────────────────────────────────────────────┘
2.2 Yerleşimine Göre Sınıflandırma
| Konum | Kullanım Alanı | Örnek Operatörler |
|---|---|---|
| WHERE | Filtreleme | =, >, <, IN, EXISTS, ANY, ALL |
| FROM | Sanal tablo oluşturma | Tablo alias ile |
| SELECT | Kolon değeri olarak | Scalar subquery |
| HAVING | Grup filtresi | Agregat karşılaştırması |
3 Scalar Subquery (Tek Değerli Alt Sorgu)
ℹ️
Tanım: Yalnızca tek bir satır ve tek bir kolon döndüren alt sorgudur.
3.1 Örnek: Ortalama Maaştan Yüksek Çalışanlar
-- Çalışanlar tablosu oluştur
CREATE TABLE calisanlar (
id INT PRIMARY KEY,
ad VARCHAR(50),
departman VARCHAR(50),
maas DECIMAL(10,2)
);
-- Ortalama maaştan yüksek kazananları bul
SELECT ad, departman, maas
FROM calisanlar
WHERE maas > (SELECT AVG(maas) FROM calisanlar);
💡
Çalışma Mantığı:
1. İç sorgu çalışır →
2. Dış sorgu çalışır →
1. İç sorgu çalışır →
AVG(maas) hesaplanır (örn: 5000)2. Dış sorgu çalışır →
WHERE maas > 5000 filtresi uygulanır
3.2 Örnek: SELECT İçinde Kullanım
SELECT
ad,
maas,
(SELECT AVG(maas) FROM calisanlar) AS ortalama_maas,
maas - (SELECT AVG(maas) FROM calisanlar) AS fark
FROM calisanlar;
⚠️
Önemli: Scalar subquery mutlaka tek değer döndürmelidir. Aksi halde "Subquery returns more than 1 row" hatası alınır.
4 Multi-Row Subquery (Çok Satırlı Alt Sorgu)
4.1 IN Operatörü ile Kullanım
-- "Satış" departmanındaki çalışanların proje ID'lerini bul
SELECT proje_adi, calisan_id
FROM projeler
WHERE calisan_id IN (
SELECT id
FROM calisanlar
WHERE departman = 'Satış'
);
4.2 NOT IN ile Kullanım
-- Hiç proje olmayan çalışanları bul
SELECT ad, departman
FROM calisanlar
WHERE id NOT IN (
SELECT calisan_id
FROM projeler
WHERE calisan_id IS NOT NULL
);
🚨
Dikkat:
NOT IN içinde NULL değer varsa sonuç boş dönebilir. Mutlaka IS NOT NULL kontrolü ekleyin veya NOT EXISTS kullanın.
5 Correlated Subquery (Bağımlı Alt Sorgu)
ℹ️
Tanım: Ana sorgunun her satırı için ayrı ayrı çalışan alt sorgudur. Ana sorgudaki değere bağlıdır.
5.1 Örnek: Departman Ortalamasından Yüksek Maaş
SELECT c1.ad, c1.departman, c1.maas
FROM calisanlar c1
WHERE c1.maas > (
SELECT AVG(c2.maas)
FROM calisanlar c2
WHERE c2.departman = c1.departman -- ← Ana sorguyla bağlantı!
);
5.2 Çalışma Mantığı
| Adım | İşlem |
|---|---|
| 1 | Ana sorgu ilk satırı alır (Ahmet, Satış, 6000) |
| 2 | Alt sorgu çalışır: Satış departmanı ortalaması = 5500 |

Yorumlar
Yorum Gönder