Takip et

Alt Sorgular ve İç İçe Sorgular: Veritabanı Uzmanlığına İlk Adım

Veritabanından karmaşık verileri çekmek, analiz etmek ve anlamlı sonuçlar çıkarmak, modern veri dünyasının olmazsa olmazıdır. Peki, tek bir sorguyla çözemeyeceğiniz kadar karmaşık bir problemle karşılaştığınızda ne yaparsınız? İşte bu noktada alt sorgular ve iç içe sorgular devreye girerek, büyük veri kümeleri üzerinde hassas ve güçlü operasyonlar yapmanıza olanak tanır. Bu makale, alt sorguların temel prensiplerinden en ileri kullanım senaryolarına kadar her şeyi kapsayacak, performans ipuçları sunacak ve pratik örneklerle bilginizi pekiştirecektir. Veri dünyasındaki yeteneklerinizi bir üst seviyeye taşımaya hazır mısınız?

Günümüz veri yoğun dünyasında, veritabanlarından elde edilen bilgilerin kalitesi ve doğruluğu, iş kararlarının temelini oluşturur. Ancak bazen ihtiyaç duyduğumuz veriyi tek bir basit SELECT deyimiyle almak mümkün olmayabilir. Örneğin, “her departmandaki en yüksek maaş alan çalışanın adını bul” gibi bir talep, standart bir sorgunun ötesine geçer. Bu tür senaryolarda, bir sorgunun sonucunu başka bir sorgunun girdisi olarak kullanmamız gerekir ki, işte tam da bu duruma alt sorgu (subquery) ya da iç içe sorgu (nested query) adını veririz. Aslında, alt sorgular, daha büyük bir sorgunun içinde yer alan ve kendi başına çalıştırılabilen bağımsız SQL ifadeleridir. Bu ifadeler, ana sorgunun işleyişine katkıda bulunarak daha karmaşık veri filtreleme, toplama ve karşılaştırma işlemleri yapmamızı sağlar. Genellikle parantez içinde yazılırlar ve ana sorgu tarafından bir değer, bir satır veya bir tablo olarak kullanılırlar.

Alt sorguların gücü, veri manipülasyonunda sundukları esneklikten gelir. Geleneksel JOIN işlemleriyle çözülmesi zor veya imkansız olan problemleri zarif bir şekilde çözebilirler. Örneğin, belirli bir kriteri karşılayan ürünleri listelerken, o kriterin kendisinin de başka bir sorgu sonucuna bağlı olduğu durumlar olabilir. Veya, belirli bir tarihten sonra hiç satış yapmamış müşterileri bulmak gibi senaryolarda, önce satış yapan müşterileri bulan bir alt sorguya ihtiyaç duyulabilir. Bu, veri analizi yeteneklerimizi büyük ölçüde genişletir ve veritabanı uzmanlarının vazgeçilmez araçlarından biri haline getirir. Ayrıca, alt sorgular, sorguları daha modüler ve okunabilir hale getirerek karmaşık iş mantığını parçalara ayırmanıza yardımcı olur. Dolayısıyla, bu güçlü yapının nasıl çalıştığını anlamak, sadece veri çekmekten öteye geçip, verilerle hikaye anlatma yeteneğinizi geliştirecektir.

Alt Sorgular Nedir ve Neden İhtiyaç Duyarız?

Alt sorgu, adından da anlaşılacağı gibi, başka bir SQL sorgusunun içinde yer alan bir sorgudur. Genellikle parantez içine alınır ve ana sorgunun SELECT, FROM, WHERE, HAVING veya hatta INSERT, UPDATE, DELETE gibi yan tümcelerinde kullanılabilir. Alt sorgular, temel olarak bir sorgunun sonucunu, başka bir sorgunun işleyişi için girdi olarak kullanma prensibine dayanır. Bu, tek seferde çözülmesi zor veya imkansız olan karmaşık veri isteklerini parçalara ayırarak daha yönetilebilir hale getirmemizi sağlar.

Peki, neden alt sorgulara ihtiyaç duyarız? Ana nedeni, veritabanı sorgularının doğasında yatan karmaşıklıkta yatar. Bazen, bir koşulun kendisi bir dizi veri üzerinde hesaplama gerektirir ya da listelenen verilerin başka bir veri kümesinde olup olmadığını kontrol etmek isteriz. Örneğin, bir veritabanında hem siparişleri hem de müşterileri tuttuğumuzu varsayalım. Eğer “hiç sipariş vermemiş müşterileri” bulmak istersek, öncelikle sipariş vermiş tüm müşterilerin kimliklerini bulmamız ve ardından bu kimliklerin müşteri tablosunda olmayanları filtrelememiz gerekir. İşte tam da bu iki aşamalı mantık, alt sorgu kullanımını gerekli kılar. Alt sorgular, bu tür mantıksal adımları tek bir SQL ifadesi içinde birleştirmemize olanak tanır, böylece daha az kod yazılır ve veri tutarlılığı daha kolay sağlanır.

Ayrıca, alt sorgular JOIN işlemlerine alternatif olarak da kullanılabilir, özellikle de birleşme koşulu karmaşık olduğunda veya sadece belirli bir veri alt kümesiyle ilgileniyorsak. Ancak, JOIN‘lar ve alt sorgular arasında performans farkları olabileceğini unutmamak önemlidir; bu konuya ilerleyen bölümlerde daha detaylı değineceğiz. Alt sorguların sağladığı en büyük avantajlardan biri, sorguyu daha okunaklı ve modüler hale getirmesidir. Karmaşık bir problemi, daha küçük ve anlaşılır parçalara ayırarak adım adım çözmenizi sağlar. Bu, özellikle büyük ve karmaşık veritabanı şemalarıyla çalışırken hata ayıklama ve sorgu bakımını kolaylaştırır. Alt sorgular sayesinde, bir iş kuralını uygularken geçici tablolar oluşturmak zorunda kalmadan, veriyi anında filtreleyip işleyebiliriz. Sonuç olarak, alt sorgular, veritabanı profesyonelleri için vazgeçilmez bir araç olup, verilerden maksimum değeri elde etmek adına güçlü bir esneklik ve kontrol sunar.

Uzman İpucu: Alt sorgular karmaşık görünsede, her zaman içeriden dışarıya doğru, yani en içteki parantezden başlayarak çalıştığını unutmayın. Bu, sorgunun nasıl çalıştığını anlamanıza büyük ölçüde yardımcı olacaktır.

Farklı Alt Sorgu Türleri Nelerdir ve Nasıl Sınıflandırılırlar?

