- Katılım
- 7 Nis 2025
- Konular
- 367
- Mesajlar
- 780
- Çözümler
- 1
- Tepkime puanı
- 121
- Puan
- 93
- Konum
- İstanbul
- Web sitesi
- forumagel.com
Temel
Alt Sorgular (Subqueries)
Alt sorgu (nested query veya inner query olarak da adlandırılır), başka bir SQL sorgusunun içine yerleştirilmiş bir
[/icode] içine alınır.
Alt sorgular farklı yerlerde kullanılabilir:
Bu en yaygın kullanım alanıdır. Alt sorgu, ana sorgudaki
Örnek: Fiyatı ortalama ürün fiyatından yüksek olan ürünleri listeleme.Önce ortalama fiyatı bulmamız gerekir, sonra bu değeri ana sorguda kullanırız.
Alt sorgu
2. FROM Yan Tümcesinde Alt Sorgular (Derived Tables)
Alt sorgunun sonuç kümesi, sanki geçici bir tabloymuş gibi ana sorgunun
Örnek: Her kategorideki en pahalı ürünü bulma.Önce her ürünün kendi kategorisindeki en yüksek fiyatla karşılaştırılacağı bir yol bulmalıyız.
Burada
3. Correlated Subqueries (İlişkili Alt Sorgular)
Normal alt sorgulardan farklı olarak, ilişkili alt sorgular ana sorgudan gelen verilere bağlıdır. Yani, içteki alt sorgu her dış satır için bir kez çalışır. Genellikle
Örnek: Fiyatı kendi kategorisindeki ortalama fiyattan yüksek olan ürünleri listeleme. (Basit ortalama örneğinden farklı olarak, bu her kategori için ayrı ayrı ortalamayı hesaplar).
Burada içteki alt sorgu
Common Table Expressions (CTEs)
Common Table Expression (CTE), tek bir sorgunun yürütülmesi süresince var olan geçici bir adlandırılmış sonuç kümesidir. Sorguları daha okunabilir, bakımı daha kolay hale getirmek ve karmaşık mantığı daha küçük, yönetilebilir parçalara bölmek için kullanılırlar. CTE'ler
CTEs'ler özellikle şu durumlarda faydalıdır:
Burada
Alt sorgular ve CTE'ler, SQL'in gücünü tam olarak kullanmanızı sağlayan önemli araçlardır. Başlangıçta biraz kafa karıştırıcı görünebilirler, ancak pratik yaptıkça sorgularınızı daha etkili ve zarif bir şekilde yazmanıza yardımcı olurlar.
Bu bölümde ileri SQL sorgulama tekniklerinden alt sorgular ve CTE'lere değindik. Veritabanı performansını anlamak ve sorgularınızı optimize etmek de bu işin önemli bir parçasıdır.
Bir sonraki bölümde, yazdığınız SQL sorgularının veritabanı tarafından nasıl işlendiğini anlamanıza yardımcı olan sorgu yürütme planları (execution plans) konusuna giriş yapabiliriz.
SELECT
, WHERE
, JOIN
ve GROUP BY
komutları çoğu sorgulama ihtiyacınızı karşılayabilir. Ancak bazen, daha karmaşık mantık gerektiren veya bir sorgunun sonucunu başka bir sorguda kullanmanız gereken durumlarla karşılaşırsınız. İşte bu noktada Alt Sorgular (Subqueries) ve Common Table Expressions (CTEs) gibi ileri seviye SQL teknikleri devreye girer.Alt Sorgular (Subqueries)
Alt sorgu (nested query veya inner query olarak da adlandırılır), başka bir SQL sorgusunun içine yerleştirilmiş bir
SELECT
sorgusudur. Alt sorgular, ana sorgunun koşulları için veri sağlamak üzere kullanılır. Alt sorgular parantez
Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
Alt sorgular farklı yerlerde kullanılabilir:
WHERE
yan tümcesinde bir koşul için.FROM
yan tümcesinde sanal bir tablo gibi.SELECT
yan tümcesinde tek bir değer döndürmek için (Scalar Subquery).
Bu en yaygın kullanım alanıdır. Alt sorgu, ana sorgudaki
WHERE
koşulunu belirlemek için bir değer veya bir değer listesi döndürür.Örnek: Fiyatı ortalama ürün fiyatından yüksek olan ürünleri listeleme.Önce ortalama fiyatı bulmamız gerekir, sonra bu değeri ana sorguda kullanırız.
Kod:
SELECT UrunAd, FiyatFROM UrunlerWHERE Fiyat > (SELECT AVG(Fiyat) FROM Urunler); -- Alt sorgu burada
Alt sorgu
(SELECT AVG(Fiyat) FROM Urunler)
tek bir değer (ortalama fiyat) döndürür ve bu değer ana sorgunun WHERE
koşulunda kullanılır.2. FROM Yan Tümcesinde Alt Sorgular (Derived Tables)
Alt sorgunun sonuç kümesi, sanki geçici bir tabloymuş gibi ana sorgunun
FROM
yan tümcesinde kullanılır. Bu tür alt sorgulara Türetilmiş Tablolar (Derived Tables) denir ve genellikle bir takma ad (alias) verilmesi gerekir.Örnek: Her kategorideki en pahalı ürünü bulma.Önce her ürünün kendi kategorisindeki en yüksek fiyatla karşılaştırılacağı bir yol bulmalıyız.
Kod:
SELECT u.UrunAd, u.Fiyat, u.KategoriFROM Urunler uINNER JOIN (SELECT Kategori, MAX(Fiyat) AS MaksFiyatFROM UrunlerGROUP BY Kategori) AS KategoriEnPahali ON u.Kategori = KategoriEnPahali.Kategori AND u.Fiyat = KategoriEnPahali.MaksFiyat;
Burada
(SELECT Kategori, MAX(Fiyat) AS MaksFiyat FROM Urunler GROUP BY Kategori) AS KategoriEnPahali
kısmı bir türetilmiş tablodur. Her kategori için en yüksek fiyatı hesaplar ve bu sonuç, ana sorgu ile JOIN
yapmak için kullanılır.3. Correlated Subqueries (İlişkili Alt Sorgular)
Normal alt sorgulardan farklı olarak, ilişkili alt sorgular ana sorgudan gelen verilere bağlıdır. Yani, içteki alt sorgu her dış satır için bir kez çalışır. Genellikle
WHERE
veya SELECT
yan tümcelerinde kullanılırlar ve ana sorgudan bir sütuna referans verirler. Performans açısından bazen dikkatli kullanılmaları gerekir.Örnek: Fiyatı kendi kategorisindeki ortalama fiyattan yüksek olan ürünleri listeleme. (Basit ortalama örneğinden farklı olarak, bu her kategori için ayrı ayrı ortalamayı hesaplar).
Kod:
SELECT UrunAd, Fiyat, KategoriFROM Urunler u1WHERE Fiyat > (SELECT AVG(Fiyat) FROM Urunler u2 WHERE u2.Kategori = u1.Kategori);
Burada içteki alt sorgu
(SELECT AVG(Fiyat) FROM Urunler u2 WHERE u2.Kategori = u1.Kategori)
, dış sorgudaki u1
takma adıyla temsil edilen her ürünün kategorisine göre ortalama fiyatı hesaplar.Common Table Expressions (CTEs)
Common Table Expression (CTE), tek bir sorgunun yürütülmesi süresince var olan geçici bir adlandırılmış sonuç kümesidir. Sorguları daha okunabilir, bakımı daha kolay hale getirmek ve karmaşık mantığı daha küçük, yönetilebilir parçalara bölmek için kullanılırlar. CTE'ler
WITH
anahtar kelimesi ile tanımlanır.CTEs'ler özellikle şu durumlarda faydalıdır:
- Karmaşık sorguları basitleştirme.
- Türetilmiş tablolara (FROM yan tümcesindeki alt sorgular) daha okunabilir bir alternatif sunma.
- Tekrarlayan alt sorguları ortadan kaldırma.
- Özyinelemeli (recursive) sorgular yazma.
Kod:
WITH KategoriMaksFiyat AS (SELECT Kategori, MAX(Fiyat) AS MaksFiyatFROM UrunlerGROUP BY Kategori)SELECT u.UrunAd, u.Fiyat, u.KategoriFROM Urunler uINNER JOIN KategoriMaksFiyat k ON u.Kategori = k.Kategori AND u.Fiyat = k.MaksFiyat;
Burada
KategoriMaksFiyat
adında bir CTE tanımladık. Bu CTE, her kategori için maksimum fiyatı hesaplayan sorgunun sonucunu tutar. Daha sonra ana sorguda bu CTE'yi sanki normal bir tabloymuş gibi kullandık. Bu yapı, sorguyu okuyan kişi için neyin hesaplandığını ve nerede kullanıldığını anlamayı kolaylaştırır.Alt sorgular ve CTE'ler, SQL'in gücünü tam olarak kullanmanızı sağlayan önemli araçlardır. Başlangıçta biraz kafa karıştırıcı görünebilirler, ancak pratik yaptıkça sorgularınızı daha etkili ve zarif bir şekilde yazmanıza yardımcı olurlar.
Bu bölümde ileri SQL sorgulama tekniklerinden alt sorgular ve CTE'lere değindik. Veritabanı performansını anlamak ve sorgularınızı optimize etmek de bu işin önemli bir parçasıdır.
Bir sonraki bölümde, yazdığınız SQL sorgularının veritabanı tarafından nasıl işlendiğini anlamanıza yardımcı olan sorgu yürütme planları (execution plans) konusuna giriş yapabiliriz.