SQL CTE (Common Table Expressions): Karmaşık Sorguları Basitleştirmenin Anahtarı

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.