Alt sorgular, SQL sorgularına esneklik ve güç katan çok yönlü araçlardır. Ancak tüm alt sorgular aynı şekilde çalışmaz veya aynı amaca hizmet etmez. Alt sorguları, döndürdükleri değer tipine ve ana sorgu ile olan ilişkilerine göre farklı kategorilere ayırabiliriz. Bu sınıflandırmayı anlamak, doğru senaryoda doğru alt sorguyu kullanmanızı sağlayacak temel bir bilgidir.

1. Scalar Alt Sorgular (Tek Değer Döndüren Alt Sorgular): Bu alt sorgular, tek bir değer (tek bir satır ve tek bir sütun) döndürürler. Genellikle ana sorgunun SELECT veya WHERE yan tümcesinde kullanılırlar ve bir sabit değer gibi davranırlar. Örneğin, “ortalama maaşın üzerinde maaş alan çalışanları listele” sorgusunda, ortalama maaşı hesaplayan alt sorgu, tek bir sayısal değer döndürecektir. Bu tür alt sorgular, ana sorgudaki bir değeri başka bir hesaplanmış değerle karşılaştırmak veya tamamlamak için idealdir. Örneğin, bir ürünün fiyatını, ortalama ürün fiyatıyla birlikte göstermek istediğinizde kullanılabilirler. Performans açısından genellikle oldukça verimlidirler çünkü sadece bir değer üretirler.


SELECT UrunAdi, Fiyat,
       (SELECT AVG(Fiyat) FROM Urunler) AS OrtalamaFiyat
FROM Urunler
WHERE Fiyat > (SELECT AVG(Fiyat) FROM Urunler);
    

Yukarıdaki örnekte, (SELECT AVG(Fiyat) FROM Urunler) ifadesi hem SELECT hem de WHERE yan tümcelerinde kullanılan bir skalar alt sorgudur.

2. Multi-Row Alt Sorgular (Çoklu Satır Döndüren Alt Sorgular): Bu alt sorgular, birden fazla satır döndürebilirler. Genellikle WHERE veya HAVING yan tümcelerinde, IN, NOT IN, ANY, ALL, EXISTS, NOT EXISTS gibi operatörlerle birlikte kullanılırlar. Örneğin, "belirli bir kategoriye ait ürünler listesinde yer alan müşterileri bul" gibi bir senaryoda, kategoriye ait ürünlerin kimliklerini döndüren bir multi-row alt sorguya ihtiyaç duyulur.

  • IN / NOT IN: Bir değerin alt sorgu tarafından döndürülen değer kümesi içinde olup olmadığını kontrol eder. En yaygın kullanımdır.
  • ANY / SOME: Bir değerin alt sorgu tarafından döndürülen değerlerin en az biriyle karşılaştırıldığında doğru olup olmadığını kontrol eder. (örneğin, > ANY, alt sorgu sonuçlarının en küçüğünden büyük demektir).
  • ALL: Bir değerin alt sorgu tarafından döndürülen tüm değerlerle karşılaştırıldığında doğru olup olmadığını kontrol eder. (örneğin, > ALL, alt sorgu sonuçlarının en büyüğünden büyük demektir).
  • EXISTS / NOT EXISTS: Alt sorgunun herhangi bir satır döndürüp döndürmediğini kontrol eder. Özellikle korelasyonlu alt sorgularda performanslıdır, çünkü sadece bir satır bulunduğunda işlemi durdurabilir.

-- Hiç sipariş vermemiş müşterileri bulma
SELECT MusteriAdi, Email
FROM Musteriler
WHERE MusteriID NOT IN (SELECT DISTINCT MusteriID FROM Siparisler);
    

Bu örnekte, (SELECT DISTINCT MusteriID FROM Siparisler) ifadesi, birden fazla müşteri ID'si döndürebilen bir multi-row alt sorgudur.

3. Table Alt Sorgular (Tablo Döndüren Alt Sorgular): Bu alt sorgular, bir tablo gibi birden fazla satır ve birden fazla sütun döndürebilirler. Genellikle ana sorgunun FROM yan tümcesinde kullanılırlar ve bu durumda "türetilmiş tablo" (derived table) veya "satır içi görünüm" (inline view) olarak adlandırılırlar. Sanki gerçek bir tabloymuş gibi diğer tablolarla JOIN edilebilir veya üzerinde başka filtreleme yapılabilir. Bu tür alt sorgular, karmaşık raporlama veya geçici olarak gruplandırılmış verilere ihtiyaç duyulduğunda oldukça faydalıdır. Örneğin, her departmandaki en yüksek maaşı bulan ve bu veriyi ana tabloyla birleştiren bir senaryoda kullanılabilir.


SELECT C.CalisanAdi, C.Maaş, D.DepartmanAdi
FROM Calisanlar C
INNER JOIN (
    SELECT DepartmanID, AVG(Maaş) AS OrtalamaDepartmanMaaşı
    FROM Calisanlar
    GROUP BY DepartmanID
) AS DepartmanOrtalamalari ON C.DepartmanID = DepartmanOrtalamalari.DepartmanID
WHERE C.Maaş > DepartmanOrtalamalari.OrtalamaDepartmanMaaşı;
    

Burada, (SELECT DepartmanID, AVG(Maaş) AS OrtalamaDepartmanMaaşı FROM Calisanlar GROUP BY DepartmanID) AS DepartmanOrtalamalari kısmı, bir tablo döndüren bir alt sorgudur.

4. Korelasyonlu Alt Sorgular (Correlated Subqueries): Bu alt sorgular, ana sorgudan gelen verilere bağımlıdır; yani, ana sorgudaki her satır için bir kez yürütülürler. Alt sorgu, ana sorgudan gelen bir değeri referans alır. Bu durum, mantıksal olarak çok güçlü olsa da, genellikle performansı olumsuz etkileyebilir çünkü her ana sorgu satırı için yeniden hesaplanırlar. EXISTS veya NOT EXISTS operatörleriyle sıklıkla kullanılırlar. Örneğin, "kendi departmanındaki ortalama maaşın üzerinde maaş alan çalışanları bul" gibi bir sorgu korelasyonlu bir alt sorgu gerektirir. Ana sorgudan gelen DepartmanID bilgisi, alt sorgunun WHERE koşulunda kullanılır.


SELECT CalisanAdi, DepartmanID, Maaş
FROM Calisanlar C1
WHERE Maaş > (
    SELECT AVG(Maaş)
    FROM Calisanlar C2
    WHERE C2.DepartmanID = C1.DepartmanID
);
    

Bu örnekte, içteki alt sorgu C1.DepartmanID'yi kullanır ve her C1 satırı için tekrar çalışır. Korelasyonlu alt sorgular, bazen JOIN veya CTE'lerle daha performanslı hale getirilebilir.

