Veri bilimi yolculuğumda, karşıma çıkan en temel becerilerden biri hiç şüphesiz SQL oldu. Veri bilimi ne kadar ileri analitik teknikler içerirse içersin, verinin kaynağına ulaşmak, doğru şekilde işlemek ve analiz için hazırlamak her şeyin başlangıcı. İşte tam burada SQL devreye giriyor. Büyük veri havuzlarında, farklı sistemlerde saklanan veriye hızlıca erişebilmemi, onu süzebilmemi ve doğru biçimde analiz için şekillendirebilmemi sağlayan en etkili araçlardan biri. Veri biliminde güçlü bir temel oluşturmak için, SQL diline hâkim olmanın ne kadar kritik olduğunu her geçen gün daha iyi anlıyorum.
Veriye Erişim ve Temizleme
Bir veri bilimi projesine başlarken, ilk adım her zaman doğru veriye ulaşmaktan geçiyor. Veritabanlarında tutulan milyonlarca satır veri arasında ihtiyacım olanı bulmak için SQL sorgularını kullanıyorum. Basit bir SELECT
komutuyla başladığım bu süreçte, zamanla karmaşık filtrelemeler (WHERE
koşulları), eksik verileri tespit etme ve düzeltme işlemleri (IS NULL
, COALESCE
gibi ifadeler) gibi adımlarla veriyi temizliyorum. Bu aşama, analizimin doğruluğu açısından çok kritik çünkü kirli veriyle yapılan analizler yanlış sonuçlar doğurabiliyor. Temiz, eksiksiz ve doğru veriye ulaşmak, başarılı bir veri analizi için olmazsa olmaz.
Analitik Sorgular ve Veri Analizi
Veriyi temizledikten sonra, sıra onu anlamlandırmaya geliyor. SQL burada sadece veriyi almak için değil, verinin içindeki desenleri, eğilimleri ve ilişkileri keşfetmem için de mükemmel bir araç oluyor. GROUP BY
ile kategorilere ayırıyor, COUNT
, AVG
, SUM
gibi fonksiyonlarla özet bilgiler çıkarıyorum. Bazen alt sorgular (subqueries
) ve pencere fonksiyonları (window functions
) kullanarak daha ileri düzey analizler yapıyorum. Özellikle büyük veri setlerinde hızlı özetler çıkarabilmek, hangi değişkenlerin önemli olduğunu ilk bakışta görmek, proje başında bana büyük avantaj sağlıyor.
Örnek Senaryo: Ürün Satış Analizi
Bir e-ticaret sitesinde çalışıyorum ve yöneticim benden “kategori bazında ürün satış adetlerini ve ortalama satış fiyatlarını” çıkarmamı istiyor.
Veritabanımda şöyle bir tablo var:
Tablo adı: sales
Sütunlar:
sale_id
(satışın ID’si)product_category
(ürün kategorisi)product_name
(ürün adı)sale_price
(satış fiyatı)sale_date
(satış tarihi)
İstediğim özet bilgiyi şöyle bir SQL sorgusuyla alıyorum:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SELECT product_category, COUNT(sale_id) AS total_sales, AVG(sale_price) AS average_price, SUM(sale_price) AS total_revenue FROM sales WHERE sale_date >= '2025-01-01' -- Son 1 yılın verisi GROUP BY product_category ORDER BY total_sales DESC; |
Büyük Veri ile Çalışırken SQL Kullanımı
Veri setleri büyüdükçe, SQL’in sunduğu performans özelliklerinin önemini daha da iyi kavrıyorum. Milyonlarca satır arasında doğru optimizasyonları yapmadan sorgu çalıştırmak neredeyse imkânsız hale geliyor. Bu yüzden, indeks oluşturmayı, doğru JOIN stratejilerini seçmeyi ve sorgularımı optimize etmeyi öğrenmek zorunda kaldım. Ayrıca, günümüzde SQL’in, BigQuery, Snowflake gibi büyük veri platformlarıyla nasıl entegre çalıştığını deneyimlemek de benim için dönüm noktası oldu. Büyük veriyle çalışırken SQL’in sade yapısının, karmaşık veri dünyasında bana nasıl rehberlik ettiğini her seferinde yeniden keşfediyorum.
Örnek Senaryo: Büyük Bir Satış Verisi Üzerinde Analiz
Diyelim ki elimde, milyonlarca satır içeren bir satış tablosu var:
Tablo adı: big_sales_data
Sütunlar:
sale_id
customer_id
product_id
sale_amount
sale_date
region
Bu veriden, son 6 ay içinde her bölge için toplam satış verisini hızlıca çıkarmam isteniyor.
Eğer doğrudan tüm tabloyu sorgularsam, performans sorunları yaşayabilirim.
Bu yüzden bazı önemli optimizasyon tekniklerini kullanarak bir sorgu yazıyorum:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- Büyük veri ortamında optimize sorgu örneği SELECT region, SUM(sale_amount) AS total_sales FROM big_sales_data WHERE sale_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH) -- Sadece son 6 ay GROUP BY region ORDER BY total_sales DESC; |
Temel SQL Kavramları ve Yapıları
Veri bilimi serüvenimde SQL öğrenmeye başladığımda, önce dilin temel yapı taşlarını kavramam gerektiğini fark ettim. SQL’in güçlü dünyasında yol alabilmek için önce temel komutları, veri ilişkilerini ve veri özetleme yöntemlerini öğrenmek şarttı. Her biri bir diğerine bağlı olan bu kavramlar, bana veriyi doğru biçimde okuma ve işleme konusunda sağlam bir zemin oluşturdu.
SELECT, INSERT, UPDATE ve DELETE Komutları
SQL diline ilk adımımı attığımda, dört temel komutla karşılaştım: SELECT
, INSERT
, UPDATE
ve DELETE
.
Veri okuma, veri ekleme, veri güncelleme ve veri silme… Aslında bir veritabanında ihtiyaç duyabileceğim tüm temel işlemleri bu dört komutla gerçekleştirebiliyorum.
Örneğin, bir müşteri veritabanında yeni bir kaydı INSERT
komutuyla ekleyip, yanlış bir bilgiyi UPDATE
ile düzeltiyorum. Eğer verilerde bir hata ya da mükerrerlik varsa, DELETE
komutuyla temizliyorum.
En sık kullandığım ise hiç şüphesiz SELECT
. Çünkü veriye erişmenin, onu analiz etmenin ve anlamlı bilgiler çıkarmanın ilk adımı her zaman doğru bir SELECT
sorgusu yazmakla başlıyor.
SELECT, INSERT, UPDATE ve DELETE Komutları — Örnekler
Senaryo: Bir customers
(müşteriler) tablosu var:sütunlar: customer_id, name, email, country
SELECT — Veri Okuma
1 2 3 4 5 | SELECT name, email FROM customers WHERE country = 'Türkiye'; |
Türkiye’deki tüm müşterilerin adını ve e-posta adresini listeledim.
INSERT — Yeni Veri Ekleme
1 2 3 4 | INSERT INTO customers (name, email, country) VALUES ('Ahmet Yılmaz', 'ahmet@example.com', 'Türkiye'); |
Veritabanına yeni bir müşteri kaydı ekledim.
UPDATE — Var Olan Veriyi Güncelleme
1 2 3 4 5 | UPDATE customers SET email = 'ahmetyilmaz@example.com' WHERE name = 'Ahmet Yılmaz'; |
Ahmet’in yanlış kaydedilmiş e-posta adresini düzelttim.
DELETE — Veri Silme
1 2 3 4 | DELETE FROM customers WHERE email = 'eskiadres@example.com'; |
Artık kullanılmayan bir e-posta adresine sahip müşteriyi veritabanından kaldırdım.
JOIN İşlemleri ile Verileri İlişkilendirme
Veri projelerimde, veriler çoğunlukla birden fazla tabloda saklanıyor. İşte burada JOIN
kavramı devreye giriyor.
İlk kez INNER JOIN
, LEFT JOIN
, RIGHT JOIN
gibi kavramlarla tanıştığımda biraz karmaşık gelmişti, ancak zamanla her birinin nasıl farklı bir veri birleşimi sunduğunu öğrenince işler kolaylaştı.
Örneğin bir tabloda müşteri bilgileri, başka bir tabloda sipariş detayları varsa, bu iki tabloyu JOIN
kullanarak birleştiriyor ve daha zengin analizler yapabiliyorum.JOIN
işlemleri sayesinde, veritabanındaki parçalı bilgileri bir araya getirip, bütünsel bakış açıları yakalamak mümkün oluyor.
Bu beceri, özellikle çok boyutlu veri setleri üzerinde çalışırken bana büyük esneklik sağladı.
JOIN İşlemleri ile Verileri İlişkilendirme — Örnek
Senaryo: customers
ve orders
(siparişler) adında iki tablo var.sütunlar: customers.customer_id, name
sütunlar: orders.order_id, customer_id, order_date, total_amount
INNER JOIN — Müşterileri ve Siparişlerini Birleştirme
1 2 3 4 5 | SELECT customers.name, orders.order_date, orders.total_amount FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id; |
Müşterilerin hangi tarihte, hangi tutarda sipariş verdiğini listeledim.
LEFT JOIN — Sipariş Vermeyen Müşterileri de Gösterme
1 2 3 4 5 | SELECT customers.name, orders.order_date, orders.total_amount FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id; |
Sipariş vermemiş müşteriler de listede olacak şekilde tüm müşteri kayıtlarını çektim.
Gruplama ve Agrega Fonksiyonları (GROUP BY, COUNT, SUM)
SQL’in en keyifli yanlarından biri de, verileri hızlıca gruplandırıp özet bilgiler çıkarabilmek.
Projelerimde sık sık GROUP BY
kullanıyorum; örneğin bir e-ticaret sitesinin satışlarını ülkelere göre gruplayarak toplam cirolarını hesaplıyorum.
Bunun yanında COUNT
fonksiyonuyla bir tabloda kaç adet kayıt olduğunu bulabiliyor, SUM
ile sayısal değerleri toplayabiliyor, AVG
ile ortalamalar çıkarabiliyorum.
Bu fonksiyonlar sayesinde, verinin içindeki temel desenleri daha kolay görebiliyor ve veri setlerini daha anlamlı hale getirebiliyorum.
Özellikle büyük veri setlerinde bu tür özet analizler, detaylara boğulmadan hızlıca içgörü elde etmemi sağlıyor.
Gruplama ve Agrega Fonksiyonları (GROUP BY, COUNT, SUM) — Örnek
Senaryo: orders
(siparişler) tablosu üzerinden çalışıyorum.sütunlar: order_id, customer_id, total_amount, country
GROUP BY ile Ülkelere Göre Satışları Gruplama
1 2 3 4 5 6 | SELECT country, SUM(total_amount) AS total_revenue FROM orders GROUP BY country ORDER BY total_revenue DESC; |
Hangi ülkenin toplamda ne kadar ciro ürettiğini buldum.
COUNT ile Sipariş Sayısını Bulma
1 2 3 4 5 6 | SELECT country, COUNT(order_id) AS total_orders FROM orders GROUP BY country ORDER BY total_orders DESC; |
Her ülkeden kaç sipariş geldiğini analiz ettim.
SUM ile Toplam Gelir Hesaplama
1 2 3 4 | SELECT SUM(total_amount) AS global_revenue FROM orders; |
Tüm dünya genelindeki toplam geliri öğrendim.
AVG ile Ortalama Satış Tutarı
1 2 3 4 | SELECT AVG(total_amount) AS average_order_value FROM orders; |
Bir siparişin ortalama ne kadar değer taşıdığını hesapladım.
Uygulamalı SQL Senaryoları
SQL öğrendikçe, bu dili sadece veriye ulaşmak için değil, doğrudan iş problemlerini çözmek için nasıl kullanabileceğimi keşfettim.
Gerçek hayatta karşılaştığım pek çok veri bilimi senaryosunda, SQL sorguları yazmak, bana hem hızlı çözümler üretti hem de analiz yeteneklerimi geliştirdi.
Özellikle müşteri segmentasyonu, satış verilerinden içgörü çıkarma ve anomalileri tespit etme gibi uygulamalar, SQL’in pratik gücünü en çok hissettiğim alanlar oldu.
Müşteri Segmentasyonu için SQL Kullanımı
Müşteri davranışlarını analiz etmek istediğimde, işe verileri segmentlere ayırarak başlıyorum.
Örneğin, son 6 ay içinde alışveriş yapmış aktif müşterileri belirlemek için bir WHERE
koşuluyla satın alma tarihlerini filtreliyorum.
Sonrasında GROUP BY
ile müşterileri harcama düzeylerine göre sınıflandırıyor, CASE WHEN
ifadeleriyle sadık, orta ve düşük değerli müşteri segmentleri oluşturuyorum.
Bu segmentasyon sayesinde, pazarlama stratejilerini kime nasıl uygulamam gerektiğine dair çok daha net bir yol haritası çıkarabiliyorum.
Örnek Senaryo: Müşteri Segmentasyonu
Tablo adı: orders
Sütunlar:
order_id
customer_id
order_date
total_amount
Amaç: Son 6 ayda alışveriş yapan aktif müşterileri, harcama düzeylerine göre 3 segmente ayırmak:
- Sadık Müşteriler: 1000 TL ve üzeri harcama yapanlar
- Orta Düzey Müşteriler: 500 TL – 1000 TL arası harcama yapanlar
- Düşük Değerli Müşteriler: 500 TL altı harcama yapanlar
SQL Sorgusu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | SELECT customer_id, SUM(total_amount) AS total_spent, CASE WHEN SUM(total_amount) >= 1000 THEN 'Sadık Müşteri' WHEN SUM(total_amount) BETWEEN 500 AND 999.99 THEN 'Orta Düzey Müşteri' ELSE 'Düşük Değerli Müşteri' END AS customer_segment FROM orders WHERE order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH) -- Son 6 ay GROUP BY customer_id ORDER BY total_spent DESC; |
Sorgunun Adım Adım Açıklaması:
- WHERE Koşulu:
Son 6 ay içinde alışveriş yapmış müşterileri seçiyorum.order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH)
ifadesi, sadece son 6 aydaki siparişleri içeriyor. - GROUP BY:
Müşterileri grupluyorum (GROUP BY customer_id
). Bu sayede her bir müşteri için toplam harcama hesaplanmış olacak. - CASE WHEN:
CASE WHEN
ifadesiyle her müşteriyi 3 segmente ayırıyorum.- 1000 TL ve üzeri harcama yapanlar “Sadık Müşteri” olarak sınıflandırılıyor.
- 500-999 TL arasında harcama yapanlar “Orta Düzey Müşteri” olarak,
- 500 TL altı harcama yapanlar ise “Düşük Değerli Müşteri” olarak etiketleniyor.
- ORDER BY:
Müşterileri, harcama miktarına göre azalan sırayla (ORDER BY total_spent DESC
) sıralıyorum. Bu, en fazla harcama yapan müşterileri öncelikli olarak gösteriyor.
Çıktı Örneği:
customer_id | total_spent | customer_segment |
---|---|---|
102 | 1500.00 | Sadık Müşteri |
205 | 950.00 | Orta Düzey Müşteri |
307 | 400.00 | Düşük Değerli Müşteri |
412 | 1200.00 | Sadık Müşteri |
Bu sorgu, pazarlama stratejilerimi net bir şekilde hedeflememi sağlar.
Sadık Müşteriler için özel teklifler veya ödüller sunabilirken, Orta Düzey Müşteriler için biraz daha teşvik edici kampanyalar, Düşük Değerli Müşteriler içinse onları tekrar aktif hale getirmek adına fırsatlar yaratabilirim.
Satış Verilerinden Öngörü Çıkarmak
Satış verileri üzerinde çalışırken, geçmiş dönem performanslarını analiz etmek ve geleceğe yönelik öngörülerde bulunmak için SQL’in güçlü fonksiyonlarından faydalanıyorum.
Örneğin, ay ay toplam satışları GROUP BY
ile gruplandırıyor, SUM
fonksiyonuyla her ayın toplam cirosunu hesaplıyorum.
Daha sonra bu verilere zaman serisi perspektifinden bakarak büyüme oranları çıkarıyorum.
Bazen de hareketli ortalama hesaplamaları yaparak sezonluk dalgalanmaları daha net görebiliyorum.
SQL sayesinde, satış verilerinin altında yatan trendleri ve desenleri hızlıca çıkarabiliyor, bu öngörüleri projelerimde stratejik kararlar için kullanabiliyorum.
Örnek Senaryo: Satış Performansı Analizi ve Gelecek Öngörüleri
Tablo adı: sales
Sütunlar:
sale_id
sale_date
total_amount
(satış tutarı)
Amaç:
- Aylık Satışların Toplamını Hesaplamak
- Aylık Büyüme Oranı Hesaplamak
- Hareketli Ortalama Hesaplamak (Sezonluk Dalgalanmaları Görmek)
SQL Sorguları:
1. Aylık Satışların Toplamını Hesaplamak (GROUP BY ve SUM)
İlk adım olarak, her ayın toplam satışını hesaplıyoruz:
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT EXTRACT(YEAR FROM sale_date) AS sale_year, EXTRACT(MONTH FROM sale_date) AS sale_month, SUM(total_amount) AS monthly_revenue FROM sales GROUP BY sale_year, sale_month ORDER BY sale_year DESC, sale_month DESC; |
Açıklama:
EXTRACT(YEAR FROM sale_date)
veEXTRACT(MONTH FROM sale_date)
kullanarak satışları yıl ve ay bazında gruplandırıyorum.SUM(total_amount)
ile her ayın toplam cirosunu hesaplıyorum.GROUP BY
ile her yıl-ay çiftini gruplandırarak sonuçları alıyorum.
2. Aylık Büyüme Oranı Hesaplamak (Geçmiş Dönem Performansını Karşılaştırmak)
Sonra, her ayın bir önceki aya göre büyüme oranını hesaplıyorum. Bunun için LAG() fonksiyonunu kullanıyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | WITH monthly_sales AS ( SELECT EXTRACT(YEAR FROM sale_date) AS sale_year, EXTRACT(MONTH FROM sale_date) AS sale_month, SUM(total_amount) AS monthly_revenue FROM sales GROUP BY sale_year, sale_month ) SELECT sale_year, sale_month, monthly_revenue, LAG(monthly_revenue) OVER (ORDER BY sale_year, sale_month) AS previous_month_revenue, (monthly_revenue - LAG(monthly_revenue) OVER (ORDER BY sale_year, sale_month)) / LAG(monthly_revenue) OVER (ORDER BY sale_year, sale_month) * 100 AS growth_rate_percentage FROM monthly_sales ORDER BY sale_year DESC, sale_month DESC; |
Açıklama:
- LAG() fonksiyonu, bir önceki ayın satış verisini almayı sağlıyor.
- Büyüme oranını hesaplamak için:
(CurrentMonthRevenue−PreviousMonthRevenue)/PreviousMonthRevenue×100(Current Month Revenue – Previous Month Revenue) / Previous Month Revenue \times 100(CurrentMonthRevenue−PreviousMonthRevenue)/PreviousMonthRevenue×100
ile yüzdelik değişim hesaplanıyor.
3. Hareketli Ortalama Hesaplamak (Sezonluk Dalgalanmayı Görmek)
Son olarak, hareketli ortalama kullanarak satışların daha düzgün bir görünümünü elde ediyorum ve sezonluk dalgalanmaları analiz ediyorum. Bu örnekte, 3 aylık hareketli ortalama hesaplıyorum:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | WITH monthly_sales AS ( SELECT EXTRACT(YEAR FROM sale_date) AS sale_year, EXTRACT(MONTH FROM sale_date) AS sale_month, SUM(total_amount) AS monthly_revenue FROM sales GROUP BY sale_year, sale_month ) SELECT sale_year, sale_month, monthly_revenue, AVG(monthly_revenue) OVER (ORDER BY sale_year, sale_month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average_3_months FROM monthly_sales ORDER BY sale_year DESC, sale_month DESC; |
Açıklama:
- AVG() fonksiyonunu
OVER
ile birlikte kullanarak, her ay için 3 aylık hareketli ortalama hesaplıyorum. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
ifadesi, son 3 ayın verilerini dikkate alır.
Çıktı Örneği:
sale_year | sale_month | monthly_revenue | previous_month_revenue | growth_rate_percentage | moving_average_3_months |
---|---|---|---|---|---|
2025 | 3 | 50000.00 | 45000.00 | 11.11% | 47000.00 |
2025 | 2 | 45000.00 | 48000.00 | -6.25% | 46000.00 |
2025 | 1 | 48000.00 | NULL | NULL | 46666.67 |
Açıklamalar ve Kullanım Amacı:
- Aylık Satışlar:
Satışların zaman içindeki değişimini görmek için her ayın toplam cirosunu inceledim. - Büyüme Oranı:
Satışların aylık olarak ne kadar arttığını veya azaldığını görerek performans analizini yaptım. - Hareketli Ortalama:
Sezonluk dalgalanmaları ortadan kaldırarak, genel eğilimleri görmek ve satışları daha düzgün bir şekilde analiz etmek için hareketli ortalama kullandım.
Bu SQL sorguları sayesinde, hem geçmiş satış performanslarını çok net bir şekilde analiz edebiliyorum, hem de gelecekteki satış trendlerine yönelik öngörülerde bulunabiliyorum. Bu veriler, stratejik kararlar almak ve pazarlama/toptan satış gibi alanlarda daha bilinçli adımlar atmak için çok değerli.
Anomali Tespiti için SQL Sorguları
Veri analizinde en kritik işlerden biri de anormal durumları yakalamak.
SQL kullanarak belirli eşiklerin dışına çıkan satışları, beklenmedik artış veya düşüşleri kolaylıkla tespit edebiliyorum.
Örneğin, normalde bir ürün günlük 100 birim satarken, bir günde 1000 birim satılmışsa, bu durumu HAVING
ve CASE
ifadeleriyle filtreleyerek yakalıyorum.
Benzer şekilde, eksik veya şüpheli kayıtları tespit etmek için NULL
kontrolleri ve olağan dışı değer analizleri yapıyorum.
SQL ile anomali tespiti yapmak, verinin güvenilirliğini sağlamak ve sorunları henüz büyümeden fark edebilmek için elimdeki en pratik yöntemlerden biri haline geldi.
Örnek Senaryo: Anomali Tespiti (Beklenmedik Satış Artışları ve Eksik Kayıtlar)
Tablo adı: sales
Sütunlar:
sale_id
product_id
sale_date
quantity_sold
(satılan ürün adedi)total_amount
(satış tutarı)
Amaç:
- Beklenmedik Satış Artışlarını Tespit Etmek (Örneğin, normalde 100 birim satılan bir ürün bir günde 1000 birim satıldığında tespit etmek)
- Eksik veya Şüpheli Kayıtları Tespit Etmek (NULL değerler veya olağan dışı düşük/ yüksek değerler)
1. Beklenmedik Satış Artışlarını Tespit Etmek (HAVING ve CASE Kullanımı)
Diyelim ki, her ürün için normalde günlük 100 birim satış bekliyoruz. Bir gün içerisinde satış 1000 birime çıktıysa, bu bir anomali olarak kabul edebiliriz. Bunu SQL sorgusunda şöyle yakalayabiliriz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | SELECT product_id, sale_date, SUM(quantity_sold) AS total_sales, CASE WHEN SUM(quantity_sold) > 1000 THEN 'Anormal Artış' ELSE 'Normal Satış' END AS sales_status FROM sales GROUP BY product_id, sale_date HAVING SUM(quantity_sold) > 1000 -- Satışı 1000'in üzerinde olanları filtreliyoruz ORDER BY total_sales DESC; |
Açıklama:
SUM(quantity_sold)
ile her gün için toplam satış miktarını hesaplıyorum.HAVING
ile toplam satışları 1000’in üzerinde olan günleri filtreliyorum.CASE WHEN
ifadesi ile anormal satışları “Anormal Artış” olarak etiketliyorum.- Bu sorgu, beklenmedik yüksek satışları tespit etmeyi sağlar.
2. Eksik veya Şüpheli Kayıtları Tespit Etmek (NULL Kontrolleri)
Bazı durumlarda, veri setinde eksik veya NULL değerler bulunabilir. Bunları tespit etmek için SQL’de IS NULL
ifadesini kullanabiliyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT product_id, sale_date, quantity_sold, total_amount FROM sales WHERE quantity_sold IS NULL OR total_amount IS NULL ORDER BY sale_date; |
Açıklama:
- Bu sorgu,
quantity_sold
veyatotal_amount
sütunlarında eksik (NULL) değerleri olan satırları getirir. Eksik veri genellikle hatalı kayıtlara işaret eder, bu yüzden bu tür verileri tespit etmek önemli. - Eksik verileri görmek, onları düzeltmek veya işleme dışı bırakmak adına yardımcı olur.
3. Olağan Dışı Değerlerin Tespiti (Çok Düşük veya Çok Yüksek Satışlar)
Bir ürünün genellikle 10-50 birim arasında satıldığını varsayalım. Eğer bir gün içerisinde bu ürün 1000 birim satıldıysa, bu da olağan dışı bir durumdur. Bu tür değerleri tespit etmek için şöyle bir sorgu yazılabilir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SELECT product_id, sale_date, quantity_sold, CASE WHEN quantity_sold < 10 THEN 'Çok Düşük Satış' WHEN quantity_sold > 500 THEN 'Çok Yüksek Satış' ELSE 'Normal Satış' END AS sales_status FROM sales WHERE quantity_sold < 10 OR quantity_sold > 500 ORDER BY quantity_sold DESC; |
Açıklama:
- Bu sorgu, satışı 10 birimin altında veya 500 birimin üstünde olan ürünleri filtreler.
CASE WHEN
ile bu durumu “Çok Düşük Satış” veya “Çok Yüksek Satış” olarak etiketlerim.- Böylece, ürünlerin olağan dışı satışlarını hızlıca tespit edebilirim.
Çıktı Örneği:
product_id | sale_date | total_sales | sales_status |
---|---|---|---|
101 | 2025-04-25 | 1200 | Anormal Artış |
102 | 2025-04-26 | 5 | Çok Düşük Satış |
105 | 2025-04-23 | 50 | Normal Satış |
Sonuç:
Bu SQL sorguları sayesinde, satış verileri üzerinde anomali tespiti yaparken, anormal satış artışlarını, eksik verileri veya olağan dışı değerleri hızlıca yakalayabiliyorum. Bu tür tespitler, verinin güvenilirliğini sağlamak ve hataları erkenden fark etmek için son derece önemlidir. SQL ile bu tür analizleri yapmak, daha sağlam ve doğru kararlar alabilmek adına büyük avantaj sağlar.
4o mini
SQL ile Veritabanı Yönetimi İpuçları
SQL sadece veri çekmek veya analiz yapmak için değil, aynı zamanda veritabanı sistemlerini sağlıklı bir şekilde yönetmek için de vazgeçilmez bir araç.
Zamanla veritabanı yapısının nasıl organize edildiği, sorguların ne kadar hızlı çalıştığı ve veri kayıplarına karşı nasıl önlem alındığı gibi konuların da en az analiz kadar önemli olduğunu deneyimledim.
İşte, bu süreçte öğrendiğim bazı kritik ipuçları…
İndeks Kullanımı ile Performans Artırma
İlk büyük veri setleriyle çalışmaya başladığımda, sorgularımın bazen çok yavaş çalıştığını fark ettim.
Sorgu sürelerini düşürmenin yollarını araştırırken indeks kavramıyla tanıştım.
Sık sorguladığım sütunlara indeksler oluşturarak (CREATE INDEX
komutu ile), özellikle WHERE
, JOIN
ve ORDER BY
işlemlerinde performansı ciddi şekilde artırdım.
Tabii her yere indeks eklemenin de doğru olmadığını öğrendim; çünkü aşırı indeks kullanımı veri güncellemelerini yavaşlatabiliyor.
Bu yüzden ihtiyaca göre doğru alanlarda ve dengeli bir indeks stratejisi kurmak benim için önemli bir alışkanlık haline geldi.
Örnek Senaryo: İndeks Kullanımı ile Performans İyileştirme
Tablo adı: orders
Sütunlar:
order_id
customer_id
order_date
total_amount
status
Amaç:
- Sorguların Performansını Artırmak
- WHERE, JOIN ve ORDER BY İşlemlerinde İndeks Kullanmak
1. İndeks Oluşturma (CREATE INDEX)
Sık sık customer_id
ve order_date
sütunları üzerinde sorgu yapıyorsak, bu sütunlar için indeks oluşturmak sorgu performansını artırabilir. Örneğin, müşterilerin siparişlerini tarih sırasına göre sorguluyorsak:
1 2 3 4 | CREATE INDEX idx_customer_id ON orders (customer_id); CREATE INDEX idx_order_date ON orders (order_date); |
Açıklama:
CREATE INDEX
komutu, sorgularımızda sıkça kullanılan sütunlar üzerinde indeks oluşturur.- Burada,
customer_id
veorder_date
sütunlarına indeks ekleyerek, bu sütunlarla yapılan sorgularda daha hızlı sonuçlar elde ediyorum.
2. İndeksli Sorgu Örneği
Diyelim ki, belirli bir müşteri ID’sine sahip tüm siparişleri ve sipariş tarihini sorgulamak istiyorum:
1 2 3 4 5 6 | SELECT order_id, order_date, total_amount FROM orders WHERE customer_id = 12345 ORDER BY order_date DESC; |
Açıklama:
- Bu sorgu,
customer_id
‘ye göre filtreleme yapar veorder_date
sütununa göre sıralama yapar. - İndeksler sayesinde, SQL sorgu motoru
customer_id
veorder_date
sütunlarındaki verilere daha hızlı erişebilir, böylece sorgu süresi kısalır.
3. JOIN İşleminde İndeks Kullanımı
İki tabloyu JOIN
ile birleştirirken, doğru sütunlar üzerinde indeks kullanmak sorgu performansını önemli ölçüde iyileştirir. Örneğin, orders
ve customers
tablolarını customer_id
üzerinden birleştirelim:
1 2 3 4 5 6 7 | SELECT o.order_id, o.order_date, c.customer_name FROM orders o JOIN customers c ON o.customer_id = c.customer_id WHERE o.order_date > '2025-01-01' ORDER BY o.order_date; |
Açıklama:
- Bu sorguda,
orders
vecustomers
tablolarınıcustomer_id
sütunu üzerinden birleştiriyorum. - Eğer her iki tabloda da
customer_id
için indeks varsa, bu sorgu çok daha hızlı çalışacaktır.
4. İndeks Stratejisinde Dengeyi Sağlamak
İndeks kullanımı faydalıdır ancak her sütun için indeks oluşturmak gereksizdir ve veri güncellemelerini (INSERT, UPDATE, DELETE) yavaşlatabilir. Bu yüzden, sadece sıkça sorgulanan sütunlarda indeks oluşturmak ve indekslerin aşırıya kaçmamasına dikkat etmek gereklidir.
Örneğin:
status
sütunu genellikle sorgularda kullanılmıyorsa, bu sütun için indeks oluşturmak performans kazancı sağlamaz. Aynı şekilde, sadece tek bir satırdaki veriye erişilecekse indeksin bir faydası olmayabilir.
İndeksin Performansa Etkisi:
- İndeks Olmayan Sorgu:
Eğercustomer_id
veorder_date
için indeks oluşturmazsanız, sorgu tüm tabloyu taramak zorunda kalır. Bu da büyük veri setlerinde performans kayıplarına yol açar. - İndeksli Sorgu:
İndeks oluşturulduğunda, sorgu sadece ilgili verileri içeren küçük bir veri kümesi üzerinde işlem yapar. Bu, sorgu süresini önemli ölçüde azaltır ve büyük veri setlerinde performans artışı sağlar.
Sonuç:
İndeks kullanımı, özellikle büyük veri setlerinde sorgu performansını artırmak için çok etkili bir yöntemdir. Ancak, her sütun için indeks eklemek, aşırı indeks kullanımı sorunlarına yol açabilir. İndekslerin doğru ve dengeli bir şekilde oluşturulması, veri güncellemeleri üzerinde olumsuz etkiler yaratmadan performans artışı sağlamanın anahtarıdır.
Veritabanı Normalizasyonu ve Tasarım İlkeleri
İlk veritabanı tasarımı deneyimlerimde, her şeyi tek tabloda toplamaya çalışmanın ne kadar sorunlu olduğunu yaşadım.
Veri tekrarları arttıkça veri bütünlüğünü korumak neredeyse imkânsız hale geliyordu.
Bu noktada normalizasyon prensipleri ile tanıştım: veriyi mantıklı parçalara bölmek, ilişkili verileri farklı tablolarda tutmak ve gereksiz tekrarları ortadan kaldırmak.
Örneğin, müşteri bilgileri ile sipariş detaylarını ayrı tablolarda tutup, aralarındaki ilişkiyi anahtarlar (PRIMARY KEY
, FOREIGN KEY
) ile tanımlıyorum.
Bu sayede hem veri tutarlılığı artıyor hem de sistem daha yönetilebilir hale geliyor.
İyi bir veritabanı tasarımının, uzun vadede bakım ve performans açısından ne kadar kritik olduğunu tecrübe ederek öğrendim.
Büyük Veritabanlarında Yedekleme ve Kurtarma Stratejileri
Bir projede önemli bir veri kaybı yaşadığımda, veritabanı yedekleme konusunun önemini acı bir şekilde öğrendim.
Artık düzenli aralıklarla otomatik yedekleme sistemleri kuruyor ve veritabanı dosyalarını güvenli alanlarda saklıyorum.
SQL’in BACKUP
ve RESTORE
komutları sayesinde, hem manuel hem de otomatik kurtarma senaryoları oluşturabiliyorum.
Ayrıca, büyük veri tabanlarında sadece tam yedekleme değil, artımlı yedekleme (sadece değişen verileri kaydetme) stratejileri kullanarak kaynakları daha verimli kullanıyorum.
Veri kaybı riskine karşı önlem almanın, sistem yönetiminin en kritik parçalarından biri olduğunu artık her proje başlangıcında mutlaka göz önünde bulunduruyorum.
SQL ve Modern Veri Bilimi Araçları
Veri bilimi dünyası sürekli değişiyor ve gelişiyor.
Ben de bu süreçte sadece klasik SQL kullanmakla kalmadım; modern veri bilimi araçlarıyla SQL’i nasıl entegre edebileceğimi öğrendim.
Farklı teknolojileri SQL ile birlikte kullanarak hem veriye erişimi kolaylaştırdım hem de analiz süreçlerimi çok daha hızlı ve verimli hale getirdim.
İşte bu yolculukta öğrendiklerim…
SQL ve Python Entegrasyonu
Python, veri bilimi projelerimde vazgeçilmez bir araç.
SQL ile Python’ı birleştirerek, veri çekme ve analiz süreçlerimi tamamen otomatik hale getirebiliyorum.
Özellikle pandas
kütüphanesi ile veritabanlarından doğrudan veri çekmek (read_sql_query
) ve bu veriler üzerinde gelişmiş analizler yapmak benim için standart bir yöntem haline geldi.
SQL sorgularıyla veriyi filtreliyor, Python ile bu veriyi işleyip makine öğrenmesi modellerine veya görselleştirmelere taşıyorum.
Bu entegrasyon, projelerimi hem daha dinamik hem de daha güçlü bir hale getiriyor.
SQL ve Veri Görselleştirme Araçları
Veri bilimi projelerinde, analiz sonuçlarını etkili bir şekilde sunmak çok önemli.
Bu noktada SQL’i doğrudan veri görselleştirme araçlarıyla entegre etmek büyük kolaylık sağlıyor.
Örneğin, Tableau veya Power BI gibi araçlarda doğrudan SQL sorguları yazarak dashboard’lar oluşturuyorum.
SQL ile veriyi istediğim gibi süzüp hazırladıktan sonra, birkaç tıklamayla bu verileri etkileyici grafikler ve raporlar haline getirebiliyorum.
Bu sayede teknik detaylara boğulmadan, karar vericilere net ve anlaşılır bilgiler sunabiliyorum.
Bulut Tabanlı SQL Çözümleri
Veri setleri büyüdükçe ve ekipler uzaktan çalışmaya başladıkça, bulut tabanlı SQL çözümleri benim için vazgeçilmez hale geldi.
Google BigQuery, Amazon Redshift ve Snowflake gibi platformlarla tanışınca, veriye erişim ve işlem gücü konusunda sınırsız bir özgürlük yaşadım.
Artık büyük veri setlerini yerel makineme indirmeden analiz edebiliyor, SQL sorgularımı doğrudan bulut üzerinde çalıştırabiliyorum.
Bu platformlar sayesinde hem zamandan tasarruf ediyorum hem de altyapı maliyetlerini önemli ölçüde azaltıyorum.
Bulut tabanlı çözümler, veri bilimi projelerimi daha ölçeklenebilir ve esnek hale getiriyor.
Sonuç: Veri Bilimi Yolculuğunuzda SQL’i Nasıl Etkin Kullanabilirsiniz?
Veri bilimi yolculuğumda öğrendiğim en önemli derslerden biri şu oldu:
SQL, sadece bir sorgulama dili değil; veriye ulaşmanın, onu anlamlandırmanın ve iş problemlerine çözüm üretmenin temel anahtarı.
İster küçük bir veri seti ister devasa bir veri gölü üzerinde çalışıyor olayım, SQL sayesinde her zaman veriye hâkimiyetimi koruyabiliyorum.
Üstelik SQL’i modern araçlarla birleştirerek, analiz süreçlerimi daha hızlı, daha doğru ve daha etkili bir şekilde yönetebiliyorum.
Bu yüzden veri bilimiyle ilgilenen herkese tavsiyem:
SQL’i sadece öğrenmekle kalmayın, onu farklı senaryolarda uygulamaya, diğer teknolojilerle entegre etmeye ve sürekli geliştirmeye çalışın.
Çünkü verinin gücüne ulaşmanın yolu, veriye nasıl doğru sorular soracağınızı bilmekten geçiyor. Ve bu soruları sormanın en etkili dili, hâlâ SQL.
Veri bilimi yolculuğuma ilk başladığımda, karşıma yüzlerce araç, teknik ve terim çıktı.
Bir süre sonra fark ettim ki, hangi alana yönelirsem yöneliyim, temelinde hep veriye doğru erişmek ve onu anlamlandırmak yatıyor.
Ve bu işin temel taşı, açık ara farkla SQL’di.
İşte bu yüzden, hem kendi öğrenim sürecimde yaşadığım deneyimleri hem de gerçek dünyadan uygulamalı örneklerle desteklediğim bilgileri paylaşmak istedim.
Bu makaleyi okuyan herkesin, SQL’in veri bilimi kariyerlerinde nasıl güçlü bir araç olabileceğini görmesini ve bu dili daha bilinçli kullanmaya başlamasını umuyorum.
5 Maddede SQL’in Veri Bilimi İçin Önemi
📌 1. Veriye Doğrudan Erişim Sağlar:
SQL ile veritabanlarındaki ham verilere ulaşarak, analiz sürecinin kontrolünü doğrudan elime alabiliyorum.
📌 2. Verileri Hızlıca Temizler ve Hazırlar:
Veri temizleme, filtreleme ve dönüştürme işlemlerini SQL sorguları ile hızlıca gerçekleştiriyorum.
📌 3. Büyük Veri Setleriyle Etkili Çalışmayı Sağlar:
SQL’in güçlü sorgulama yapıları, milyonlarca satırlık veri setlerinde bile hızlı ve doğru analizler yapmama imkân tanıyor.
📌 4. Diğer Veri Bilimi Araçlarıyla Kolayca Entegre Olur:
Python, Tableau, Power BI gibi araçlarla SQL’i birleştirerek veri analizini ve görselleştirmeyi daha etkili hale getiriyorum.
📌 5. Gerçek Dünya Problemlerine Uygulanabilir Çözümler Sunar:
Müşteri segmentasyonu, satış öngörüleri veya anomali tespiti gibi pratik iş problemlerini SQL ile rahatlıkla çözebiliyorum.
Yorum Yap