SQL’de alt sorgular (subqueries) ve karmaşık sorgular, veriyi daha esnek bir şekilde sorgulamak ve analiz etmek için kullanılır. Alt sorgular, bir başka sorgunun içinde bulunan iç içe geçmiş sorgulardır ve özellikle filtreleme, veri manipülasyonu ve hesaplamalar için kullanılır.
Bu yazıda, alt sorguların kullanım alanlarını ve karmaşık sorgu tekniklerini anlatacağım. Bunu kimse anlatmaz demedi demeyin 🙂
1. Alt Sorgular Nedir?
Alt sorgular, SELECT, INSERT, UPDATE ve DELETE gibi SQL ifadelerinde kullanılabilen iç içe geçmiş sorgulardır. Ana sorgunun bir parçası olarak çalışırlar ve bir değeri veya veri kümesini döndürebilirler.
Alt sorgular genellikle şu şekilde kullanılır:
- WHERE koşulu içinde
- FROM ifadesinde bir sanal tablo olarak
- HAVING koşulu içinde
- SELECT içinde hesaplama yapmak için
1.1 WHERE İçinde Alt Sorgular
Bir alt sorgu, WHERE ifadesi içinde kullanılarak belirli kriterleri karşılayan verileri seçmek için kullanılabilir.
Örnek:
SELECT * FROM Musteriler
WHERE ID IN (SELECT MusteriID FROM Siparisler WHERE SiparisTarihi > '2024-01-01');
Bu sorgu, 2024-01-01 tarihinden sonra sipariş veren müşterileri getirir.
1.2 FROM İçinde Alt Sorgular (Sanal Tablolar)
Alt sorgular, FROM ifadesinde kullanılarak geçici bir sanal tablo (derived table) oluşturulabilir.
Örnek:
SELECT Sehir, OrtalamaYas FROM
(SELECT Sehir, AVG(Yas) AS OrtalamaYas FROM Musteriler GROUP BY Sehir) AS SehirBazliYas;
Bu sorgu, her şehirdeki müşterilerin ortalama yaşlarını hesaplayarak yeni bir sanal tablo oluşturur ve bu tabloyu ana sorguda kullanır.
2. JOIN ile Tabloları Birleştirme
SQL’de farklı tablolar arasında ilişki kurarak verileri birleştirmek için JOIN kullanılır.
2.1 INNER JOIN
INNER JOIN, iki tabloda eşleşen kayıtları getirir.
Örnek:
SELECT Musteriler.Ad, Siparisler.SiparisTarihi
FROM Musteriler
INNER JOIN Siparisler ON Musteriler.ID = Siparisler.MusteriID;
Bu sorgu, sadece siparişi olan müşterileri ve onların sipariş tarihlerini listeler.
2.2 LEFT JOIN
LEFT JOIN, sol (birinci) tablodaki tüm kayıtları getirir, sağ (ikinci) tabloda eşleşme yoksa NULL döndürür.
Örnek:
SELECT Musteriler.Ad, Siparisler.SiparisTarihi
FROM Musteriler
LEFT JOIN Siparisler ON Musteriler.ID = Siparisler.MusteriID;
Bu sorgu, siparişi olsun ya da olmasın tüm müşterileri getirir. Eğer müşteri hiç sipariş vermemişse SiparisTarihi
sütunu NULL olur.
2.3 RIGHT JOIN
RIGHT JOIN, sağ (ikinci) tablodaki tüm kayıtları getirir, sol (birinci) tabloda eşleşme yoksa NULL döndürür.
Örnek:
SELECT Musteriler.Ad, Siparisler.SiparisTarihi
FROM Musteriler
RIGHT JOIN Siparisler ON Musteriler.ID = Siparisler.MusteriID;
Bu sorgu, siparişi olan tüm kayıtları listeler. Eğer siparişi olmayan müşteri varsa, o müşteri sonuç kümesine dahil edilmez.
2.4 FULL OUTER JOIN
FULL OUTER JOIN, her iki tablodaki tüm kayıtları getirir. Eşleşmeyen kayıtlar için NULL döndürülür.
Örnek:
SELECT Musteriler.Ad, Siparisler.SiparisTarihi
FROM Musteriler
FULL OUTER JOIN Siparisler ON Musteriler.ID = Siparisler.MusteriID;
Bu sorgu, hem siparişi olan hem de siparişi olmayan tüm müşterileri ve tüm siparişleri listeler. Eğer bir müşteri sipariş vermemişse SiparisTarihi
NULL olur, eğer bir sipariş bir müşteriyle eşleşmiyorsa Ad
NULL olur.
2.5 CROSS JOIN
CROSS JOIN, iki tablodaki her satırın diğer tabloyla tüm kombinasyonlarını oluşturur.
Örnek:
SELECT Musteriler.Ad, Urunler.UrunAdi
FROM Musteriler
CROSS JOIN Urunler;
Bu sorgu, her müşteriyi her ürünle eşleştirerek tüm olası kombinasyonları listeler.
3. Karmaşık Sorgular
Karmaşık sorgular, birden fazla alt sorgu, JOIN, UNION, CASE ve CTE (Common Table Expressions) gibi tekniklerin kombinasyonu ile oluşturulan güçlü sorgulardır.
3.1 UNION ile Veri Kümesi Birleştirme
UNION operatörü, birden fazla sorgunun sonuçlarını tek bir sonuç kümesinde birleştirmek için kullanılır.
Örnek:
SELECT Ad, Soyad FROM Musteriler WHERE Sehir = 'Istanbul'
UNION
SELECT Ad, Soyad FROM Musteriler WHERE Sehir = 'Ankara';
Bu sorgu, İstanbul ve Ankara’da yaşayan müşterileri tek bir sonuç kümesinde birleştirir.
3.2 CASE ile Koşullu İfade Kullanımı
CASE ifadesi, bir sorgu içindeki verileri koşullara göre değiştirmek için kullanılır.
Örnek:
SELECT Ad, Soyad, Yas,
CASE
WHEN Yas < 18 THEN 'Çocuk'
WHEN Yas BETWEEN 18 AND 65 THEN 'Yetişkin'
ELSE 'Yaşlı'
END AS YasGrubu
FROM Musteriler;
Bu sorgu, müşterilerin yaşlarına göre hangi yaş grubuna ait olduğunu belirler.
Alt sorgular ve karmaşık sorgular, SQL’in gücünü artıran önemli tekniklerdir. WHERE, FROM, HAVING ve SELECT ifadelerinde alt sorgular kullanarak veri analizi yapabiliriz. Ayrıca JOIN, UNION, CASE ve CTE gibi yapılar ile sorgular daha güçlü hale getirilebilir.