Bu farklı alt sorgu türlerini anlamak, bir veritabanı sorgusunu optimize etme ve en doğru sonucu elde etme konusunda size büyük avantaj sağlayacaktır. Her birinin kendi kullanım senaryoları ve performans özellikleri bulunmaktadır.

Alt Sorguları SELECT, FROM ve WHERE Yan Tümcelerinde Nasıl Kullanırız? Adım Adım Örnekler

Alt sorguların gücü, SQL'in farklı yan tümcelerinde esneklikle kullanılabilmelerinden gelir. Her yan tümcede kullanımları farklı bir amaca hizmet eder ve belirli senaryolarda oldukça faydalıdır. Bu bölümde, alt sorguların SELECT, FROM ve WHERE yan tümcelerinde nasıl kullanıldığını adım adım örneklerle inceleyeceğiz.

SELECT Yan Tümcesinde Alt Sorgu Kullanımı: Hesaplama ve Karşılaştırma

SELECT yan tümcesinde kullanılan alt sorgular, genellikle her satır için bir değer hesaplamak veya karşılaştırmak amacıyla kullanılır. Bu tür alt sorgular genellikle skalar (tek değer döndüren) alt sorgular olmak zorundadır, aksi takdirde bir hata ile karşılaşırsınız. Genellikle bir anahtar performans göstergesi (KPI) veya bir oran hesaplaması yapmak istediğimizde tercih edilirler. Örneğin, bir ürünün fiyatını gösterirken, tüm ürünlerin ortalama fiyatını da aynı anda görmek isteyebiliriz.


-- Örnek Senaryo: Her çalışanın maaşını ve şirketin genel ortalama maaşını listele.
SELECT
    CalisanAdi,
    Maaş,
    (SELECT AVG(Maaş) FROM Calisanlar) AS GenelOrtalamaMaaş
FROM
    Calisanlar;
    

Bu örnekte, (SELECT AVG(Maaş) FROM Calisanlar) ifadesi, her bir çalışan satırı için tek bir değer döndüren bir alt sorgudur. Bu, okuyucunun her bir çalışanın maaşını genel ortalama ile karşılaştırmasını kolaylaştırır. Benzer şekilde, bir ürünün satış adedini gösterirken, o kategorideki toplam satış adedini de bu şekilde gösterebiliriz. Bu yöntem, raporlama ve analiz amaçları için oldukça kullanışlıdır, çünkü ilgili metrikleri tek bir sorgu sonucunda yan yana getirmemizi sağlar.

FROM Yan Tümcesinde Alt Sorgu Kullanımı: Türetilmiş Tablolar (Derived Tables)

FROM yan tümcesinde kullanılan alt sorgular, "türetilmiş tablolar" veya "satır içi görünümler" olarak bilinir. Bu alt sorgular, sanki gerçek bir tabloyormuş gibi ele alınır ve ana sorgu tarafından sorgulanır veya başka tablolarla JOIN edilebilir. Birden fazla satır ve sütun döndürebilirler. Özellikle karmaşık gruplama veya toplama işlemleri sonucunda elde edilen veriler üzerinde daha fazla işlem yapmak istediğimizde bu yöntem tercih edilir.


-- Örnek Senaryo: Her departmandaki en yüksek maaşı alan çalışanı bul.
SELECT
    D.DepartmanAdi,
    C.CalisanAdi,
    C.Maaş
FROM
    Departmanlar D
JOIN (
    SELECT
        DepartmanID,
        MAX(Maaş) AS EnYuksekMaaş
    FROM
        Calisanlar
    GROUP BY
        DepartmanID
) AS DepartmanEnYuksekMaaslari ON D.DepartmanID = DepartmanEnYuksekMaaslari.DepartmanID
JOIN
    Calisanlar C ON C.DepartmanID = DepartmanEnYuksekMaaslari.DepartmanID AND C.Maaş = DepartmanEnYuksekMaaslari.EnYuksekMaaş;
    

Buradaki (SELECT DepartmanID, MAX(Maaş) AS EnYuksekMaaş FROM Calisanlar GROUP BY DepartmanID) AS DepartmanEnYuksekMaaslari kısmı, ana sorgunun FROM yan tümcesinde yer alan türetilmiş bir tablodur. Bu alt sorgu önce her departmanın en yüksek maaşını hesaplar ve ardından bu geçici tablo, departmanlar ve çalışanlar tablolarıyla birleştirilerek istenen sonuç elde edilir. Bu yaklaşım, karmaşık raporlama ve analiz senaryolarında, veriyi farklı boyutlarda gruplandırıp analiz etmede büyük kolaylık sağlar. Türetilmiş tablolar, karmaşık sorguları daha anlaşılır parçalara bölme ve SQL'in işlem adımlarını netleştirme konusunda oldukça etkilidir.

WHERE Yan Tümcesinde Alt Sorgu Kullanımı: Veri Filtreleme

WHERE yan tümcesinde kullanılan alt sorgular, belirli bir koşulu karşılayan verileri filtrelemek için kullanılır. Bu, alt sorguların en yaygın kullanım alanlarından biridir. Genellikle IN, NOT IN, EXISTS, NOT EXISTS, ANY, ALL gibi operatörlerle birlikte kullanılırlar. Ana sorgudaki her satır için bir filtreleme koşulu oluştururlar.


-- Örnek Senaryo: Hiç satış yapmamış müşterileri listele.
SELECT
    MusteriAdi,
    Email
FROM
    Musteriler
WHERE
    MusteriID NOT IN (SELECT DISTINCT MusteriID FROM Siparisler);
    

Bu örnekte, (SELECT DISTINCT MusteriID FROM Siparisler) alt sorgusu, tüm sipariş veren müşteri kimliklerini döndürür. Ana sorgu ise, bu listede yer almayan müşterileri seçerek, hiç satış yapmamış müşterileri bulur. Bu, veri analizi ve hedefleme senaryolarında oldukça pratik bir yaklaşımdır. Benzer şekilde, belirli bir ürün grubunda olmayan veya belirli bir tarihten sonra aktif olmayan kayıtları bulmak için de WHERE alt sorguları kullanılabilir. Alt sorgular, belirli bir koşulun dinamik olarak belirlenmesi gerektiği durumlar için biçilmiş kaftandır, çünkü filtreleme koşulu veritabanındaki güncel duruma göre şekillenir.

Uzman İpucu: EXISTS operatörü, alt sorgunun herhangi bir satır döndürüp döndürmediğini kontrol eder ve performansı IN operatörüne göre daha iyi olabilir, özellikle alt sorgunun çok büyük veri kümeleri döndürmesi durumunda. EXISTS, bir eşleşme bulduğunda alt sorgu yürütmesini durdurur, oysa IN tüm alt sorguyu çalıştırmak zorundadır.

