SQL Joins ve Window Fonksiyonları: Analistleri Yeni Başlayanlardan Ayıran Temel Beceriler
Veri, günümüz iş dünyasının en değerli varlıklarından biri haline gelmiştir ve bu veriden anlamlı içgörüler çıkarmak, rekabet avantajı sağlamanın anahtarıdır. İşte bu noktada SQL (Yapısal Sorgu Dili), veri analistlerinin ve bilimcilerinin vazgeçilmez aracı olarak öne çıkar. Ancak, basit SELECT sorguları yazmakla, karmaşık veri setlerini ustaca birleştirip derinlemesine analizler yapabilmek arasında büyük bir fark vardır. Bu makale, bir veri analistini yeni başlayanlardan ayıran iki kritik SQL becerisini, yani SQL JOINs ve Window Fonksiyonlarını derinlemesine inceleyecek ve bu araçların analitik düşünceyi nasıl güçlendirdiğini gözler önüne serecektir.
Veri Analizinde SQL’in Yeri ve Önemi
SQL, ilişkisel veritabanları ile etkileşim kurmak için tasarlanmış standart bir dildir. Veri analistleri için SQL, ham veriyi sorgulamak, filtrelemek, dönüştürmek ve özetlemek için birincil araçtır. Veri tabanlarındaki bilgileri çekmek, raporlar oluşturmak ve iş kararlarını destekleyecek içgörüler sunmak için SQL bilgisi temel bir gerekliliktir.
Neden SQL Öğrenmeliyiz?
SQL, veri tabanları ile doğrudan iletişim kurmanın en etkili yoludur. Excel veya diğer görsel araçların sınırlı kaldığı büyük ve karmaşık veri setlerinde, SQL ile çalışmak çok daha verimli ve güçlüdür. Ayrıca, çoğu veri analizi işi, veriye erişmek ve onu hazırlamak için SQL bilgisi gerektirir.
Basit Sorgulardan Karmaşık Analizlere
SQL öğrenmeye genellikle SELECT, FROM, WHERE, GROUP BY gibi temel komutlarla başlanır. Bu komutlar, belirli koşullara uyan verileri çekmek veya özetlemek için yeterlidir. Ancak gerçek dünya senaryolarında, veriler genellikle birden fazla tabloda dağınık halde bulunur ve bu tabloları anlamlı bir şekilde birleştirmek, daha gelişmiş analizler yapmanın ilk adımıdır.
Veri Okuryazarlığının Temeli
SQL bilgisi, sadece sorgu yazmaktan ibaret değildir; aynı zamanda veri modelini anlama, verinin nasıl yapılandığını bilme ve farklı veri setleri arasındaki ilişkileri kurabilme yeteneğini de içerir. Bu, modern veri okuryazarlığının temel taşlarından biridir.
SQL JOINs: Veri Kümelerini Birleştirmenin Sanatı
Veri tabanları, genellikle veriyi tekrarlamadan saklamak ve bütünlüğü sağlamak için birden fazla tabloya ayrılır. Örneğin, bir e-ticaret sisteminde müşteri bilgileri bir tabloda, sipariş bilgileri başka bir tabloda ve ürün detayları üçüncü bir tabloda olabilir. Bu tabloları birleştirerek “hangi müşteri hangi ürünü ne zaman sipariş etti?” gibi sorulara yanıt bulmak için JOIN’lere ihtiyaç duyarız.
JOIN Nedir ve Neden Kullanılır?
JOIN, iki veya daha fazla tabloyu, aralarındaki ilişkili sütunlar (genellikle anahtar sütunlar) üzerinden birleştirerek tek bir sonuç kümesi oluşturmanızı sağlayan bir SQL komutudur. Bu sayede farklı tablolarda bulunan bilgileri tek bir sorguda bir araya getirebilir ve daha kapsamlı analizler yapabilirsiniz.
İlişkisel Veritabanı Modeli ve JOIN’ler
İlişkisel veritabanı modeli, veriyi tablolar halinde organize eder ve bu tablolar arasında ilişkiler tanımlar. Bu ilişkiler, bir tablodaki birincil anahtarın (Primary Key) başka bir tablonun yabancı anahtarı (Foreign Key) olarak kullanılmasıyla kurulur. JOIN’ler, bu tanımlanmış ilişkileri kullanarak tabloları birleştirir.
Anahtar Kavramlar: Primary ve Foreign Key
- Primary Key (Birincil Anahtar): Bir tablodaki her satırı benzersiz şekilde tanımlayan bir veya daha fazla sütundur. Null değer içeremez ve benzersiz olmalıdır.
- Foreign Key (Yabancı Anahtar): Bir tablodaki bir veya daha fazla sütun olup, başka bir tablodaki birincil anahtara referans verir. Bu, tablolar arasında bir ilişki kurar.
JOIN Türleri ve Pratik Uygulamaları
SQL’de farklı JOIN türleri bulunur ve her birinin kendine özgü kullanım senaryoları vardır. Doğru JOIN türünü seçmek, istediğiniz veri setini elde etmek için kritik öneme sahiptir.
INNER JOIN: Ortak Kesişim
INNER JOIN, birleştirilen tablolarda yalnızca eşleşen satırları döndürür. Her iki tabloda da eşleşen bir değere sahip olmayan satırlar sonuç kümesine dahil edilmez. En sık kullanılan JOIN türüdür.
SELECT
Musteriler.Ad,
Siparisler.SiparisTarihi
FROM
Musteriler
INNER JOIN
Siparisler ON Musteriler.MusteriID = Siparisler.MusteriID;
LEFT (OUTER) JOIN: Sol Tablonun Önceliği
LEFT JOIN, sol tablodaki tüm satırları ve sağ tablodaki eşleşen satırları döndürür. Sol tabloda bir eşleşme bulunamayan satırlar için sağ tablonun sütunları NULL değer alır. "Tüm müşterilerimi ve varsa siparişlerini göster" gibi senaryolar için idealdir.
SELECT
Musteriler.Ad,
Siparisler.SiparisTarihi
FROM
Musteriler
LEFT JOIN
Siparisler ON Musteriler.MusteriID = Siparisler.MusteriID;
RIGHT (OUTER) JOIN: Sağ Tablonun Önceliği
RIGHT JOIN, LEFT JOIN'in tam tersidir. Sağ tablodaki tüm satırları ve sol tablodaki eşleşen satırları döndürür. Sağ tabloda bir eşleşme bulunamayan satırlar için sol tablonun sütunları NULL değer alır. Daha az kullanılır, genellikle LEFT JOIN ile aynı sonucu elde etmek için tabloların sırası değiştirilebilir.
FULL (OUTER) JOIN: Tüm Eşleşmeler ve Eşleşmeyenler
FULL JOIN, her iki tablodaki tüm satırları döndürür. Eşleşen satırlar birleştirilirken, eşleşmeyen satırlar için diğer tablonun sütunları NULL değer alır. Her iki tablodaki tüm veriyi görmek istediğinizde kullanışlıdır.
CROSS JOIN ve SELF JOIN
- CROSS JOIN: İki tablonun tüm satırlarının kartezyen çarpımını döndürür. Yani, birinci tablonun her satırı, ikinci tablonun her satırıyla birleştirilir. Genellikle dikkatli kullanılmalıdır.
- SELF JOIN: Bir tabloyu kendi kendine birleştirme işlemidir. Tablonun içindeki hiyerarşik veya ilişkili verileri (örneğin, çalışan-yönetici ilişkisi) analiz etmek için kullanılır.
SQL Window Fonksiyonlarına Derinlemesine Bakış
JOIN'ler farklı veri kümelerini birleştirirken, Window Fonksiyonları, bir sorgu sonucundaki satırların belirli bir "pencere" (window) içindeki diğer satırlarla ilişkisini analiz etmemizi sağlar. Bu, gruplandırılmış agregasyon fonksiyonlarının (GROUP BY) yapamadığı, ancak her bir satır için ayrı ayrı hesaplamalar yapmamızı gerektiren senaryolarda kritik öneme sahiptir.
Agregasyon Fonksiyonlarının Sınırlılıkları
SUM(), AVG(), COUNT() gibi standart agregasyon fonksiyonları, GROUP BY ile kullanıldığında, sonuç kümesini gruplara ayırır ve her grup için tek bir özet değer döndürür. Bu durumda, orijinal satır detaylarını kaybederiz. Örneğin, her satış işlemi için hem kendi satış miktarını hem de o günkü toplam satışı aynı anda görmek istersek, GROUP BY yetersiz kalır.
Window Fonksiyonları Ne Yapar?
Window Fonksiyonları, bir sorgu sonucundaki her satır için bir hesaplama yapar. Ancak bu hesaplama, tüm sonuç kümesi yerine, OVER() yan tümcesiyle tanımlanan belirli bir satır "penceresi" içinde gerçekleştirilir. En önemlisi, Window Fonksiyonları satırları gruplandırmaz, bu yüzden orijinal satır detayları korunur.
OVER() Yan Tümcesinin Gücü
OVER() yan tümcesi, bir Window Fonksiyonunun hangi satırlar üzerinde çalışacağını tanımlar. İçine aşağıdaki bileşenleri alabilir:
- PARTITION BY: Sonuç kümesini belirli sütunlara göre mantıksal gruplara (pencerelere) ayırır. Her grup içinde fonksiyon bağımsız olarak uygulanır.
- ORDER BY: Pencere içindeki satırların sıralamasını belirler. Bu, sıralamaya bağlı fonksiyonlar (ROW_NUMBER, RANK, LAG, LEAD) için hayati öneme sahiptir.
- ROWS/RANGE: Pencere içindeki satırların kapsamını daha da daraltır (örneğin, mevcut satırdan önceki 3 satır veya belirli bir aralık).
Temel Window Fonksiyonları ve Gerçek Dünya Senaryoları
Window Fonksiyonları, analitik sorguların gücünü katlayarak daha derinlemesine içgörüler elde etmemizi sağlar.
Sıralama Fonksiyonları: ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE()
Bu fonksiyonlar, bir pencere içindeki her satıra bir sıra numarası atar.
- ROW_NUMBER(): Pencere içindeki her satıra benzersiz bir sıra numarası verir.
- RANK(): Aynı değere sahip satırlara aynı sıra numarasını verir ve sonraki sıra numarasını atlar.
- DENSE_RANK(): Aynı değere sahip satırlara aynı sıra numarasını verir ancak sonraki sıra numarasını atlamaz.
- NTILE(n): Pencereyi
neşit gruba böler ve her gruba bir numara atar.
SELECT
CalisanAdi,
Departman,
Maas,
ROW_NUMBER() OVER (PARTITION BY Departman ORDER BY Maas DESC) AS DepartmanMaasSirasi
FROM
Calisanlar;
Değer Fonksiyonları: LAG(), LEAD(), FIRST_VALUE(), LAST_VALUE()
Bu fonksiyonlar, pencere içindeki mevcut satıra göre önceki veya sonraki satırlardaki değerleri almanızı sağlar.
- LAG(sütun, offset, default): Mevcut satırdan
offsetkadar önceki satırdakisütundeğerini döndürür. - LEAD(sütun, offset, default): Mevcut satırdan
offsetkadar sonraki satırdakisütundeğerini döndürür. - FIRST_VALUE(sütun): Pencere içindeki ilk satırdaki
sütundeğerini döndürür. - LAST_VALUE(sütun): Pencere içindeki son satırdaki
sütundeğerini döndürür.
SELECT
SiparisTarihi,
ToplamTutar,
LAG(ToplamTutar, 1, 0) OVER (ORDER BY SiparisTarihi) AS OncekiSiparisTutari
FROM
Siparisler;
Agregasyon Fonksiyonları (Window Bağlamında): SUM(), AVG(), COUNT()
Standart agregasyon fonksiyonları da OVER() yan tümcesiyle kullanıldığında Window Fonksiyonu gibi davranır. Bu, her satır için belirli bir pencere içindeki toplamı, ortalamayı veya sayıyı hesaplamanıza olanak tanır, ancak satırları gruplandırmaz.
SELECT
SatisID,
SatisTarihi,
UrunAdi,
SatisMiktari,
SUM(SatisMiktari) OVER (PARTITION BY SatisTarihi) AS GunlukToplamSatis
FROM
Satislar;
Analitik Yetkinliği Artırmak: JOINs ve Window Fonksiyonlarını Birlikte Kullanım
Gerçek dünya veri analizi projelerinde, JOIN'ler ve Window Fonksiyonları genellikle birlikte kullanılır. Bu kombinasyon, karmaşık iş problemlerine sofistike çözümler üretmenizi sağlar.
Müşteri Davranış Analizi
Müşteri tablolarını sipariş tablolarıyla birleştirerek (JOIN), her müşterinin ilk sipariş tarihini veya en son sipariş tarihini bulabilir (Window Fonksiyonları). Ya da belirli bir müşteri segmentinin ortalama sipariş değerini hesaplayıp, her müşterinin kendi segmentindeki sıralamasını belirleyebilirsiniz.
Satış Performansı Takibi
Ürün satış verilerini kategori veya bölge tablolarıyla birleştirerek, her ürünün kendi kategorisindeki satış sıralamasını (RANK) veya belirli bir dönemdeki kümülatif satış miktarını (SUM OVER) hesaplayabilirsiniz.
Zaman Serisi Analizi
Döviz kurları, stok fiyatları veya günlük sıcaklık verileri gibi zaman serisi verilerinde, LAG() ve LEAD() fonksiyonlarını kullanarak önceki günün değerini veya sonraki günün değerini mevcut satırla karşılaştırabilirsiniz. Bu, trend analizi veya değişim oranlarını hesaplamak için çok güçlüdür.
-- Her müşterinin ilk sipariş tarihini ve toplam sipariş tutarını bulma
SELECT
m.MusteriID,
m.Ad,
MIN(s.SiparisTarihi) OVER (PARTITION BY m.MusteriID) AS IlkSiparisTarihi,
SUM(s.ToplamTutar) OVER (PARTITION BY m.MusteriID) AS MusteriToplamSiparisTutari
FROM
Musteriler m
INNER JOIN
Siparisler s ON m.MusteriID = s.MusteriID;
Analitik Düşünceyi Geliştirmek: Pratik İpuçları
Bu gelişmiş SQL becerilerini öğrenmek, sadece sözdizimini ezberlemekten ibaret değildir; aynı zamanda analitik düşünme biçiminizi de geliştirir.
Problemi Parçalara Ayırmak
Karmaşık bir analiz göreviyle karşılaştığınızda, problemi daha küçük, yönetilebilir parçalara ayırın. Hangi tabloları birleştirmem gerekiyor? Hangi hesaplamaları yapmalıyım? Hangi sıralamayı uygulamalıyım?
Veri Modelini Anlamak
Çalıştığınız veritabanının şemasını ve tablolar arasındaki ilişkileri iyi anlamak, doğru JOIN'leri ve Window Fonksiyonlarını uygulamanın temelidir. Hangi sütunların Primary/Foreign Key olduğunu bilmek, sizi doğru yola yönlendirecektir.
Sorguları Adım Adım Oluşturmak
Büyük ve karmaşık sorguları bir kerede yazmaya çalışmak yerine, her bir parçayı (JOIN, Window Function) ayrı ayrı test ederek ilerleyin. WITH (CTE - Common Table Expression) yapısını kullanarak sorgunuzu daha okunabilir ve yönetilebilir hale getirebilirsiniz.
Sonuç
SQL JOINs ve Window Fonksiyonları, bir veri analistinin araç kutusundaki en güçlü ve ayırt edici becerilerdendir. Basit veri çekme işlemlerinin ötesine geçerek, farklı veri kümelerini birleştirmeyi ve satır düzeyinde karmaşık analizler yapmayı mümkün kılarlar. Bu becerilere hakim olmak, sadece daha etkili sorgular yazmanızı sağlamakla kalmaz, aynı zamanda veriyle ilgili daha derinleşimle sorular sormanıza ve iş dünyası için daha değerli içgörüler üretmenize olanak tanır. Bir analisti yeni başlayanlardan ayıran şey, bu araçları ne kadar ustaca kullandığı ve karmaşık veri problemlerine ne kadar yaratıcı çözümler getirebildiğidir. Sürekli pratik yaparak ve gerçek dünya senaryoları üzerinde çalışarak bu becerilerinizi geliştirmeye devam edin.
SSS (Sık Sorulan Sorular)
JOIN'ler ve Window Fonksiyonları arasındaki temel fark nedir?
JOIN'ler, farklı tabloları birleştirerek tek bir sonuç kümesi oluştururken, Window Fonksiyonları, tek bir sorgu sonucundaki satırların belirli bir "pencere" içindeki diğer satırlarla ilişkisini analiz eder. JOIN'ler veri kümelerini genişletirken, Window Fonksiyonları mevcut veri kümesi içinde satır bazında gelişmiş hesaplamalar yapar ve satır detaylarını korur.
Hangi SQL sürümünde Window Fonksiyonları desteklenir?
Window Fonksiyonları, modern tüm ilişkisel veritabanı yönetim sistemlerinde (RDBMS) geniş ölçüde desteklenmektedir. Bunlar arasında MySQL (8.0 ve üzeri), PostgreSQL, SQL Server, Oracle ve SQLite bulunmaktadır.
Performans açısından nelere dikkat etmeliyiz?
JOIN'ler ve Window Fonksiyonları, büyük veri setlerinde performans sorunlarına yol açabilir. İndeksleme, sorgu optimizasyonu, doğru JOIN türünü seçme ve OVER() yan tümcesinde PARTITION BY ve ORDER BY'ı verimli kullanma gibi tekniklerle performansı artırabilirsiniz. Özellikle PARTITION BY içinde çok fazla farklı değer olması veya çok büyük pencereler üzerinde işlem yapılması performansı olumsuz etkileyebilir.
Bu becerileri geliştirmek için en iyi kaynaklar nelerdir?
Online kurslar (Coursera, Udemy, DataCamp), SQL dokümantasyonları, pratik yapabileceğiniz veri setleri (Kaggle gibi platformlar) ve SQL pratik siteleri (LeetCode SQL, HackerRank SQL) bu becerileri geliştirmek için harika kaynaklardır. En önemlisi, gerçek dünya veri setleri üzerinde bolca pratik yapmaktır.
