Common Table Expressions (CTE) olarak bilinen SQL yapısı, karmaşık sorguları daha basit parçalara ayırarak hem okunabilirliği artırır hem de sorgunun performansını iyileştirebilir. CTE’ler, geçici bir sonuç kümesi oluşturarak bu sonuç kümesini sanki bir tabloymuş gibi diğer sorgularda kullanmamıza olanak tanır. Özellikle hiyerarşik verilerle çalışırken ve tekrar eden alt sorguları kullanırken CTE’ler oldukça faydalıdır.
CTE Nasıl Çalışır
CTE’lerin çalışma mantığı oldukça basittir. Bir sorgunun içinde, WITH anahtar kelimesi kullanılarak geçici bir tablo tanımlanır. Bu geçici tabloya verilen isim, daha sonra sorguda sanki normal bir tabloymuş gibi kullanılabilir. En yalın haliyle adı olan ve bir kez tanımlandığında sorgu içinde her zaman çağırılabilen alt-sorgulardır diyebiliriz. CTE’ler, birden fazla kez tanımlanabilir ve iç içe kullanılabilir. Bu sayede, karmaşık sorguları daha küçük, daha yönetilebilir parçalara ayırarak yazmak mümkün olur.
CTE_gecici_tablo adını verdiğimiz bir örnekte sintax:
WITH
CTE_gecici_tablo AS (
SELECT ...
FROM Table
)
SELECT ...
FROM CTE_gecici_tablo
Örnek1: Giriş
Örnekte satışçıların ortalama bonuslarını bulalım
ÖRNEK 2: TEK CTE
Bulduğumuz sonucu biraz geliştirelim ve ortalama bonuslara göre sapma değerlerini ve sapma oranlarını hesaplayalım.
USE AdventureWorks2019
GO
WITH CTE_AVG_Bonus AS(
SELECT
AVG(Bonus) AS AVG_Bonus
FROM Sales.SalesPerson
)
SELECT
BusinessEntityID,
Bonus,
AVG_Bonus,
Bonus - AVG_Bonus AS Ortalama_Bonusa_Göre_Değişim,
ROUND((Bonus - AVG_Bonus) / AVG_Bonus,2) AS Ortalama_Bonusa_Göre_Sapma
FROM Sales.SalesPerson, CTE_AVG_Bonus
WHERE Bonus > 0
ÖRNEK 3: Birden fazla CTE ve CTE JOIN
Aralarına virgül koymak kaydıyla, birden fazla CTE tanımlanabilir. Diyelim ki, satışçıların, toplam yıllık satışlar içindeki %’lerini hesaplamak için iki adet CTE tanımlamak istiyoruz.
- Yıllara göre satış tutarlarını döndüren bir tablo
- Satışçıların yıllar içinde yaptıkları satışlar
WITH CTE_Yıl_Total AS(
SELECT
YEAR(orderdate) AS Yıl_S_P,
SUM(SubTotal) AS Yıl_Toplam_Tutar
FROM Sales.SalesOrderHeader
GROUP BY YEAR(OrderDate)
),
-----------------------------------------
Satışçı_Tutar AS(
SELECT
YEAR(OrderDate) AS Yıl_SOH,
SalesPersonID,
SUM(SubTotal) AS Satışçı_Tutar
FROM Sales.SalesOrderHeader AS SOH
GROUP BY SalesPersonID, YEAR(OrderDate)
)
-----------------------------------------
SELECT
SalesPersonID,
Yıl_SOH,
ROUND(Satışçı_Tutar / Yıl_Toplam_Tutar,2) AS Satışçı_Yıl_İçindeki_Payı
FROM Satışçı_Tutar st
JOIN CTE_Yıl_Total cte on cte.Yıl_S_P = st.Yıl_SOH
ORDER BY Yıl_SOH
CTE’lerin Kullanım Alanları:
Hiyerarşik Veriler: Çalışanların yöneticileri, ürün kategorileri gibi hiyerarşik yapıdaki verileri sorgulamak için idealdir.
Tekrar Eden Alt Sorgular: Aynı alt sorguyu birden fazla kez kullanmak yerine, CTE oluşturarak bu sorguyu bir kez tanımlayıp tekrar tekrar referans verilebilir.
Karmaşık Sorguları Basitleştirme: İç içe geçmiş alt sorguların olduğu durumlarda, CTE’ler sorguyu daha okunaklı hale getirir.
Rekürsif Sorgular: CTE’ler, kendi kendini referans alarak tekrarlayan işlemler yapabilen rekürsif sorgular oluşturmak için kullanılabilir.
Sonuç
SQL CTE’ler, daha verimli sorgular yazmaya olanak tanıyan güçlü bir araçtır. Karmaşık sorguları daha basit parçalara ayırarak hem okunabilirliği artırır hem de performansı iyileştirir. Bu yazıda CTE’lerin temel yapısı, kullanım alanları ve avantajları hakkında bilgi vermeye çalıştık. CTE’leri kullanarak daha etkili ve verimli SQL sorguları yazabilirsiniz.