Bu detaylı örnekler, alt sorguların SQL sorgularınızda ne kadar çok yönlü ve güçlü olabileceğini göstermektedir. Her yan tümcede doğru alt sorgu türünü seçmek, hem sorgunuzun doğruluğunu hem de performansını doğrudan etkileyecektir. Bu beceriyi geliştirmek, daha karmaşık veri problemlerini çözme yeteneğinizi artıracaktır.

Pratik Uygulamalar: Gerçek Dünya Senaryolarında Alt Sorgular

Teorik bilgilerin ötesine geçerek, alt sorguların gerçek dünya senaryolarında nasıl kullanılabileceğini incelemek, bu güçlü aracın potansiyelini tam olarak anlamamızı sağlar. İşte günlük operasyonlarda veya analitik çalışmalarda sıkça karşımıza çıkan bazı vaka analizleri ve çözümleri:

Vaka Analizi 1: En İyi Satış Yapan Çalışanları Belirleme

Bir e-ticaret şirketinin yöneticisi, geçen yıl en yüksek toplam satış hacmine ulaşan ilk 5 çalışanı belirlemek istiyor. Ancak, çalışanların sadece toplam satışlarını değil, aynı zamanda bu satışların şirketin genel satış ortalamasına göre ne kadar iyi olduğunu da görmek istiyor.


-- Çalışanlar (Calisanlar) ve Siparişler (Siparisler) tabloları olduğunu varsayalım.
-- Her siparişte ÇalışanID ve ToplamTutar bilgileri mevcut.

SELECT
    C.CalisanAdi,
    SUM(S.ToplamTutar) AS ToplamSatış,
    (SELECT AVG(ToplamTutar) FROM Siparisler) AS OrtalamaSiparişTutarı
FROM
    Calisanlar C
JOIN
    Siparisler S ON C.CalisanID = S.CalisanID
GROUP BY
    C.CalisanAdi
ORDER BY
    ToplamSatış DESC
LIMIT 5;
    

Bu örnekte, SELECT yan tümcesindeki skalar alt sorgu, tüm siparişlerin ortalama tutarını hesaplayarak her çalışanın toplam satışının yanında genel ortalamayı da gösterir. Bu, yöneticinin hem bireysel performansı hem de genel şirket performansını aynı anda değerlendirmesini sağlar. Alt sorgu sayesinde, ekstra bir JOIN işlemi veya geçici tablo oluşturmaya gerek kalmadan bu bilgiye ulaşıyoruz.

Vaka Analizi 2: Hiç Satın Alma Yapmamış Müşterilere Özel Teklif Gönderme

Bir pazarlama departmanı, son 6 ay içinde hiçbir ürün satın almamış mevcut müşterileri hedefleyerek özel bir indirim kampanyası başlatmak istiyor. Bu müşterilerin e-posta adreslerinin listelenmesi gerekiyor.


-- Müşteriler (Musteriler) ve Siparişler (Siparisler) tabloları olduğunu varsayalım.
-- Siparişler tablosunda SiparisTarihi ve MusteriID mevcut.

SELECT
    MusteriAdi,
    Email
FROM
    Musteriler
WHERE
    MusteriID NOT IN (
        SELECT DISTINCT MusteriID
        FROM Siparisler
        WHERE SiparisTarihi >= DATE('now', '-6 months')
    );
    

Burada WHERE yan tümcesinde kullanılan multi-row alt sorgu, son 6 ayda sipariş vermiş tüm müşterilerin kimliklerini getirir. Ana sorgu ise bu listede yer almayan müşterileri filtreleyerek hedef kitleyi belirler. Bu, pazarlama ekiplerinin segmentasyon yapmasını ve hedefe yönelik kampanyalar oluşturmasını kolaylaştıran klasik bir kullanım senaryosudur.

Vaka Analizi 3: Departman Bazında En Yüksek Maaş Alanları Bulma

Bir insan kaynakları departmanı, her departmandaki en yüksek maaşı alan çalışanları belirlemek istiyor. Bu bilgi, terfi ve performans değerlendirme süreçlerinde kullanılacaktır.


-- Çalışanlar (Calisanlar) ve Departmanlar (Departmanlar) tabloları olduğunu varsayalım.

SELECT
    D.DepartmanAdi,
    C.CalisanAdi,
    C.Maaş
FROM
    Calisanlar C
JOIN
    Departmanlar D ON C.DepartmanID = D.DepartmanID
WHERE
    C.Maaş = (SELECT MAX(Maaş) FROM Calisanlar WHERE DepartmanID = C.DepartmanID);
    

Bu senaryoda, WHERE yan tümcesinde korelasyonlu bir alt sorgu kullanılmıştır. İçteki alt sorgu, ana sorgudaki her çalışanın departmanına göre o departmandaki en yüksek maaşı hesaplar. Ana sorgu daha sonra bu en yüksek maaşa sahip çalışanları filtreler. Bu, özellikle her bir grup içindeki en yüksek veya en düşük değerleri bulmak için oldukça etkili bir yöntemdir, ancak performans açısından dikkatli olunması gerekir çünkü alt sorgu ana sorgudaki her satır için tekrar çalışır.

Vaka Analizi 4: Geçen Ay Kayıt Olan Kullanıcıların Ortalama Sipariş Değeri

Bir analist, geçen ay sisteme yeni kayıt olan kullanıcıların ilk siparişlerinin ortalama değerini öğrenmek istiyor. Bu bilgi, yeni kullanıcı kazanım stratejilerinin etkinliğini ölçmek için kritik.


-- Kullanicilar (Kullanicilar) ve Siparisler (Siparisler) tabloları olduğunu varsayalım.
-- Kullanicilar tablosunda KayitTarihi, Siparisler tablosunda MusteriID ve ToplamTutar mevcut.

SELECT
    AVG(S.ToplamTutar) AS OrtalamaIlkSiparisDegeri
FROM
    Siparisler S
WHERE
    S.MusteriID IN (
        SELECT MusteriID
        FROM Kullanicilar
        WHERE KayitTarihi >= DATE('now', 'start of month', '-1 month')
          AND KayitTarihi < DATE('now', 'start of month')
    )
    AND S.SiparisID = ( -- Her müşteri için ilk siparişi bulmak
        SELECT MIN(SiparisID)
        FROM Siparisler S2
        WHERE S2.MusteriID = S.MusteriID
    );
    

