SQL'de Bağıntılı (Correlated) Alt Sorgu: Nasıl Çalışır? Örneklerle Açıklama
Bağıntılı alt sorguların SQL'de satır satır karşılaştırmaları nasıl yaptığını öğrenin. Kullanım alanlarını keşfedin ve JOIN'ler, pencere fonksiyonları veya bağıntısız sorgulardan farklarını görün.
İlişkisel veritabanlarında satırlar çoğu zaman birbirine bağımlıdır ve karmaşık bir soruyu yanıtlamak, sorgunun işlediği tabloya tekrar bakmasını gerektirebilir.
Bu tür tabloları sorgulamak için SQL, iç sorgunun dış sorgudaki değerlere bağlı olduğu belirli bir ilişki tanımlayan bağıntılı alt sorgular kullanmanıza olanak tanır. Standart bir alt sorgu bir kez çalışıp biterken, bağıntılı bir alt sorgu dinamiktir; ana sorgunun değerlendirdiği her bir satır için tekrar tekrar yürütülür.
Bu eğitimde, SQL'de bağıntılı bir alt sorgunun nasıl çalıştığını, performansla ilgili hususları ve JOIN'ler ile pencere fonksiyonlarına kıyasla ne zaman doğru tercih olduğunu açıklayacağım. SQL'e yeniyseniz, SQL'e Giriş kursumuzla başlayın; biraz deneyiminiz varsa Orta Düzey SQL kursunu tercih edebilirsiniz.
Bağıntılı Alt Sorgu Nedir?
Bağıntılı alt sorgu, çalışmak için dış sorgudaki değerlere bağlı olan bir alt sorgu türüdür.
Bir kez çalışıp sabit bir sonuç döndürmek yerine, alt sorgu dış sorgunun işlediği her satır için bir kez değerlendirilir. Bunun nedeni, iç sorgunun dış sorgudan bir sütuna atıfta bulunması ve iki sorgu arasında doğrudan bir bağ kurmasıdır.
Karşılaştırma yapmak gerekirse, bağıntısız bir alt sorgu dış sorgudan bağımsız olarak çalışır. Bir kez yürütülür, bir sonuç kümesi veya değer döndürür ve dış sorgu bu sonucu alt sorguyu her satır için yeniden çalıştırmadan kullanır.
Bağıntılı Alt Sorgu Nasıl Çalışır
SQL'de tipik bir bağıntılı alt sorgunun iş akışı şöyledir:
Bağıntılı alt sorgu nasıl çalışır. Görsel: Gemini.
Dış sorgu bir satır seçer: SQL dış sorgunun tablosunu taramaya başlar ve ilk satırı seçer.
Atıf (referans verme): İç sorgu çoğunlukla bir takma ad (alias) kullanarak o belirli satırdan bir değer çeker.
Yürütme: İç sorgu bu değeri kullanarak çalışır.
Filtre/güncelleme: Sonuç, satırın dahil edilip edilmeyeceğine karar vermesi için dış sorguya geri iletilir.
Yineleme: İşlem, tablo bitene kadar bir sonraki satır için tekrar eder.
SQL'de Bağıntılı Alt Sorgu Örneği
Şimdiye kadar anlattıklarım kavramsaldı. Öğrenmenin en iyi yolu örnekler üzerinde çalışmaktır.
Örnek 1: Bölüm ortalamasının üzerinde kazanan çalışanlar
Elinizde çalışan maaşları ve bölüm kimliklerinin bulunduğu bir employees tablosu olduğunu varsayalım. Amacınız, kendi bölümlerindeki ortalama maaştan fazla kazanan çalışanları bulmaktır.
Aşağıdaki sorguyu kullanacaksınız; burada:
Dış sorgu employees tablosundan çalışanları seçer.
Alt sorgu, aynı bölüm için ortalama maaşı hesaplar.
e2.department_id = e.department_id koşulu, dış sorgu takma adı olan e'ye atıfta bulunur.
-- Fetch employees earning more than the average salary in deptSELECT
e.employee_id,
e.employee_name,
e.salary,
e.department_id
FROM employees e
WHERE e.salary >(SELECTAVG(e2.salary)-- Calculate the average salaryFROM employees e2
WHERE e2.department_id = e.department_id
-- Correlation: references the outer query's department_id);Altyapı:
Örnek 2: Bağıntılı alt sorguyla EXISTS() kullanmak
Ayrıca, bağıntılı bir alt sorguyla EXISTS() işleçini kullanarak başka bir tabloda ilişkili kayıtların var olup olmadığını kontrol edebilirsiniz.
Diyelim ki customers ve orders tablolarında kayıtlar var. En az bir sipariş vermiş müşterileri listelemek istiyorsunuz. Aşağıdaki sorguyu kullanacaksınız; burada:
customers tablosundaki satırları dış sorgu tarar.
Alt sorgu, o müşteri için en az bir sipariş olup olmadığını kontrol eder.
o.customer_id = c.customer_id koşulu, alt sorguyu dış sorguya bağlar.
-- Fetch customers with at least one orderSELECT
c.customer_id,
c.customer_name
FROM customers c
WHEREEXISTS(SELECT1FROM orders o
WHERE o.customer_id = c.customer_id
-- Correlation: references the outer query customer_id);Altyapı:
Yukarıdaki sorguda, SQL siparişler tablosunda eşleşen bir satır olup olmadığını kontrol eder. Varsa, EXISTS() işleci true döndürür ve müşteri sonuca dahil edilir.
Bağıntılı ve Bağıntısız Alt Sorgular
Daha önce öğrendiğimiz gibi, SQL'deki alt sorgular bağıntısız veya bağıntılı alt sorgular olarak ikiye ayrılır. Temel fark, iç sorgunun dış sorguya bağlı olup olmamasıdır.
Bağıntısız bir alt sorgu için veritabanı onu bir kez çalıştırır, ardından sonucu dış sorguda kullanır.
Örneğin, aşağıdaki sorgu genel ortalama maaştan fazla kazanan çalışanları bulur.
-- Query employees who earn more than the overall average salarySELECT
employee_id,
employee_name,
salary
FROM employees
WHERE salary >(SELECTAVG(salary)FROM employees
);Altyapı:
Yukarıdaki sorguda, alt sorgu tüm tablo için ortalama maaşı hesaplar ve tek sefer çalışır. Dış sorgu daha sonra her çalışanın maaşını bu tek değere göre karşılaştırır.
Bağıntısız alt sorgular bir kez çalıştığından, sonucu yeniden kullanılabildiğinde genellikle daha hızlıdır. Genel ortalamalar ve toplamlar gibi küresel karşılaştırmalar için en uygunudur.
Buna karşın, bağıntılı alt sorgular büyük tablolar üzerinde daha yavaş olabilir. Koşulların her bir satıra göre değerlendirilmesi gerektiğinde, örneğin bölüm düzeyinde karşılaştırmalar veya varlık kontrollerinde kullanışlı hale gelirler.
Gruplama ve veri toplamayı, ayrıca tabloları birleştirmeyi daha fazla öğrenmek için SQL Server'a Giriş kursumuzu öneririm.
Bağıntılı Alt Sorgu vs. JOIN
Birçok bağıntılı alt sorgu, JOIN kullanılarak yeniden yazılabilir. İlişkisel veritabanlarında JOIN'ler genellikle daha iyi performans gösterir çünkü veritabanı ilişkileri satır satır yerine küme bazında işleyebilir.
Aşağıdaki, bağıntılı bir alt sorgu kullanan sorguyu ele alın. Bu sorgu, bölümünde ortalama maaşın üzerinde ücret alan çalışanları listeler
-- Use subquery to fetch employees earning more than the average salary in deptSELECT
e.employee_id,
e.employee_name,
e.salary,
e.department_id
FROM employees e
WHERE e.salary >(SELECTAVG(e2.salary)FROM employees e2
WHERE e2.department_id = e.department_id
);Altyapı:
Aynı sonuçları üretmek için sorguyu JOIN ifadesini kullanarak yeniden yazabilirsiniz.
-- Use JOIN to fetch employees earning more than the average salary in deptSELECT
e.employee_id,
e.employee_name,
e.salary,
e.department_id
FROM employees e
JOIN(SELECT
department_id,AVG(salary)AS avg_salary
FROM employees
GROUPBY department_id
-- Precompute the department average once per department) dept_avg
ON e.department_id = dept_avg.department_id
-- Match employees with their department averagesWHERE e.salary > dept_avg.avg_salary;-- Compare salary with the computed department averageAltyapı:
Aşağıdaki tablo, SQL'de bağıntılı alt sorgular ile JOIN arasındaki farkları özetler.
Özellik
Bağıntılı Alt Sorgu
JOIN
Okunabilirlik
Mantık doğrudan WHERE koşulunda ifade edildiği için sıklıkla okumak daha kolaydır.
Türemiş tablolar veya CTE'ler gerektirebileceğinden biraz daha karmaşık olabilir.
Mantık İfadesi
Koşulları doğal biçimde ifade eder. Örneğin, “maaş bölüm ortalamasından büyük”.
Önce toplulaştırılmış değerlerin hesaplanmasını, ardından ana tabloyla birleştirilmesini gerektirir.
Yürütme Davranışı
Alt sorgu, dış sorgudaki her satır için bir kez çalışabilir.
Toplu sonuçlar genellikle bir kez hesaplanır ve yeniden kullanılır.
Performans
Tekrarlı çalışmadan ötürü büyük veri kümelerinde daha yavaş olabilir.
Genellikle büyük tablolar için daha verimlidir.
Yaygın Kullanım Alanları
EXISTS() ile ilişkili veri kontrolü, satır bazlı toplamlarla karşılaştırmalar veya satıra özel koşulların denetlenmesi.
Raporlama sorguları, toplulaştırmalar ve performans hassas iş yükleri.
SQL'de farklı JOIN türlerini ve veritabanındaki farklı ilişkili tablolarla nasıl çalışılacağını öğrenmek için şu
Modern SQL'de, pencere fonksiyonları olan AVG() ve OVER (PARTITION BY) gibi fonksiyonlar, tek bir taramada satır başına toplulaştırma hesaplayabilir.
Örneğin aşağıdaki sorgu, maaşı bölümünün ortalama maaşından yüksek olan çalışanları döndürür. Alt sorgu içinde, toplulaştırmayı bir pencere fonksiyonuna dönüştürmek için OVER () ve tabloyu bölümlere ayırmak için PARTITION BY department_id kullanılır.
-- Use window function to get employees earning more than dept average salarySELECT
employee_id,
employee_name,
salary,
department_id
FROM(SELECT
employee_id,
employee_name,
salary,
department_id,AVG(salary)OVER(PARTITIONBY department_id)AS dept_avg_salary
-- Window function calculates department average once per partitionFROM employees
) t
WHERE salary > dept_avg_salary;Altyapı:
Bununla birlikte, tablolar arasındaki ilişkileri test etmek için EXISTS() veya NOT EXISTS() kullanmak istediğinizde bağıntılı alt sorgular hâlâ kullanışlıdır. Ayrıca pencere fonksiyonlarının bulunmadığı veritabanlarında veya durumlarda bağıntılı alt sorgular kullanabilirsiniz.
Bağıntılı Alt Sorgu Performansı
Bağıntılı alt sorgular güçlü olmakla birlikte, sıklıkla bazı performans sorunlarını beraberinde getirir.
Bağıntılı alt sorgular tekrar tekrar çalışır
Sorgu dış sorgudaki her satır için bir kez çalıştığından, iç veriyi defalarca yeniden tarayarak büyük tablolarda sorguyu yavaşlatabilir. Dış tablonuzda 100.000 satır varsa, veritabanı 100.000 alt görev gerçekleştirir.
Darboğazlar
Doğru optimizasyon yapılmazsa, bağıntılı sorgular yüksek CPU kullanımı ve uzun bekleme sürelerine yol açabilir; özellikle iç sorgu karmaşık hesaplamalar yapıyorsa veya büyük tabloları tarıyorsa.
Sütunları indekslemek
Bağıntıda kullanılan sütunları indekslemek, veritabanının alt sorguda ilgili satırı tüm iç tabloyu her seferinde taramak yerine neredeyse anında bulmasına yardımcı olur.
Sorgu Planlayıcı optimizasyonu
Modern veritabanları çoğu zaman bağıntılı alt sorguları dahili olarak optimize eder. Sorgu planlayıcı, sorguyu bir JOIN'e veya önbelleğe alınmış bir toplulaştırmaya dönüştürerek daha verimli bir hale getirebilir ve sorgu süresini önemli ölçüde azaltabilir.
Bağıntılı Alt Sorguyu Ne Zaman Kullanmalı
Aşağıdaki durumlarda bağıntılı alt sorguları kullanabilirsiniz:
Satıra özgü toplamlarla filtreleme: Bir değeri her satıra göre kıyaslamanız gerektiğinde kullanın; örneğin, bölüm ortalamasının üzerinde kazanan çalışanlar.
EXISTS() ile ilişkili veriyi kontrol etmek: İlişkili satırların var olup olmadığını test etmek için EXISTS() ile bağıntılı alt sorgular kullanabilirsiniz.
Karmaşık iç içe mantığı ifade etmek: Bağıntılı alt sorgular, uzun JOIN zincirlerine kıyasla karmaşık koşulları okumayı ve ifade etmeyi kolaylaştırabilir.
Şu durumlarda ise bağıntılı alt sorgulardan kaçının:
Basit bir JOIN iş görüyorsa: Aynı sonucu bir LEFT JOIN veya INNER JOIN ile elde edebiliyorsanız bunu kullanın; her zaman daha hızlı olacaktır.
Büyük verilerle çalışırken: Bağıntılı koşul indekslenmemiş büyük tablolara başvuruyorsa, tekrarlı değerlendirmeler sorguyu ciddi biçimde yavaşlatabilir.
Bağıntılı Alt Sorgularda Yaygın Hatalar
Bağıntılı alt sorguları kullanırken karşılaşabileceğiniz yaygın sorunlardan bazıları ve nasıl giderebileceğiniz şöyledir:
Bağıntı koşulunu unutmak: Bağıntılı bir alt sorgu, dış sorgudan bir sütuna atıfta bulunmalıdır. Bu koşul eksikse, alt sorgu bağımsız hale gelir ve yanlış sonuçlar üretebilir.
Yürütme sırasını yanlış anlamak: Her zaman dış sorgunun önce, iç sorgunun sonra çalıştığını unutmayın. Bunu kafanızda tersine çevirmek hatalı sonuçlara yol açabilir.
Gereksiz iç içe geçirme: Bazen basit bir değeri, standart bir alt sorgunun yeterli olacağı yerde bağıntılı bir alt sorguyla sarmalayabilirsiniz. İç sorgunun çalışması için dış satıra ihtiyacı yoksa, performans için bağıntıyı kaldırın.
Performans etkisini göz ardı etmek: Bağıntılı alt sorgular küçük veri kümelerinde mükemmel çalışabilir, ancak tablolar büyüdükçe yavaşlayabilir. Bunu önlemek için sorgularınızı gerçekçi veri boyutlarıyla test edin ve performans sorun olursa indekslemeyi veya sorguyu yeniden yazmayı düşünün.
Sonuç
Bağıntılı alt sorguları ne zaman ve nasıl kullanacağınızı, ne zaman da diğer tekniklerle değiştireceğinizi öğrenmek; net ve verimli SQL sorguları yazmak için önemli bir beceridir.
Bir sonraki adım olarak, veri analizi için SQL kullanımındaki yetkinliğinizi göstermek ve diğer veri profesyonelleri arasından sıyrılmak için SQL Associate Sertifikasyonunu almanızı öneririm. Son olarak, veritabanları oluşturmayı ve yönetmeyi, ayrıca ihtiyaçlarınıza uygun VTYS'yi seçmeyi öğreneceğiniz Veritabanı Tasarımı kursumuzu tavsiye ederim.
Veri analitiği, iş zekâsı ve veri bilimi alanlarında pratik deneyime sahip Veri Bilimi Teknik Yazarı. SQL, Python, Power BI, Databricks ve veri mühendisliği üzerine, gerçek dünya analitik çalışmalarına dayanan, uygulamaya dönük ve sektöre odaklı içerikler yazıyorum. Yazılarım teknik derinlikle iş etkisi arasındaki köprüyü kurarak profesyonellerin veriyi güvenle karara dönüştürmelerine yardımcı olur.
SSS
Bağıntılı bir alt sorgu, sıradan bir alt sorgudan nasıl farklıdır?⌄
Düzenli (bağıntısız) bir alt sorgu bağımsız çalışır ve genellikle bir kez yürütülür; bağıntılı bir alt sorgu ise dış sorguya bağlıdır ve her satır için tekrar tekrar yürütülebilir.
Bağıntılı alt sorgular tüm SQL veritabanlarında destekleniyor mu?⌄
Evet. Bağıntılı alt sorgular standart SQL dilinin bir parçasıdır ve PostgreSQL, MySQL, SQL Server ve Oracle dâhil çoğu ilişkisel veritabanı sistemi tarafından desteklenir.
Bağıntı koşulunu unutursam ne olur?⌄
Alt sorgu bağıntısız hale gelir, tüm satırlara karşı bir kez çalışır ve büyük olasılıkla hatalı sonuçlar üretir.
Bağıntılı alt sorgular her zaman JOIN'lerle değiştirilebilir mi?⌄
Her zaman değil, ancak birçok bağıntılı alt sorgu JOIN'ler veya toplulaştırmalar kullanılarak yeniden yazılabilir. Büyük veri kümelerinde performans için genellikle JOIN'ler tercih edilir.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
İlişkisel veritabanlarında satırlar çoğu zaman birbirine bağımlıdır ve karmaşık bir soruyu yanıtlamak, sorgunun işlediği tabloya tekrar bakmasını gerektirebilir.
Bu tür tabloları sorgulamak için SQL, iç sorgunun dış sorgudaki değerlere bağlı olduğu belirli bir ilişki tanımlayan bağıntılı alt sorgular kullanmanıza olanak tanır. Standart bir alt sorgu bir kez çalışıp biterken, bağıntılı bir alt sorgu dinamiktir; ana sorgunun değerlendirdiği her bir satır için tekrar tekrar yürütülür.
Bu eğitimde, SQL'de bağıntılı bir alt sorgunun nasıl çalıştığını, performansla ilgili hususları ve JOIN'ler ile pencere fonksiyonlarına kıyasla ne zaman doğru tercih olduğunu açıklayacağım. SQL'e yeniyseniz, SQL'e Giriş kursumuzla başlayın; biraz deneyiminiz varsa Orta Düzey SQL kursunu tercih edebilirsiniz.
Bağıntılı Alt Sorgu Nedir?
Bağıntılı alt sorgu, çalışmak için dış sorgudaki değerlere bağlı olan bir alt sorgu türüdür.
Bir kez çalışıp sabit bir sonuç döndürmek yerine, alt sorgu dış sorgunun işlediği her satır için bir kez değerlendirilir. Bunun nedeni, iç sorgunun dış sorgudan bir sütuna atıfta bulunması ve iki sorgu arasında doğrudan bir bağ kurmasıdır.
Karşılaştırma yapmak gerekirse, bağıntısız bir alt sorgu dış sorgudan bağımsız olarak çalışır. Bir kez yürütülür, bir sonuç kümesi veya değer döndürür ve dış sorgu bu sonucu alt sorguyu her satır için yeniden çalıştırmadan kullanır.
Bağıntılı Alt Sorgu Nasıl Çalışır
SQL'de tipik bir bağıntılı alt sorgunun iş akışı şöyledir:
Bağıntılı alt sorgu nasıl çalışır. Görsel: Gemini.
SQL'de Bağıntılı Alt Sorgu Örneği
Şimdiye kadar anlattıklarım kavramsaldı. Öğrenmenin en iyi yolu örnekler üzerinde çalışmaktır.
Örnek 1: Bölüm ortalamasının üzerinde kazanan çalışanlar
Elinizde çalışan maaşları ve bölüm kimliklerinin bulunduğu bir
employeestablosu olduğunu varsayalım. Amacınız, kendi bölümlerindeki ortalama maaştan fazla kazanan çalışanları bulmaktır.Aşağıdaki sorguyu kullanacaksınız; burada:
Dış sorgu
employeestablosundan çalışanları seçer.Alt sorgu, aynı bölüm için ortalama maaşı hesaplar.
e2.department_id = e.department_idkoşulu, dış sorgu takma adı olane'ye atıfta bulunur.Örnek 2: Bağıntılı alt sorguyla EXISTS() kullanmak
Ayrıca, bağıntılı bir alt sorguyla EXISTS() işleçini kullanarak başka bir tabloda ilişkili kayıtların var olup olmadığını kontrol edebilirsiniz.
Diyelim ki
customersveorderstablolarında kayıtlar var. En az bir sipariş vermiş müşterileri listelemek istiyorsunuz. Aşağıdaki sorguyu kullanacaksınız; burada:customerstablosundaki satırları dış sorgu tarar.Alt sorgu, o müşteri için en az bir sipariş olup olmadığını kontrol eder.
o.customer_id = c.customer_idkoşulu, alt sorguyu dış sorguya bağlar.Yukarıdaki sorguda, SQL siparişler tablosunda eşleşen bir satır olup olmadığını kontrol eder. Varsa,
EXISTS()işleci true döndürür ve müşteri sonuca dahil edilir.Bağıntılı ve Bağıntısız Alt Sorgular
Daha önce öğrendiğimiz gibi, SQL'deki alt sorgular bağıntısız veya bağıntılı alt sorgular olarak ikiye ayrılır. Temel fark, iç sorgunun dış sorguya bağlı olup olmamasıdır.
Bağıntısız bir alt sorgu için veritabanı onu bir kez çalıştırır, ardından sonucu dış sorguda kullanır.
Örneğin, aşağıdaki sorgu genel ortalama maaştan fazla kazanan çalışanları bulur.
Yukarıdaki sorguda, alt sorgu tüm tablo için ortalama maaşı hesaplar ve tek sefer çalışır. Dış sorgu daha sonra her çalışanın maaşını bu tek değere göre karşılaştırır.
Bağıntısız alt sorgular bir kez çalıştığından, sonucu yeniden kullanılabildiğinde genellikle daha hızlıdır. Genel ortalamalar ve toplamlar gibi küresel karşılaştırmalar için en uygunudur.
Buna karşın, bağıntılı alt sorgular büyük tablolar üzerinde daha yavaş olabilir. Koşulların her bir satıra göre değerlendirilmesi gerektiğinde, örneğin bölüm düzeyinde karşılaştırmalar veya varlık kontrollerinde kullanışlı hale gelirler.
Gruplama ve veri toplamayı, ayrıca tabloları birleştirmeyi daha fazla öğrenmek için SQL Server'a Giriş kursumuzu öneririm.
Bağıntılı Alt Sorgu vs. JOIN
Birçok bağıntılı alt sorgu, JOIN kullanılarak yeniden yazılabilir. İlişkisel veritabanlarında JOIN'ler genellikle daha iyi performans gösterir çünkü veritabanı ilişkileri satır satır yerine küme bazında işleyebilir.
Aşağıdaki, bağıntılı bir alt sorgu kullanan sorguyu ele alın. Bu sorgu, bölümünde ortalama maaşın üzerinde ücret alan çalışanları listeler
Aynı sonuçları üretmek için sorguyu
JOINifadesini kullanarak yeniden yazabilirsiniz.Aşağıdaki tablo, SQL'de bağıntılı alt sorgular ile JOIN arasındaki farkları özetler.
Özellik
Bağıntılı Alt Sorgu
JOIN
Okunabilirlik
Mantık doğrudan
WHEREkoşulunda ifade edildiği için sıklıkla okumak daha kolaydır.Türemiş tablolar veya CTE'ler gerektirebileceğinden biraz daha karmaşık olabilir.
Mantık İfadesi
Koşulları doğal biçimde ifade eder. Örneğin, “maaş bölüm ortalamasından büyük”.
Önce toplulaştırılmış değerlerin hesaplanmasını, ardından ana tabloyla birleştirilmesini gerektirir.
Yürütme Davranışı
Alt sorgu, dış sorgudaki her satır için bir kez çalışabilir.
Toplu sonuçlar genellikle bir kez hesaplanır ve yeniden kullanılır.
Performans
Tekrarlı çalışmadan ötürü büyük veri kümelerinde daha yavaş olabilir.
Genellikle büyük tablolar için daha verimlidir.
Yaygın Kullanım Alanları
EXISTS()ile ilişkili veri kontrolü, satır bazlı toplamlarla karşılaştırmalar veya satıra özel koşulların denetlenmesi.Raporlama sorguları, toplulaştırmalar ve performans hassas iş yükleri.
SQL'de farklı JOIN türlerini ve veritabanındaki farklı ilişkili tablolarla nasıl çalışılacağını öğrenmek için şu
SQL'de Verileri Birleştirme kursumuzu öneririm.
Bağıntılı Alt Sorgu vs. Pencere Fonksiyonları
Modern SQL'de, pencere fonksiyonları olan
AVG()veOVER (PARTITION BY)gibi fonksiyonlar, tek bir taramada satır başına toplulaştırma hesaplayabilir.Örneğin aşağıdaki sorgu, maaşı bölümünün ortalama maaşından yüksek olan çalışanları döndürür. Alt sorgu içinde, toplulaştırmayı bir pencere fonksiyonuna dönüştürmek için
OVER ()ve tabloyu bölümlere ayırmak içinPARTITION BY department_idkullanılır.Bununla birlikte, tablolar arasındaki ilişkileri test etmek için
EXISTS()veyaNOT EXISTS()kullanmak istediğinizde bağıntılı alt sorgular hâlâ kullanışlıdır. Ayrıca pencere fonksiyonlarının bulunmadığı veritabanlarında veya durumlarda bağıntılı alt sorgular kullanabilirsiniz.Bağıntılı Alt Sorgu Performansı
Bağıntılı alt sorgular güçlü olmakla birlikte, sıklıkla bazı performans sorunlarını beraberinde getirir.
Bağıntılı alt sorgular tekrar tekrar çalışır
Sorgu dış sorgudaki her satır için bir kez çalıştığından, iç veriyi defalarca yeniden tarayarak büyük tablolarda sorguyu yavaşlatabilir. Dış tablonuzda 100.000 satır varsa, veritabanı 100.000 alt görev gerçekleştirir.
Darboğazlar
Doğru optimizasyon yapılmazsa, bağıntılı sorgular yüksek CPU kullanımı ve uzun bekleme sürelerine yol açabilir; özellikle iç sorgu karmaşık hesaplamalar yapıyorsa veya büyük tabloları tarıyorsa.
Sütunları indekslemek
Bağıntıda kullanılan sütunları indekslemek, veritabanının alt sorguda ilgili satırı tüm iç tabloyu her seferinde taramak yerine neredeyse anında bulmasına yardımcı olur.
Sorgu Planlayıcı optimizasyonu
Modern veritabanları çoğu zaman bağıntılı alt sorguları dahili olarak optimize eder. Sorgu planlayıcı, sorguyu bir JOIN'e veya önbelleğe alınmış bir toplulaştırmaya dönüştürerek daha verimli bir hale getirebilir ve sorgu süresini önemli ölçüde azaltabilir.
Bağıntılı Alt Sorguyu Ne Zaman Kullanmalı
Aşağıdaki durumlarda bağıntılı alt sorguları kullanabilirsiniz:
Satıra özgü toplamlarla filtreleme: Bir değeri her satıra göre kıyaslamanız gerektiğinde kullanın; örneğin, bölüm ortalamasının üzerinde kazanan çalışanlar.
EXISTS() ile ilişkili veriyi kontrol etmek: İlişkili satırların var olup olmadığını test etmek için
EXISTS()ile bağıntılı alt sorgular kullanabilirsiniz.Karmaşık iç içe mantığı ifade etmek: Bağıntılı alt sorgular, uzun
JOINzincirlerine kıyasla karmaşık koşulları okumayı ve ifade etmeyi kolaylaştırabilir.Şu durumlarda ise bağıntılı alt sorgulardan kaçının:
Basit bir JOIN iş görüyorsa: Aynı sonucu bir
LEFT JOINveyaINNER JOINile elde edebiliyorsanız bunu kullanın; her zaman daha hızlı olacaktır.Büyük verilerle çalışırken: Bağıntılı koşul indekslenmemiş büyük tablolara başvuruyorsa, tekrarlı değerlendirmeler sorguyu ciddi biçimde yavaşlatabilir.
Bağıntılı Alt Sorgularda Yaygın Hatalar
Bağıntılı alt sorguları kullanırken karşılaşabileceğiniz yaygın sorunlardan bazıları ve nasıl giderebileceğiniz şöyledir:
Sonuç
Bağıntılı alt sorguları ne zaman ve nasıl kullanacağınızı, ne zaman da diğer tekniklerle değiştireceğinizi öğrenmek; net ve verimli SQL sorguları yazmak için önemli bir beceridir.
Bir sonraki adım olarak, veri analizi için SQL kullanımındaki yetkinliğinizi göstermek ve diğer veri profesyonelleri arasından sıyrılmak için SQL Associate Sertifikasyonunu almanızı öneririm. Son olarak, veritabanları oluşturmayı ve yönetmeyi, ayrıca ihtiyaçlarınıza uygun VTYS'yi seçmeyi öğreneceğiniz Veritabanı Tasarımı kursumuzu tavsiye ederim.