SQL’de Matematiksel İfadeler ve Toplama Fonksiyonları Nasıl Kullanılır?
Veritabanları, modern iş dünyasının ve teknolojik altyapının temelini oluşturur. Bu veritabanlarında depolanan büyük miktardaki ham veriden anlamlı bilgiler çıkarmak, karar alma süreçleri için hayati öneme sahiptir. SQL (Structured Query Language), veritabanlarıyla etkileşim kurmak, verileri sorgulamak, manipüle etmek ve yönetmek için kullanılan standart bir dildir. SQL’in gücü, sadece veri çekmekle sınırlı değildir; aynı zamanda bu veriler üzerinde karmaşık hesaplamalar yapma ve özet bilgiler üretme yeteneğinden gelir. Bu makalede, SQL’in bu güçlü yönlerini oluşturan matematiksel ifadeler ve toplama (aggregate) fonksiyonlarını derinlemesine inceleyeceğiz. Bu araçlar, verileri dönüştürmek, analiz etmek ve anlamlı raporlar oluşturmak için vazgeçilmezdir.
Bir işletmenin günlük satış verilerini düşünün. Sadece her bir ürünün satış fiyatını bilmek yeterli olmayabilir. Belki de toplam geliri, ortalama ürün fiyatını, en pahalı veya en ucuz ürünü, ya da belirli bir kategoriye ait ürünlerin toplam stok değerini bilmek istersiniz. İşte bu tür analizler için matematiksel ifadeler ve toplama fonksiyonları devreye girer. Bu makale boyunca, bu kavramların ne olduğunu, nasıl kullanıldığını, farklı senaryolarda nasıl birleştirilebileceğini ve en iyi uygulama yöntemlerini detaylı örneklerle açıklayacağız.
Matematiksel İfadeler (Mathematical Expressions)
Matematiksel ifadeler, SQL sorguları içinde sayısal veriler üzerinde aritmetik işlemler yapmak için kullanılır. Bu ifadeler, bir veya daha fazla operatör, işlenen (operand) ve fonksiyon içerebilir. SQL, temel aritmetik işlemlerden daha karmaşık matematiksel fonksiyonlara kadar geniş bir yelpazede destek sunar. Matematiksel ifadeler genellikle SELECT listesinde yeni sütunlar oluşturmak, WHERE yan tümcesinde koşulları belirlemek veya ORDER BY yan tümcesinde sıralama kriterleri tanımlamak için kullanılır.
Temel Aritmetik Operatörler
SQL’de en sık kullanılan aritmetik operatörler şunlardır:
+(Toplama): İki sayıyı toplar.-(Çıkarma): Bir sayıdan diğerini çıkarır.*(Çarpma): İki sayıyı çarpar./(Bölme): Bir sayıyı diğerine böler.%(Modülüs): Bölme işleminden kalanı verir (yalnızca tam sayılar için geçerlidir).
Bu operatörler, sayısal sütunlar, sabit değerler veya başka ifadeler üzerinde kullanılabilir.
Örnekler:
Bir Urunler tablomuz olduğunu varsayalım:
-- Urunler Tablosu Örneği
-- UrunID | UrunAdi | Kategori | Fiyat | StokAdedi
-- --------|----------|----------|-------|-----------
-- 1 | Laptop | Elektronik| 1200.00| 50
-- 2 | Klavye | Elektronik| 75.50 | 200
-- 3 | Mouse | Elektronik| 25.00 | 300
-- 4 | Defter | Kırtasiye | 5.00 | 1000
-- 5 | Kalem | Kırtasiye | 2.50 | 500
1. Yeni bir sütun olarak toplam stok değeri hesaplama:
SELECT
UrunAdi,
Fiyat,
StokAdedi,
Fiyat * StokAdedi AS ToplamStokDegeri
FROM
Urunler;
Bu sorgu, her bir ürünün birim fiyatı ile stok adedini çarparak, her ürün için toplam stok değerini yeni bir sütun olarak döndürür.
2. İndirimli fiyat hesaplama:
SELECT
UrunAdi,
Fiyat AS OrjinalFiyat,
Fiyat * 0.90 AS IndirimliFiyat -- %10 indirim
FROM
Urunler
WHERE
Kategori = 'Elektronik';
Bu örnekte, Elektronik kategorisindeki ürünlerin %10 indirimli fiyatını hesaplıyoruz.
3. Kalanı bulma (Modülüs):
SELECT
10 % 3 AS Kalan; -- Sonuç: 1
Operatör Önceliği ve Parantez Kullanımı
Matematikte olduğu gibi, SQL’de de aritmetik operatörlerin belirli bir önceliği vardır. Çarpma ve bölme, toplama ve çıkarmadan önce yapılır. Modülüs operatörü de çarpma ve bölme ile aynı önceliğe sahiptir. Eğer bu önceliği değiştirmek isterseniz, parantez () kullanmanız gerekir. Parantez içindeki işlemler her zaman önce değerlendirilir.
Örnek:
SELECT
10 + 5 * 2 AS Sonuc1, -- Önce çarpma: 10 + 10 = 20
(10 + 5) 2 AS Sonuc2; -- Önce parantez içi: 15 2 = 30
Matematiksel Fonksiyonlar
SQL, temel aritmetik operatörlerin ötesinde, daha karmaşık matematiksel hesaplamalar için yerleşik fonksiyonlar sunar. Bu fonksiyonlar veritabanı sistemine (MySQL, PostgreSQL, SQL Server, Oracle vb.) göre küçük farklılıklar gösterebilir, ancak çoğu veritabanında benzer işlevlere sahip fonksiyonlar bulunur.
Bazı yaygın matematiksel fonksiyonlar:
ABS(sayı): Bir sayının mutlak değerini döndürür.ROUND(sayı, ondalık_basamak_sayısı): Bir sayıyı belirtilen ondalık basamak sayısına yuvarlar.CEIL(sayı)veyaCEILING(sayı): Bir sayıyı yukarıya doğru en yakın tam sayıya yuvarlar.FLOOR(sayı): Bir sayıyı aşağıya doğru en yakın tam sayıya yuvarlar.POWER(taban, üs): Bir sayının belirtilen üssünü hesaplar.SQRT(sayı): Bir sayının karekökünü hesaplar.LOG(sayı)veyaLN(sayı): Doğal logaritmayı (e tabanında) hesaplar. Bazı sistemlerdeLOG(taban, sayı)şeklinde farklı tabanlarda logaritma da alınabilir.RAND()veyaRANDOM(): 0 ile 1 arasında rastgele bir sayı üretir.SIGN(sayı): Sayının işaretini döndürür (-1 negatif, 0 sıfır, 1 pozitif).
Örnekler:
1. Fiyatları yuvarlama:
SELECT
UrunAdi,
Fiyat,
ROUND(Fiyat, 0) AS YuvarlanmisFiyat, -- En yakın tam sayıya yuvarlar
CEIL(Fiyat) AS YukariYuvarla,
FLOOR(Fiyat) AS AsagiYuvarla
FROM
Urunler
WHERE
UrunID = 2; -- Fiyat: 75.50
Sonuç: YuvarlanmisFiyat 76, YukariYuvarla 76, AsagiYuvarla 75 olacaktır.
2. Karekök hesaplama:
SELECT SQRT(64) AS Karekok; -- Sonuç: 8
Veri Tipi Dönüşümü (CAST, CONVERT)
Matematiksel ifadelerle çalışırken, veri tiplerinin uyumlu olması önemlidir. Örneğin, bir metin sütununu doğrudan sayısal bir işlemde kullanamazsınız. Bu gibi durumlarda, CAST() veya CONVERT() fonksiyonlarını kullanarak veri tiplerini dönüştürmek gerekebilir. Bu fonksiyonlar, bir sütunun veya ifadenin veri tipini başka bir veri tipine çevirmek için kullanılır.
-- Varsayalım ki 'MetinFiyat' adında VARCHAR bir sütunumuz var ve içinde '150.75' gibi değerler var.
SELECT
CAST('150.75' AS DECIMAL(10, 2)) * 2 AS CiftFiyat;
Bu, metin olarak saklanan bir fiyat değerini ondalık sayıya dönüştürür ve ardından matematiksel bir işlem yapar.
Toplama Fonksiyonları (Aggregate Functions)
Toplama fonksiyonları, bir veri kümesi üzerinde (yani birden çok satır üzerinde) işlem yaparak tek bir özet değer döndüren özel SQL fonksiyonlarıdır. Bu fonksiyonlar, büyük veri kümelerinden anlamlı istatistikler çıkarmak için vazgeçilmezdir. Genellikle SELECT listesinde kullanılırlar ve GROUP BY yan tümcesi ile birlikte kullanıldıklarında çok daha güçlü hale gelirler.
Ana Toplama Fonksiyonları
SQL’deki en yaygın toplama fonksiyonları şunlardır:
COUNT(): Satır Sayısını Sayma
COUNT() fonksiyonu, bir sorgu tarafından döndürülen satır sayısını saymak için kullanılır.
COUNT(*): NULL değerleri de dahil olmak üzere tüm satırların sayısını döndürür.COUNT(sütun_adı): Belirtilen sütunda NULL olmayan değerlerin sayısını döndürür.COUNT(DISTINCT sütun_adı): Belirtilen sütundaki benzersiz, NULL olmayan değerlerin sayısını döndürür.
Örnekler:
-- Tüm ürünlerin sayısını bulma
SELECT COUNT(*) AS ToplamUrunSayisi FROM Urunler;
-- Fiyatı olan (NULL olmayan) ürünlerin sayısını bulma
SELECT COUNT(Fiyat) AS FiyatliUrunSayisi FROM Urunler;
-- Kaç farklı kategori olduğunu bulma
SELECT COUNT(DISTINCT Kategori) AS FarkliKategoriSayisi FROM Urunler;
SUM(): Sayısal Bir Sütunun Toplamını Alma
SUM() fonksiyonu, sayısal bir sütundaki tüm değerlerin toplamını hesaplar. NULL değerler göz ardı edilir.
Örnek:
-- Tüm ürünlerin toplam stok değerini hesaplama
SELECT SUM(Fiyat * StokAdedi) AS GenelToplamStokDegeri FROM Urunler;
AVG(): Sayısal Bir Sütunun Ortalamasını Alma
AVG() fonksiyonu, sayısal bir sütundaki tüm değerlerin ortalamasını hesaplar. NULL değerler göz ardı edilir.
Örnek:
-- Ortalama ürün fiyatını bulma
SELECT AVG(Fiyat) AS OrtalamaUrunFiyati FROM Urunler;
MIN(): Bir Sütundaki En Küçük Değeri Bulma
MIN() fonksiyonu, belirtilen sütundaki en küçük değeri döndürür. Bu, sayısal, metin veya tarih/saat sütunları için kullanılabilir. NULL değerler göz ardı edilir.
Örnek:
-- En ucuz ürünün fiyatını bulma
SELECT MIN(Fiyat) AS EnUcuzUrunFiyati FROM Urunler;
MAX(): Bir Sütundaki En Büyük Değeri Bulma
MAX() fonksiyonu, belirtilen sütundaki en büyük değeri döndürür. Bu da sayısal, metin veya tarih/saat sütunları için kullanılabilir. NULL değerler göz ardı edilir.
Örnek:
-- En pahalı ürünün fiyatını bulma
SELECT MAX(Fiyat) AS EnPahaliUrunFiyati FROM Urunler;
GROUP BY Yan Tümcesi
Toplama fonksiyonları, tüm bir tablo üzerindeki özetleri hesaplamak için kullanışlıdır, ancak genellikle verileri belirli gruplara ayırıp her grup için özet bilgi almak istenir. İşte bu noktada GROUP BY yan tümcesi devreye girer. GROUP BY, sonuç kümesini bir veya daha fazla sütunun değerlerine göre gruplar ve her grup için toplama fonksiyonlarını çalıştırır.
Örnek:
Bir Calisanlar tablomuz olduğunu varsayalım:
-- Calisanlar Tablosu Örneği
-- CalisanID | Ad | Soyad | Departman | Maas
-- --------|-------|-------|-----------|-------
-- 1 | Ali | Yılmaz| İnsan Kay.| 60000
-- 2 | Ayşe | Demir | İnsan Kay.| 75000
-- 3 | Can | Kaya | Finans | 80000
-- 4 | Elif | Arslan| Finans | 90000
-- 5 | Mert | Çelik | Pazarlama | 65000
-- 6 | Zeynep| Can | Pazarlama | 70000
1. Her departmanın ortalama maaşını bulma:
SELECT
Departman,
AVG(Maas) AS OrtalamaMaas
FROM
Calisanlar
GROUP BY
Departman;
Bu sorgu, çalışanları departmanlarına göre gruplar ve her departman için ortalama maaşı hesaplar.
2. Her kategoriye göre toplam stok adedi ve ortalama fiyatı bulma:
SELECT
Kategori,
SUM(StokAdedi) AS ToplamStok,
AVG(Fiyat) AS OrtalamaFiyat
FROM
Urunler
GROUP BY
Kategori;
GROUP BY yan tümcesinde birden fazla sütun da kullanabilirsiniz. Bu durumda, gruplama belirtilen tüm sütunların kombinasyonlarına göre yapılır.
-- Varsayalım ki Urunler tablosunda 'Marka' diye bir sütun daha var.
SELECT
Kategori,
Marka,
COUNT(*) AS UrunSayisi
FROM
Urunler
GROUP BY
Kategori, Marka;
HAVING Yan Tümcesi
WHERE yan tümcesi, tek tek satırları filtrelemek için kullanılırken, HAVING yan tümcesi GROUP BY ile oluşturulan grupları filtrelemek için kullanılır. Yani, WHERE toplama fonksiyonları uygulanmadan önce satırları filtrelerken, HAVING toplama fonksiyonları uygulandıktan sonra grupları filtreler.
Örnek:
1. Ortalama maaşı 70000’den yüksek olan departmanları bulma:
SELECT
Departman,
AVG(Maas) AS OrtalamaMaas
FROM
Calisanlar
GROUP BY
Departman
HAVING
AVG(Maas) > 70000;
Bu sorgu, önce her departmanın ortalama maaşını hesaplar, ardından sadece ortalama maaşı 70000’den fazla olan departmanları döndürür.
2. Toplam stok adedi 500’den az olan kategorileri bulma:
SELECT
Kategori,
SUM(StokAdedi) AS ToplamStok
FROM
Urunler
GROUP BY
Kategori
HAVING
SUM(StokAdedi) < 500;
DISTINCT Anahtar Kelimesi ile Toplama Fonksiyonları
DISTINCT anahtar kelimesi, toplama fonksiyonları ile birlikte kullanıldığında, sadece benzersiz değerler üzerinde işlem yapılmasını sağlar. En sık COUNT() ile kullanılır.
Örnek:
-- Kaç farklı maaş değeri olduğunu bulma
SELECT COUNT(DISTINCT Maas) AS FarkliMaasSayisi FROM Calisanlar;
Bu, Calisanlar tablosundaki benzersiz maaş değerlerinin sayısını döndürür.
Matematiksel İfadeler ve Toplama Fonksiyonlarının Birlikte Kullanımı
SQL'in gerçek gücü, matematiksel ifadeleri ve toplama fonksiyonlarını birleştirerek daha karmaşık ve anlamlı analizler yapabilmesinden gelir. Bu kombinasyon, ham veriden ileri düzeyde iş bilgisi çıkarmak için çok sayıda senaryo sunar.
Örnekler:
1. Her kategori için KDV dahil toplam stok değerini hesaplama:
SELECT
Kategori,
SUM(Fiyat StokAdedi 1.18) AS KDV_Dahil_ToplamStokDegeri -- %18 KDV ekliyoruz
FROM
Urunler
GROUP BY
Kategori;
Burada, önce her ürün için KDV dahil fiyatı (Fiyat * 1.18) hesaplayan bir matematiksel ifade kullanılıyor, ardından bu değer stok adediyle çarpılıyor ve son olarak SUM() fonksiyonu ile kategori bazında toplam alınıyor.
2. Ortalama maaşın belirli bir yüzdesini bonus olarak hesaplama:
SELECT
Departman,
AVG(Maas) AS OrtalamaMaas,
AVG(Maas) * 0.10 AS OrtalamaBonus -- Ortalama maaşın %10'u
FROM
Calisanlar
GROUP BY
Departman
HAVING
AVG(Maas) > 60000;
Bu örnekte, her departmanın ortalama maaşı hesaplandıktan sonra, bu ortalamanın %10'u bir bonus olarak hesaplanıyor. Ayrıca, sadece ortalama maaşı 60000'den yüksek olan departmanlar filtreleniyor.
3. Bir ürünün satış fiyatı ve maliyeti arasındaki kar marjını yüzdesel olarak hesaplama:
Varsayalım ki Urunler tablosunda Maliyet adında bir sütun daha var.
SELECT
UrunAdi,
Fiyat,
Maliyet,
((Fiyat - Maliyet) / Fiyat) * 100 AS KarMarjiYuzdesi
FROM
Urunler
WHERE
Fiyat > 0; -- Bölme hatasını önlemek için
Bu sorgu, her ürün için kar marjını yüzde olarak gösteren yeni bir sütun oluşturur. Burada birden fazla aritmetik operatör ve parantez öncelik kurallarına uygun olarak kullanılmıştır.
4. Çalışanların işe giriş tarihinden bugüne kadar geçen gün sayısını hesaplayıp, departman bazında ortalama gün sayısını bulma:
Calisanlar tablosunda GirisTarihi (DATE) adında bir sütun olduğunu varsayalım.
SELECT
Departman,
AVG(DATEDIFF(CURRENT_DATE(), GirisTarihi)) AS OrtalamaCalismaGunu -- MySQL/SQL Server
-- AVG(CURRENT_DATE - GirisTarihi) AS OrtalamaCalismaGunu -- PostgreSQL
-- AVG(SYSDATE - GirisTarihi) AS OrtalamaCalismaGunu -- Oracle (gün cinsinden)
FROM
Calisanlar
GROUP BY
Departman;
Bu örnekte, önce her çalışanın işe giriş tarihinden bugüne kadar geçen gün sayısı (DATEDIFF veya benzeri bir tarih fonksiyonu ile) hesaplanıyor. Bu matematiksel ifadenin sonucu, AVG() fonksiyonu ile departman bazında ortalaması alınıyor.
Pratik Uygulamalar ve En İyi Yöntemler
Matematiksel ifadeler ve toplama fonksiyonları güçlü araçlardır, ancak bunları etkin ve verimli kullanmak için bazı en iyi yöntemleri ve dikkat edilmesi gereken noktaları bilmek önemlidir.
Performans Konuları
- İndeks Kullanımı:
WHEREyan tümcesinde veyaGROUP BYyan tümcesinde kullanılan sütunlar üzerinde indeksler oluşturmak, sorgu performansını önemli ölçüde artırabilir. Ancak, matematiksel ifadelerin doğrudan indeksli sütunlar üzerinde kullanılması, indeksin etkinliğini azaltabilir. Örneğin,WHERE Fiyat * 1.18 > 100yerineWHERE Fiyat > 100 / 1.18yazmak, indeksin kullanılmasını sağlayabilir. - Karmaşık İfadelerden Kaçınma: Çok karmaşık matematiksel ifadeler veya iç içe fonksiyonlar sorgu optimizasyonunu zorlaştırabilir. Mümkün olduğunca basit ifadeler kullanmaya çalışın veya karmaşık hesaplamaları uygulama katmanına taşıyın.
- Gereksiz Hesaplamalardan Kaçınma: Yalnızca ihtiyacınız olan hesaplamaları yapın. Örneğin, bir sütunun toplamına ihtiyacınız yoksa
SUM()kullanmayın.
Veri Doğruluğu ve Tip Uyumluluğu
- NULL Değerler: Toplama fonksiyonları (
SUM,AVG,MIN,MAX) genellikle NULL değerleri göz ardı eder. Bu, beklediğinizden farklı sonuçlar doğurabilir. Örneğin, bir sütunda NULL değerler varsa,AVG()fonksiyonu sadece NULL olmayan değerlerin ortalamasını alacaktır. Eğer NULL değerleri sıfır olarak kabul etmek isterseniz,COALESCE(sütun_adı, 0)veyaISNULL(sütun_adı, 0)gibi fonksiyonları kullanmanız gerekebilir. - Veri Tipi Uyumsuzluğu: Sayısal olmayan bir sütunu matematiksel bir işlemde kullanmaya çalışmak genellikle hata verir.
CAST()veyaCONVERT()kullanarak veri tiplerini doğru bir şekilde dönüştürdüğünüzden emin olun. - Bölme Sıfıra: Bir sayıyı sıfıra bölmek hataya neden olur. Bu tür durumları önlemek için
CASEifadeleri veyaNULLIF()gibi fonksiyonlar kullanabilirsiniz. Örneğin,SELECT Fiyat / NULLIF(StokAdedi, 0) FROM Urunler;
Okunabilirlik ve Bakım
- Takma Adlar (Aliases): Hesaplanan sütunlara veya toplama fonksiyonu sonuçlarına anlamlı takma adlar (
ASanahtar kelimesi ile) verin. Bu, sorgunun okunabilirliğini artırır ve sonuç kümesini anlamayı kolaylaştırır. - Yorumlar: Karmaşık sorgularda, özellikle karmaşık matematiksel ifadeler veya iş mantığı içeren yerlerde yorumlar kullanın.
- Formatlama: Sorgularınızı düzenli ve okunabilir bir şekilde formatlayın (girintiler, boşluklar vb.).
Sonuç
SQL'deki matematiksel ifadeler ve toplama fonksiyonları, veritabanı yönetiminden çok daha fazlasını sunar; bunlar, ham veriyi değerli iş bilgisine dönüştürmek için analitik bir güç merkezidir. Temel aritmetik işlemlerden karmaşık matematiksel fonksiyonlara ve veri kümeleri üzerinde özet istatistikler çıkaran toplama fonksiyonlarına kadar, bu araçlar veri analistleri, geliştiriciler ve karar vericiler için vazgeçilmezdir.
GROUP BY ve HAVING gibi yan tümcelerle birlikte kullanıldığında, bu fonksiyonlar, verileri anlamlı gruplara ayırma ve bu gruplar üzerinde koşullu analizler yapma yeteneği sağlar. Bu sayede, satış trendlerini, çalışan performansını, stok seviyelerini veya finansal göstergeleri derinlemesine incelemek mümkün hale gelir. Doğru kullanıldığında, bu SQL özellikleri, büyük veri kümelerinden hızlı ve doğru bir şekilde içgörüler elde etmenizi sağlayarak, daha bilinçli ve stratejik kararlar almanıza yardımcı olur.
Bu makalede ele alınan kavramları ve örnekleri pratik yaparak pekiştirmek, SQL becerilerinizi geliştirmek için en iyi yoldur. Unutmayın ki her veritabanı sistemi (MySQL, PostgreSQL, SQL Server, Oracle vb.) fonksiyon adlarında veya davranışlarında küçük farklılıklar gösterebilir, bu nedenle kullandığınız spesifik veritabanının belgelerini kontrol etmek her zaman iyi bir fikirdir. SQL'in bu güçlü yönlerini ustaca kullanarak, verilerinizin anlatmak istediği hikayeyi çok daha net bir şekilde ortaya çıkarabilirsiniz.