Bu karmaşık senaryo, hem IN operatörüyle yeni kayıt olan müşterileri filtrelemek için bir alt sorgu hem de her müşterinin ilk siparişini bulmak için korelasyonlu başka bir alt sorgu kullanır. Bu tür çoklu alt sorgu kullanımları, belirli iş gereksinimlerini karşılamak için veriyi birden fazla katmanda filtrelemeyi ve işlemeyi mümkün kılar. Gerçek dünya problemleri genellikle bu tür iç içe karmaşık mantıklar gerektirir ve alt sorgular bu karmaşıklığı yönetilebilir hale getirmenin anahtarıdır.

Bu vaka analizleri, alt sorguların sadece basit filtreleme araçları olmadığını, aynı zamanda karmaşık iş zekası problemlerini çözmek için de kullanılabilecek çok yönlü ve güçlü araçlar olduğunu göstermektedir. Doğru alt sorgu türünü seçmek ve ana sorgu ile nasıl etkileşimde bulunduğunu anlamak, veritabanı uzmanlığı yolculuğunuzda size büyük avantaj sağlayacaktır.

İç İçe Sorgular ve Performans Etkileri: Nelere Dikkat Etmeli?

Alt sorgular, veri manipülasyonunda inanılmaz bir esneklik sunsa da, yanlış kullanıldığında veritabanı performansını önemli ölçüde etkileyebilir. Özellikle "iç içe sorgular" terimi, bir alt sorgunun başka bir alt sorguyu içermesi durumunu ifade eder ve bu durum karmaşıklığı daha da artırır. Performans, veritabanı yöneticileri ve geliştiricileri için her zaman kritik bir konudur; dolayısıyla alt sorguların performans etkilerini anlamak ve optimize etmek hayati önem taşır.

Korelasyonlu Alt Sorguların Performans Maliyeti

Daha önce bahsettiğimiz gibi, korelasyonlu alt sorgular ana sorgunun her satırı için tekrar tekrar çalışır. Eğer ana sorgu binlerce veya milyonlarca satır döndürüyorsa, bu her satır için alt sorgunun binlerce veya milyonlarca kez çalıştırılması anlamına gelir. Bu durum, özellikle alt sorgunun kendisi yoğun bir işlem (örneğin, büyük bir tablo üzerinde toplama veya filtreleme) gerektiriyorsa, sorgunun çok yavaş çalışmasına neden olabilir. Veritabanı motoru, bu tekrar eden işlemleri optimize etmekte zorlanabilir.


-- Kötü performans örneği: Her satır için tekrar çalışan korelasyonlu alt sorgu
SELECT CalisanAdi, DepartmanID, Maaş
FROM Calisanlar C1
WHERE Maaş > (
    SELECT AVG(Maaş)
    FROM Calisanlar C2
    WHERE C2.DepartmanID = C1.DepartmanID
);
    

Yukarıdaki örnek, her çalışan için departmanının ortalama maaşını tekrar tekrar hesaplar. Bu, küçük tablolar için sorun olmasa da, büyük tablolarda ciddi yavaşlamalara yol açabilir. Bu tür durumlarda, genellikle JOIN veya Ortak Tablo İfadeleri (CTE'ler) kullanarak performansı artırmak mümkündür.

Nested Alt Sorguların Okunabilirlik ve Bakım Sorunları

Birden fazla seviyede iç içe geçmiş alt sorgular, sorgunun okunabilirliğini ve bakımını zorlaştırabilir. Bir sorguyu anlama ve üzerinde değişiklik yapma süresi artar, bu da hata yapma olasılığını yükseltir. Ayrıca, veritabanı motoru için karmaşık bir yürütme planı oluşturmak da zorlaşabilir, bu da optimal olmayan performansla sonuçlanabilir.


-- Üç katmanlı iç içe alt sorgu örneği (okunabilirliği azaltır)
SELECT MusteriAdi FROM Musteriler
WHERE MusteriID IN (
    SELECT MusteriID FROM Siparisler
    WHERE SiparisID IN (
        SELECT SiparisID FROM UrunSiparisleri
        WHERE UrunID IN (
            SELECT UrunID FROM Urunler WHERE Kategori = 'Elektronik'
        )
    )
);
    

Bu tür çok katmanlı sorgular, ne anlama geldiğini kavramayı zorlaştırır ve herhangi bir hata ayıklama sürecini kabusa çevirebilir. Her bir iç sorgunun ne döndürdüğünü ayrı ayrı test etmek gerekebilir.

Performans Optimizasyon İpuçları

  1. JOIN Kullanımına Öncelik Verin: Çoğu durumda, özellikle korelasyonlu alt sorguların yerine INNER JOIN, LEFT JOIN gibi birleştirme işlemleri kullanmak daha performanslı olabilir. Veritabanı motorları, JOIN işlemlerini optimize etme konusunda daha yeteneklidir.
  2. EXISTS vs. IN: Eğer alt sorgunuz çok sayıda satır döndürüyor ve sadece bir eşleşmenin olup olmadığını kontrol ediyorsanız, IN yerine EXISTS kullanmak daha iyidir. EXISTS, ilk eşleşmeyi bulduğunda alt sorgu yürütmesini durdurabilir.
  3. Ortak Tablo İfadeleri (CTE - Common Table Expressions): Karmaşık alt sorgu yapılarını daha okunaklı ve bazen daha performanslı hale getirmek için CTE'ler kullanın. CTE'ler, sorguları daha küçük, adlandırılmış ve geçici sonuç kümelerine bölmenize olanak tanır.
  4. İndeksleri Doğru Kullanın: Alt sorguların ve ana sorgunun WHERE koşullarında kullanılan sütunlar üzerinde uygun indekslerin olması, sorgu performansını büyük ölçüde artırabilir.
  5. Tablo Boyutunu Azaltın: Alt sorgunun döndürdüğü veri miktarını mümkün olduğunca azaltmaya çalışın. Gereksiz sütunları seçmeyin (SELECT * yerine SELECT Kolon1, Kolon2).
  6. Veritabanı Motorunun Optimizasyonunu Anlayın: Kullandığınız veritabanı sisteminin (MySQL, PostgreSQL, SQL Server vb.) sorgu iyileştiricisi (optimizer) alt sorguları nasıl ele aldığını anlamaya çalışın. Bazen veritabanı, alt sorguları otomatik olarak JOIN'lara dönüştürebilir.
Uzman İpucu: Karmaşık sorgularda, EXPLAIN veya ANALYZE (veritabanına göre değişir) komutlarını kullanarak sorgu yürütme planını inceleyin. Bu, sorgunuzun hangi kısmının yavaşladığını ve hangi indekslerin kullanıldığını anlamanıza yardımcı olacaktır.

Özetle, alt sorgular SQL'de güçlü bir araçtır, ancak performans üzerindeki potansiyel etkileri göz ardı edilmemelidir. Sorgunuzu yazarken, her zaman alternatif çözümleri (özellikle JOIN ve CTE'ler) değerlendirin ve performansı sürekli olarak test edin. Bu sayede hem doğru hem de verimli sorgular yazabilirsiniz.

Alt Sorgulara Alternatifler: CTE'ler ve JOIN'lar Ne Zaman Tercih Edilmeli?

Alt sorgular, karmaşık veri problemlerini çözmek için harika bir araç olsa da, çoğu zaman aynı sonucu elde etmenin daha performanslı, daha okunabilir veya daha esnek yolları vardır. Özellikle Ortak Tablo İfadeleri (CTE'ler) ve JOIN işlemleri, alt sorgulara güçlü alternatifler sunar. Bu bölümde, bu alternatifleri ne zaman ve neden tercih etmemiz gerektiğini detaylı örneklerle inceleyeceğiz.

JOIN İşlemleri: İlişkisel Verilerin Gücü

JOIN işlemleri, ilişkisel veritabanlarının temelini oluşturur ve farklı tablolardaki verileri belirli bir ortak sütun (genellikle birincil anahtar/yabancı anahtar ilişkisi) üzerinden birleştirmek için kullanılır. JOIN'lar, genellikle veri filtreleme ve birden fazla tabloyu birleştirme ihtiyacı duyduğunuzda alt sorgulardan daha performanslıdır.

Neden JOIN Tercih Edilmeli?

  • Performans: Veritabanı motorları, JOIN işlemlerini optimize etme konusunda oldukça gelişmiştir. Özellikle büyük veri kümelerinde, JOIN'lar genellikle korelasyonlu alt sorgulardan veya karmaşık WHERE IN alt sorgularından daha hızlı çalışır.
  • Okunabilirlik: Basit JOIN'lar, alt sorgulara göre çoğu zaman daha sezgisel ve okunabilirdir, özellikle birden fazla tabloyu birleştiriyorsanız.
  • Esneklik: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN gibi farklı JOIN türleri, verileri birleştirme şeklinizi kontrol etme konusunda büyük esneklik sunar.

JOIN ile Alt Sorgu Karşılaştırması Örneği: "Hiç sipariş vermemiş müşterileri bulma"


-- Alt Sorgu ile çözüm:
SELECT MusteriAdi, Email
FROM Musteriler
WHERE MusteriID NOT IN (SELECT DISTINCT MusteriID FROM Siparisler);

-- LEFT JOIN (veya NOT EXISTS) ile çözüm:
SELECT M.MusteriAdi, M.Email
FROM Musteriler M
LEFT JOIN Siparisler S ON M.MusteriID = S.MusteriID
WHERE S.SiparisID IS NULL;
    

İkinci LEFT JOIN örneği, S.SiparisID IS NULL koşuluyla, siparişi olmayan müşterileri bulur. Bu yöntem genellikle NOT IN alt sorgusundan daha performanslıdır, çünkü veritabanı motoru birleşme işlemini daha etkin bir şekilde optimize edebilir. NOT EXISTS operatörü de bu senaryo için oldukça performanslı bir alternatiftir ve JOIN ile benzer şekilde çalışır.

Ortak Tablo İfadeleri (CTE - Common Table Expressions): Sorgu Modülerliği

CTE'ler, SQL Server, PostgreSQL, MySQL 8+, Oracle gibi modern veritabanı sistemlerinde bulunan güçlü bir özelliktir. WITH anahtar kelimesiyle tanımlanırlar ve karmaşık sorguları daha küçük, adlandırılmış, geçici ve okunabilir alt parçalara ayırmak için kullanılırlar. Bir CTE, ana sorgu içinde yalnızca bir kez tanımlanır ve daha sonra ana sorgu içinde (veya diğer CTE'ler içinde) birden çok kez referans verilebilir.

Neden CTE Tercih Edilmeli?

  • Okunabilirlik ve Modülerlik: Karmaşık mantığı küçük, adlandırılmış bloklara ayırarak sorguları çok daha okunabilir ve anlaşılır hale getirir. Her CTE, kendi içinde mantıksal bir adımı temsil edebilir.
  • Tekrar Kullanım: Bir CTE, aynı sorgu içinde birden fazla kez referans alınabilir, bu da kodu tekrarlamayı önler.
  • Özyinelemeli Sorgular (Recursive CTEs): Hiyerarşik verileri (örneğin, bir organizasyon şeması veya bir ürün kategorisi ağacı) sorgulamak için özyinelemeli CTE'ler kullanılabilir, bu da alt sorgularla başa çıkılması zor bir durumdur.
  • Performans İyileştirmesi: Bazı durumlarda, veritabanı optimizasyoncusu CTE'leri alt sorgulardan daha verimli bir şekilde işleyebilir, özellikle karmaşık hesaplamalar veya gruplamalar yapılıyorsa.

CTE ile Alt Sorgu Karşılaştırması Örneği: "Her departmandaki en yüksek maaşı alan çalışanı bulma"


-- FROM yan tümcesinde alt sorgu ile çözüm:
SELECT D.DepartmanAdi, C.CalisanAdi, C.Maaş
FROM Departmanlar D
JOIN (
    SELECT DepartmanID, MAX(Maaş) AS EnYuksekMaaş
    FROM Calisanlar
    GROUP BY DepartmanID
) AS DepartmanEnYuksekMaaslari ON D.DepartmanID = DepartmanEnYuksekMaaslari.DepartmanID
JOIN Calisanlar C ON C.DepartmanID = DepartmanEnYuksekMaaslari.DepartmanID AND C.Maaş = DepartmanEnYuksekMaaslari.EnYuksekMaaş;

-- CTE ile çözüm:
WITH DepartmanEnYuksekMaaslari AS (
    SELECT DepartmanID, MAX(Maaş) AS EnYuksekMaaş
    FROM Calisanlar
    GROUP BY DepartmanID
)
SELECT D.DepartmanAdi, C.CalisanAdi, C.Maaş
FROM Departmanlar D
JOIN Calisanlar C ON D.DepartmanID = C.DepartmanID
JOIN DepartmanEnYuksekMaaslari DEM ON C.DepartmanID = DEM.DepartmanID AND C.Maaş = DEM.EnYuksekMaaş;
    

CTE örneği, DepartmanEnYuksekMaaslari adında geçici bir sonuç kümesi tanımlar ve bu küme, ana SELECT sorgusu içinde normal bir tablo gibi kullanılır. Bu yaklaşım, sorgunun akışını daha net hale getirir ve karmaşık mantığı parçalara ayırır. Alt sorgu ve CTE, temel olarak aynı mantığı uygular, ancak CTE'nin okunabilirliği ve potansiyel tekrar kullanılabilirliği onu birçok geliştirici için tercih edilen bir seçenek haline getirir.

Sonuç olarak, alt sorgular güçlüdür ancak her zaman en iyi çözüm değildir. Karmaşık veritabanı sorgularında performans, okunabilirlik ve sürdürülebilirlik faktörlerini göz önünde bulundurarak JOIN işlemlerini ve CTE'leri alt sorgulara alternatif olarak düşünmek önemlidir. Bu araçlar arasındaki farkları ve her birinin ne zaman en uygun olduğunu bilmek, sizi daha yetkin bir SQL geliştiricisi yapacaktır.

Mobil Uyumluluk İçin Ek Notlar: Tasarımda Neler Yapmalıyız?

Web siteleri ve uygulamalar artık sadece masaüstü bilgisayarlardan değil, akıllı telefonlar ve tabletler gibi çeşitli mobil cihazlardan da erişilebilir durumda. Bu nedenle, hazırladığımız HTML içeriğinin mobil uyumlu olması, kullanıcı deneyimi açısından kritik öneme sahiptir. Veritabanı sorgularının kendisi doğrudan mobil uyumlulukla ilgili olmasa da, bu sorgularla elde edilen verilerin kullanıcıya sunulma şekli mobil uyumlu olmalıdır. İşte HTML içeriğinizi mobil uyumlu hale getirmek için yapabileceğiniz bazı temel tasarım ve geliştirme adımları:

1. Duyarlı Tasarım (Responsive Design) İlkeleri:

Mobil uyumluluğun temel taşı, içeriğinizin farklı ekran boyutlarına ve çözünürlüklerine otomatik olarak uyum sağlamasıdır. Bu genellikle CSS Media Queries kullanılarak yapılır.

  • Viewport Meta Etiketi: HTML belgenizin kısmına mutlaka aşağıdaki meta etiketini ekleyin. Bu etiket, tarayıcıya sayfanın cihazın genişliğine göre ölçeklenmesi gerektiğini söyler.
    
    
                

  • Akışkan Izgaralar ve Resimler: Izgara (grid) sistemlerinizi ve resimlerinizi yüzde (%) tabanlı genişliklerle ayarlayın, piksel tabanlı sabit genişlikler yerine. Bu, içeriğin ekran boyutuna göre esnek bir şekilde küçülmesini veya büyümesini sağlar.
  • CSS Media Queries Kullanımı: Farklı ekran boyutları için farklı CSS stilleri tanımlayın. Örneğin, küçük ekranlar için sütunları alt alta yığabilir, yazı tipi boyutlarını küçültebilir veya bazı öğeleri gizleyebilirsiniz.
    
    /* Örnek bir CSS medya sorgusu */
    @media screen and (max-width: 600px) {
        /* Mobil ekranlar için geçerli stil kuralları */
        body {
            font-size: 16px;
        }
        .container {
            width: 95%;
            padding: 10px;
        }
        table, thead, tbody, th, td, tr {
            display: block; /* Tabloları mobil görünümde blok elementlere çevirme */
        }
        /* Diğer mobil özel stiller */
    }
                

    Yukarıdaki örnek, ekran genişliği 600 piksel ve altında olduğunda devreye girecek stilleri gösteriyor. Özellikle tabloların mobil uyumluluğu sıkça bir problem teşkil eder. display: block; ve data-label nitelikleri kullanarak tabloları daha okunabilir hale getirebilirsiniz.

2. İçerik ve Element Optimizasyonu:

  • Yazı Tipleri: Okunabilir yazı tipi boyutları kullanın. Mobil cihazlarda çok küçük veya çok büyük yazı tipleri kötü bir deneyim sunar.
  • Dokunmatik Hedef Boyutları: Düğmeler, bağlantılar ve diğer etkileşimli öğelerin mobil cihazlarda kolayca dokunulabilir boyutta olduğundan emin olun (genellikle en az 48x48 piksel).
  • Görsel Optimizasyonu: Büyük resim dosyaları mobil cihazlarda yavaş yüklenmeye neden olur. Görselleri optimize edin (sıkıştırın) ve gerekiyorsa etiketi veya CSS medya sorguları ile farklı çözünürlükler için farklı resimler sunun.
  • Basit ve Düz Net Navigasyon: Mobil cihazlarda karmaşık menülerden kaçının. Hamburger menü gibi çözümlerle navigasyonu basitleştirin.
  • Form Alanları: Form alanlarını büyük ve kolayca doldurulabilir yapın. Klavye türünü (sayısal, e-posta, metin vb.) doğru ayarlamak için input type niteliklerini kullanın.

3. Hız ve Performans:

Mobil kullanıcılar, yavaş yüklenen sitelere karşı daha az sabırlıdır. HTML içeriğinizin ve ona eşlik eden CSS/JavaScript dosyalarının hızlı yüklenmesi kritik öneme sahiptir.

  • Minimal HTML: Gereksiz etiketlerden ve derin iç içe geçmiş yapılarından kaçının. Temiz ve semantik HTML kullanın.
  • CSS ve JavaScript Dosyalarını Sıkıştırın: Bu dosyaların boyutunu küçültmek için minify (sıkıştırma) araçlarını kullanın.
  • Önbellekleme: Tarayıcı önbelleklemesini kullanarak tekrarlayan ziyaretlerde sayfa yükleme sürelerini azaltın.

Bu makalede sunduğumuz teknik içerik (SQL sorguları ve kod blokları) doğrudan mobil uyumluluk sorunlarına neden olmazken, bu içeriği bir web sayfasında sunduğunuzda, kod bloklarının ve tabloların mobil ekranlarda düzgün görünmesi için yukarıdaki prensipleri uygulamanız şarttır. Özellikle

 blokları uzun kod satırları içerdiğinde yatay kaydırma çubukları ortaya çıkabilir. Bu durumu önlemek için CSS ile overflow-x: auto; gibi özellikler kullanabilirsiniz, böylece kullanıcılar kodu rahatça okuyabilirler.
    

/* Kod blokları için mobil uyumluluk */
pre {
    white-space: pre-wrap; /* Uzun satırları otomatik olarak alt satıra geçirme */
    word-wrap: break-word; /* Kelime bazında kırma */
    overflow-x: auto; /* Yatay kaydırma çubuğu */
    max-width: 100%; /* Konteynerin dışına taşmayı önleme */
}
    

HTML içeriği mobil uyumlu hale getirilirken, kullanıcı deneyimini her zaman ön planda tutmak, içeriğinizin her cihazda erişilebilir ve keyifli olmasını sağlayacaktır.

Sonuç ve En İyi Uygulamalar: Alt Sorgularla Daha İyi Veritabanı Yönetimi

Bu makalede, SQL'deki alt sorguların ve iç içe sorguların derinliklerine indik. Temel tanımlarından farklı türlerine, SELECT, FROM ve WHERE yan tümcelerindeki pratik kullanımlarından gerçek dünya senaryolarına ve hatta performans optimizasyon ipuçlarına kadar geniş bir yelpazeyi ele aldık. Gördüğümüz gibi, alt sorgular, veritabanından karmaşık bilgileri çekmek ve analiz etmek için son derece güçlü ve esnek bir araçtır.

Alt sorgular, özellikle karmaşık iş mantıklarını tek bir sorgu içinde parçalara ayırarak çözümlememize olanak tanır. Bir sorgunun sonucunu başka bir sorgunun girdisi olarak kullanabilme yeteneği, veri analizi ve raporlama süreçlerinde bize büyük avantajlar sağlar. Ancak, bu gücün beraberinde sorumlulukları da getirdiğini unutmamalıyız. Yanlış veya düşüncesizce kullanılan alt sorgular, özellikle korelasyonlu olanlar, veritabanı performansını ciddi şekilde olumsuz etkileyebilir.

Alt Sorgular İçin En İyi Uygulamalar:

  1. Mantığı Basit Tutun: Mümkün olduğunca basit ve anlaşılır alt sorgular yazmaya çalışın. Çok katmanlı iç içe sorgulardan kaçının, zira bunlar okunabilirliği ve bakımı zorlaştırır.
  2. Alternatifleri Değerlendirin: Her zaman bir alt sorgu yazmadan önce, aynı sonucu JOIN işlemleri veya Ortak Tablo İfadeleri (CTE'ler) ile elde edip edemeyeceğinizi düşünün. Genellikle bu alternatifler daha performanslı ve okunaklıdır.
  3. Performansı Test Edin: Özellikle büyük veri kümeleri üzerinde çalışan alt sorguları her zaman test edin. EXPLAIN veya ANALYZE gibi araçlar kullanarak sorgunun yürütme planını inceleyin ve darboğazları tespit edin.
  4. EXISTS ve IN Arasındaki Farkı Bilin: Bir küme içinde var olup olmadığını kontrol ederken, alt sorgunuzun döndüreceği satır sayısına göre EXISTS veya IN operatörünü bilinçli bir şekilde seçin. Geniş sonuç kümeleri için EXISTS çoğu zaman daha iyi bir seçenektir.
  5. İndeksleri Kullanın: Alt sorgularda kullanılan filtreleme veya birleştirme sütunları üzerinde uygun indekslerin oluşturulduğundan emin olun. Bu, sorgu hızını dramatik bir şekilde artırabilir.
  6. Modüler Yaklaşım: Karmaşık sorguları, daha küçük, yönetilebilir parçalara ayırmak için CTE'leri veya görünümleri (VIEWs) kullanın. Bu, sadece sorgunun okunabilirliğini artırmakla kalmaz, aynı zamanda bakımını da kolaylaştırır.
  7. Sadece İhtiyacınız Olanı Seçin: Alt sorgunuzda SELECT * yerine sadece ihtiyacınız olan sütunları seçin. Bu, döndürülen veri miktarını azaltarak performansı iyileştirebilir.

Sonuç olarak, alt sorgular ve iç içe sorgular, bir veritabanı uzmanının araç kutusundaki güçlü silahlardır. Bu araçları ne zaman kullanacağınızı, nasıl optimize edeceğinizi ve alternatiflerini ne zaman tercih edeceğinizi bilmek, veri tabanı yönetimindeki yetkinliğinizi önemli ölçüde artıracaktır. Pratik yaparak ve farklı senaryolar üzerinde deneyler yaparak bu konudaki ustalığınızı pekiştirebilirsiniz. Unutmayın, iyi yazılmış bir sorgu, sadece doğru sonucu vermekle kalmaz, aynı zamanda bunu en verimli şekilde yapar.

Sıkça Sorulan Sorular

Alt sorgular ile JOIN işlemleri arasındaki temel fark nedir?
Cevap: Temel fark, alt sorguların bir sorgunun sonucunu başka bir sorgunun girdi değeri olarak kullanması (tek bir değer, bir liste veya bir tablo olarak) iken, JOIN'ların iki veya daha fazla tabloyu ortak bir sütun üzerinden birleştirerek yatayda daha geniş bir sonuç kümesi oluşturmasıdır. JOIN'lar genellikle verileri birleştirmek için daha performanslıdır, alt sorgular ise belirli bir koşulu dinamik olarak belirlemek veya karmaşık filtrelemeler yapmak için daha esnektir.
Korelasyonlu alt sorgular neden performans sorunlarına yol açar?
Cevap: Korelasyonlu alt sorgular, ana sorgudaki her satır için tekrar tekrar çalıştırılır. Eğer ana sorgu binlerce veya milyonlarca satır içeriyorsa, alt sorgu da o kadar çok kez yürütülür ve bu da sorgunun toplam yürütme süresini önemli ölçüde artırabilir. Bu durum, özellikle alt sorgunun kendisi yoğun bir hesaplama gerektiriyorsa daha da kötüleşir.
Ne zaman bir alt sorgu yerine CTE (Ortak Tablo İfadesi) kullanmalıyım?
Cevap: CTE'leri, sorgunuzu daha okunabilir, modüler hale getirmek ve karmaşık iş mantığını adım adım parçalara ayırmak istediğinizde tercih etmelisiniz. Ayrıca, aynı alt sorguyu ana sorgu içinde birden fazla kez kullanmanız gerektiğinde CTE'ler kod tekrarını önler. Özyinelemeli sorgular gibi özel senaryolar için de CTE'ler vazgeçilmezdir. Performans açısından da bazı durumlarda alt sorgulardan daha iyi olabilirler.
WHERE IN ile WHERE EXISTS arasındaki fark nedir ve hangisi daha performanslıdır?
Cevap: Her ikisi de alt sorgunun döndürdüğü kümede bir değerin varlığını kontrol eder. WHERE IN, alt sorgunun tüm sonuçlarını belleğe yükler ve ardından ana sorgudaki değeri bu küme içinde arar. WHERE EXISTS ise, alt sorgunun herhangi bir satır döndürüp döndürmediğini kontrol eder ve ilk eşleşmeyi bulduğunda alt sorguyu durdurabilir. Genellikle, alt sorgu çok sayıda satır döndürüyorsa veya alt sorgu ana sorguyla korelasyonlu ise EXISTS daha performanslıdır çünkü daha az kaynak tüketir ve daha erken durabilir. Küçük ve sınırlı sonuç kümeleri için IN de uygun olabilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

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

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık