SQL İfadeleri: Veri Manipülasyonunun ve Sorgulamanın Temel Taşı
SQL (Yapısal Sorgu Dili), ilişkisel veritabanlarını yönetmek ve sorgulamak için kullanılan standart bir dildir. Bu dilin gücü ve esnekliği, büyük ölçüde “SQL İfadeleri” adı verilen temel yapı taşlarından gelir. SQL ifadeleri, veritabanından veri çekmek, verileri dönüştürmek, filtrelemek, sıralamak veya güncellemek için kullanılan, bir değer döndüren kod parçalarıdır. Basit bir sayıdan karmaşık bir hesaplamaya, bir fonksiyonun sonucundan bir alt sorgunun getirdiği değere kadar her şey bir SQL ifadesi olabilir.
SQL ifadeleri olmadan, veritabanlarıyla etkileşimimiz sadece ham veriyi olduğu gibi görmekle sınırlı kalırdı. Ancak ifadeler sayesinde, veriyi ihtiyaçlarımıza göre şekillendirebilir, anlamlı bilgiler çıkarabilir ve hatta veritabanındaki verileri dinamik olarak değiştirebiliriz. Bu makalede, SQL ifadelerinin ne olduğunu, farklı türlerini, çeşitli kullanım alanlarını ve veritabanı performansına etkilerini detaylı bir şekilde inceleyeceğiz.
SQL İfadelerine Giriş
SQL ifadeleri, veritabanı yönetim sistemlerinin (DBMS) sorguları işlerken bir değer üretmek için kullandığı temel bileşenlerdir. Bu değerler, sayısal, metinsel, tarih/saat veya mantıksal (boolean) olabilir. Bir ifade, tek bir sabit değer, bir sütun adı, bir operatörle birleştirilmiş iki değer veya bir fonksiyon çağrısı gibi birçok farklı biçimde olabilir.
SQL ifadeleri, bir SQL sorgusunun veya komutunun hemen hemen her yerinde kullanılabilir:
* SELECT yan tümcesinde: Görüntülenecek sütunları veya hesaplanacak değerleri belirtmek için.
* WHERE yan tümcesinde: Kayıtları filtrelemek için koşullar oluşturmakta.
* HAVING yan tümcesinde: Gruplanmış verileri filtrelemek için.
* ORDER BY yan tümcesinde: Sorgu sonuçlarını sıralamak için.
* UPDATE komutunun SET yan tümcesinde: Bir sütunun yeni değerini belirlemek için.
* INSERT komutunun VALUES yan tümcesinde: Eklenecek değerleri belirtmek için.
Bir örnekle açıklayalım:
SELECT UrunAdi, Fiyat * StokMiktari AS ToplamDeger FROM Urunler WHERE Fiyat > 100;
Bu sorguda, UrunAdi bir sütun ifadesi, Fiyat * StokMiktari bir aritmetik ifade, ToplamDeger bu ifadenin takma adıdır. Fiyat > 100 ise bir karşılaştırma ifadesidir. Her biri, belirli bir bağlamda bir değer üretir.
SQL İfadelerinin Temel Kategorileri
SQL ifadeleri, içerdikleri bileşenlere göre çeşitli kategorilere ayrılabilir. Bu kategoriler, ifadelerin nasıl çalıştığını ve nerede kullanılabileceğini anlamak için önemlidir.
Literaller (Sabitler)
Literaller, doğrudan bir değer temsil eden sabitlerdir. Bir sorguda değişmez bir değer belirtmek istediğimizde kullanılırlar.
* Sayısal Literaller: Tam sayılar (INTEGER), ondalık sayılar (DECIMAL, FLOAT).
* Örnek: 123, 3.14, -500
* Karakter Literalleri: Tek tırnaklar arasına yazılan metin dizileri.
* Örnek: 'Merhaba Dünya', 'SQL İfadeleri', 'A'
* Tarih/Saat Literalleri: Tek tırnaklar arasına yazılan tarih ve/veya saat değerleri. Format veritabanına göre değişebilir.
* Örnek: '2023-10-26', '15:30:00', '2023-10-26 15:30:00'
* Boolean Literalleri: Doğru veya yanlış değerleri.
* Örnek: TRUE, FALSE (bazı sistemlerde 1 ve 0 da kullanılabilir)
* NULL Literali: Bilinmeyen veya mevcut olmayan bir değeri temsil eder.
* Örnek: NULL
Sütun İfadeleri
Bir tablodaki belirli bir sütunun değerini temsil eder. Bir sorguda en sık kullanılan ifade türüdür.
* Örnek: SELECT MusteriAdi FROM Musteriler; (Burada MusteriAdi bir sütun ifadesidir.)
Operatörler
Operatörler, bir veya daha fazla ifade üzerinde işlem yaparak yeni bir değer üreten sembollerdir.
* Aritmetik Operatörler: Sayısal değerler üzerinde matematiksel işlemler yapar.
+ (Toplama), - (Çıkarma), (Çarpma), / (Bölme), % (Modülüs – kalanı bulma)
Örnek: SELECT Fiyat Miktar AS ToplamTutar FROM SiparisDetaylari;
* Karşılaştırma Operatörleri: İki ifadeyi karşılaştırır ve TRUE, FALSE veya NULL değeri döndürür. Genellikle WHERE ve HAVING yan tümcelerinde koşul oluşturmak için kullanılır.
* = (Eşit), != veya <> (Eşit Değil), > (Büyüktür), < (Küçüktür), >= (Büyük Eşit), <= (Küçük Eşit)
* Örnek: SELECT UrunAdi FROM Urunler WHERE StokMiktari < 10;
* Mantıksal Operatörler: Boolean ifadeleri birleştirir veya tersine çevirir.
* AND: Her iki koşul da doğruysa TRUE döndürür.
* OR: Koşullardan en az biri doğruysa TRUE döndürür.
* NOT: Bir koşulun mantıksal tersini döndürür.
Örnek: SELECT FROM Calisanlar WHERE Maas > 5000 AND Departman = 'IT';
* Birleştirme Operatörü: Metin dizilerini birleştirmek için kullanılır. Çoğu veritabanında || (çift dikey çizgi) kullanılırken, SQL Server'da + sembolü bu amaçla kullanılır.
* Örnek (PostgreSQL/Oracle/MySQL): SELECT Ad || ' ' || Soyad AS TamAd FROM Musteriler;
* Örnek (SQL Server): SELECT Ad + ' ' + Soyad AS TamAd FROM Musteriler;
* Diğer Operatörler:
* LIKE: Metin desen eşleştirmesi için kullanılır (% herhangi bir karakter dizisini, _ tek bir karakteri temsil eder).
* Örnek: WHERE UrunAdi LIKE 'B%'; (B ile başlayan ürün adları)
* IN: Bir değerin bir liste içinde olup olmadığını kontrol eder.
* Örnek: WHERE Kategori IN ('Elektronik', 'Giyim');
* BETWEEN: Bir değerin belirli bir aralıkta olup olmadığını kontrol eder (dahil).
* Örnek: WHERE Fiyat BETWEEN 50 AND 100;
* IS NULL / IS NOT NULL: Bir değerin NULL olup olmadığını kontrol eder.
* Örnek: WHERE Eposta IS NULL;
* EXISTS: Bir alt sorgunun herhangi bir satır döndürüp döndürmediğini kontrol eder.
Fonksiyonlar
Fonksiyonlar, bir veya daha fazla argüman alarak belirli bir işlemi gerçekleştiren ve bir değer döndüren önceden tanımlanmış kod bloklarıdır. SQL'de iki ana fonksiyon türü bulunur: tek satır fonksiyonları ve çok satırlı (grup) fonksiyonları.
* Tek Satır Fonksiyonları: Her bir girdi satırı için bir çıktı değeri üretirler. Sonuç kümesindeki satır sayısını değiştirmezler.
* Sayısal Fonksiyonlar:
* ABS(sayı): Mutlak değeri döndürür.
* ROUND(sayı, ondalık): Sayıyı belirtilen ondalık basamağa yuvarlar.
* CEIL(sayı): Sayıyı yukarı doğru en yakın tam sayıya yuvarlar.
* FLOOR(sayı): Sayıyı aşağı doğru en yakın tam sayıya yuvarlar.
* MOD(sayı, bölen): Kalanı döndürür (modülüs).
* POWER(taban, üs): Üslü sayıyı hesaplar.
* SQRT(sayı): Karekökü hesaplar.
Örnek: SELECT UrunAdi, ROUND(Fiyat 1.08, 2) AS KDVliFiyat FROM Urunler;
* Karakter (Metin) Fonksiyonları:
* LENGTH(metin): Metin dizisinin uzunluğunu döndürür (bazı sistemlerde LEN veya CHAR_LENGTH).
* SUBSTR(metin, başlangıç, uzunluk): Metin dizisinden bir alt dizeyi çıkarır (bazı sistemlerde SUBSTRING).
* UPPER(metin): Metni büyük harfe dönüştürür.
* LOWER(metin): Metni küçük harfe dönüştürür.
* TRIM(metin): Metnin başındaki ve sonundaki boşlukları kaldırır.
* CONCAT(metin1, metin2, ...): Metin dizilerini birleştirir (bazı sistemlerde || veya + operatörleri tercih edilir).
* REPLACE(metin, aranacak, yeni): Metin içindeki bir alt dizeyi başka bir alt dizeyle değiştirir.
* Örnek: SELECT UPPER(MusteriAdi) AS BuyukHarfAd FROM Musteriler;
* Tarih/Saat Fonksiyonları:
* CURRENT_DATE: Mevcut tarihi döndürür.
* CURRENT_TIMESTAMP: Mevcut tarih ve saati döndürür.
* DATE_ADD(tarih, INTERVAL değer birim) (MySQL) / DATEADD(birim, değer, tarih) (SQL Server): Tarihe belirli bir zaman aralığı ekler.
* EXTRACT(birim FROM tarih) (PostgreSQL/Oracle): Tarih/saat değerinden belirli bir parçayı (yıl, ay, gün vb.) çıkarır.
* DATEDIFF(birim, tarih1, tarih2) (SQL Server/MySQL): İki tarih arasındaki farkı belirtilen birimde döndürür.
* Örnek: SELECT SiparisTarihi, DATE_ADD(SiparisTarihi, INTERVAL 7 DAY) AS TeslimTarihi FROM Siparisler;
* Dönüşüm Fonksiyonları: Bir veri türünü başka bir veri türüne dönüştürür.
* CAST(ifade AS veri_türü): Bir ifadeyi belirtilen veri türüne dönüştürür.
* CONVERT(veri_türü, ifade, stil) (SQL Server): CAST ile benzer işlev görür, ancak stil parametresiyle formatlama seçenekleri sunar.
* Örnek: SELECT CAST(Fiyat AS DECIMAL(10, 2)) FROM Urunler;
* Genel Fonksiyonlar:
* COALESCE(ifade1, ifade2, ...): NULL olmayan ilk ifadeyi döndürür.
* NVL(ifade1, ifade2) (Oracle): COALESCE ile benzer, ancak yalnızca iki argüman alır.
* Örnek: SELECT COALESCE(Telefon, Eposta, 'Bilgi Yok') AS IletisimBilgisi FROM Musteriler;
* Çok Satırlı (Grup) Fonksiyonları (Aggregate Functions): Bir grup satır üzerinde işlem yaparak tek bir özet değeri döndürürler. Genellikle GROUP BY yan tümcesiyle birlikte kullanılırlar.
COUNT(sütun): Bir sütundaki NULL olmayan satırların sayısını döndürür. COUNT() tüm satırları sayar.
* SUM(sütun): Bir sütundaki sayısal değerlerin toplamını döndürür.
* AVG(sütun): Bir sütundaki sayısal değerlerin ortalamasını döndürür.
* MIN(sütun): Bir sütundaki en küçük değeri döndürür.
* MAX(sütun): Bir sütundaki en büyük değeri döndürür.
* Örnek: SELECT Kategori, AVG(Fiyat) AS OrtalamaFiyat FROM Urunler GROUP BY Kategori;
Koşullu İfadeler (CASE İfadesi)
CASE ifadesi, SQL'in en güçlü ve esnek ifadelerinden biridir. Bir dizi koşulu değerlendirerek, ilk doğru olan koşula karşılık gelen değeri döndürür. IF-THEN-ELSE mantığına benzer.
İki ana biçimi vardır:
1. Basit CASE İfadesi: Bir sütunun veya ifadenin değerini belirli sabit değerlerle karşılaştırır.
CASE SütunAdi
WHEN Deger1 THEN Sonuc1
WHEN Deger2 THEN Sonuc2
ELSE VarsayilanSonuc
END
2. Aranan (Searched) CASE İfadesi: Her WHEN yan tümcesinde bağımsız bir koşul belirtir. Bu daha esnek bir kullanımdır.
CASE
WHEN Kosul1 THEN Sonuc1
WHEN Kosul2 THEN Sonuc2
ELSE VarsayilanSonuc
END
* Örnek:
SELECT UrunAdi, StokMiktari,
CASE
WHEN StokMiktari > 50 THEN 'Yüksek Stok'
WHEN StokMiktari BETWEEN 10 AND 50 THEN 'Orta Stok'
ELSE 'Düşük Stok'
END AS StokDurumu
FROM Urunler;
CASE ifadeleri, raporlama, veri kategorizasyonu ve dinamik hesaplamalar için vazgeçilmezdir.
Alt Sorgular (Subqueries)
Bir SQL sorgusu içinde başka bir SQL sorgusu kullanılmasına alt sorgu denir. Alt sorgular, bir ifadenin parçası olarak bir değer veya değer kümesi döndürebilirler.
* Tek Değer Döndüren Alt Sorgular: SELECT, WHERE, HAVING, UPDATE SET gibi yerlerde tek bir değer beklenen durumlarda kullanılır.
* Örnek: SELECT UrunAdi FROM Urunler WHERE Fiyat > (SELECT AVG(Fiyat) FROM Urunler);
* Burada (SELECT AVG(Fiyat) FROM Urunler) alt sorgusu, tüm ürünlerin ortalama fiyatını döndüren tek bir sayısal ifadedir.
* Değer Listesi Döndüren Alt Sorgular: IN veya EXISTS operatörleriyle birlikte kullanılır.
* Örnek: SELECT MusteriAdi FROM Musteriler WHERE MusteriID IN (SELECT MusteriID FROM Siparisler WHERE SiparisTarihi = '2023-10-26');
SQL İfadelerinin Kullanım Alanları ve Örnekler
SQL ifadeleri, SQL komutlarının her yerinde veri manipülasyonu ve sorgulama için temel bir rol oynar.
SELECT İfadesinde Veri Seçimi ve Dönüştürme
SELECT yan tümcesi, ifadelerin en yaygın kullanıldığı yerdir. Sütunları seçmek, yeni hesaplanmış sütunlar oluşturmak ve veriyi formatlamak için kullanılır.
* Hesaplamalı Sütunlar:
SELECT UrunAdi, Fiyat, Miktar, (Fiyat * Miktar) AS ToplamKalemTutari
FROM SiparisDetaylari;
* Fonksiyonlarla Veri Formatlama:
SELECT MusteriAdi, UPPER(SUBSTR(MusteriAdi, 1, 1)) || LOWER(SUBSTR(MusteriAdi, 2)) AS FormatliAd
FROM Musteriler;
Bu örnekte, müşteri adının ilk harfini büyük, diğerlerini küçük yapar ve birleştirir.
* CASE ile Dinamik Sütunlar:
SELECT CalisanAdi, Maas,
CASE
WHEN Maas < 3000 THEN 'Düşük Gelir'
WHEN Maas BETWEEN 3000 AND 6000 THEN 'Orta Gelir'
ELSE 'Yüksek Gelir'
END AS GelirSeviyesi
FROM Calisanlar;
WHERE ve HAVING Yan Tümcelerinde Koşullu Filtreleme
WHERE ve HAVING yan tümceleri, sorgu sonuçlarını belirli koşullara göre filtrelemek için boolean ifadeler kullanır.
* Tek Satır Koşulları (WHERE):
SELECT UrunAdi, Fiyat
FROM Urunler
WHERE Fiyat > 50 AND Kategori = 'Elektronik';
Burada Fiyat > 50 ve Kategori = 'Elektronik' birer karşılaştırma ifadesidir ve AND operatörüyle birleştirilmiştir.
* Grup Koşulları (HAVING):
SELECT Kategori, COUNT(*) AS UrunSayisi, AVG(Fiyat) AS OrtalamaFiyat
FROM Urunler
GROUP BY Kategori
HAVING COUNT(*) > 5 AND AVG(Fiyat) > 100;
HAVING yan tümcesinde COUNT(*) ve AVG(Fiyat) gibi grup fonksiyonlarının sonuçları üzerinde filtreleme yapılır.
ORDER BY Yan Tümcesinde Sıralama
ORDER BY yan tümcesi, sorgu sonuçlarını bir veya daha fazla sütun veya ifadeye göre sıralamak için kullanılır.
* İfadeye Göre Sıralama:
SELECT UrunAdi, Fiyat, StokMiktari
FROM Urunler
ORDER BY (Fiyat * StokMiktari) DESC; -- Toplam değere göre azalan sıralama
* Fonksiyon Sonuçlarına Göre Sıralama:
SELECT MusteriAdi, LENGTH(MusteriAdi) AS AdUzunlugu
FROM Musteriler
ORDER BY LENGTH(MusteriAdi) ASC; -- Ad uzunluğuna göre artan sıralama
UPDATE İfadesinde Veri Güncelleme
UPDATE komutunun SET yan tümcesi, bir sütunun değerini yeni bir ifadeyle değiştirmek için kullanılır.
* Sütun Değerini İfadeyle Güncelleme:
UPDATE Urunler
SET Fiyat = Fiyat * 1.10 -- Fiyatı %10 artır
WHERE Kategori = 'Kitap';
* Fonksiyon Kullanarak Güncelleme:
UPDATE Calisanlar
SET Eposta = LOWER(REPLACE(Ad, ' ', '.')) || '@sirket.com'
WHERE Eposta IS NULL;
INSERT İfadesinde Veri Ekleme
INSERT komutunun VALUES yan tümcesi, eklenecek her bir sütun için bir ifade belirtebilir.
* İfadeyle Veri Ekleme:
INSERT INTO Loglar (LogTarihi, Mesaj)
VALUES (CURRENT_TIMESTAMP, 'Yeni kullanıcı kaydı yapıldı.');
Burada CURRENT_TIMESTAMP bir tarih/saat fonksiyonu ifadesidir.
* Hesaplanmış Değerlerle Ekleme:
INSERT INTO SiparisDetaylari (SiparisID, UrunID, Miktar, BirimFiyat, ToplamTutar)
VALUES (101, 205, 3, 25.50, (3 * 25.50));
Gelişmiş SQL İfadeleri ve Performans İpuçları
SQL ifadelerini etkin bir şekilde kullanmak, sadece doğru sonuçlar almakla kalmaz, aynı zamanda sorgu performansını da önemli ölçüde etkiler.
İfade Optimizasyonu
* İndeks Kullanımı: WHERE yan tümcesindeki ifadeler, veritabanının indeksleri kullanma yeteneğini etkileyebilir. Bir sütun üzerinde bir fonksiyon kullanmak (örn: WHERE UPPER(SutunAdi) = 'DEGER'), genellikle o sütun üzerindeki indeksin kullanılmasını engeller ve tam tablo taramasına neden olabilir. Mümkünse, fonksiyonları WHERE yan tümcesinin sağ tarafına taşımaya çalışın veya fonksiyon tabanlı indeksler oluşturmayı düşünün.
* Kötü: WHERE YEAR(SiparisTarihi) = 2023; (İndeks kullanılamayabilir)
* İyi: WHERE SiparisTarihi BETWEEN '2023-01-01' AND '2023-12-31'; (İndeks kullanılabilir)
* Karmaşık İfadelerden Kaçınma: Çok karmaşık veya iç içe ifadeler, sorgu iyileştiricinin (optimizer) işini zorlaştırabilir. Okunabilirliği ve bakımı kolaylaştırmak için karmaşık mantığı CTE'ler (Common Table Expressions) veya view'lar kullanarak parçalara ayırmak faydalı olabilir.
* Alt Sorguların Performansı: Alt sorgular bazı durumlarda kullanışlı olsa da, büyük veri kümeleri üzerinde performans sorunlarına yol açabilir. Mümkünse, JOIN işlemleri genellikle alt sorgulardan daha verimlidir. İlişkili alt sorgular (correlated subqueries) özellikle dikkat gerektirir, çünkü dış sorgunun her satırı için tekrar tekrar çalıştırılabilirler.
Veritabanı Sistemleri Arasındaki Farklılıklar
SQL ifadeleri ve fonksiyonları, SQL standardına uygun olsa da, farklı veritabanı yönetim sistemleri (DBMS) arasında bazı sentaks ve işlevsel farklılıklar gösterebilir.
* Fonksiyon İsimleri: Örneğin, metin uzunluğunu almak için Oracle'da LENGTH(), SQL Server'da LEN(), MySQL'de LENGTH() veya CHAR_LENGTH() kullanılabilir. Tarih/saat fonksiyonları ve dönüşüm fonksiyonları da sıklıkla farklılık gösterir.
* Operatör Farklılıkları: String birleştirme operatörü (|| vs +) en bilinen örneklerdendir.
* NULL Değer İşleme: NULL değerlerin matematiksel veya mantıksal işlemler üzerindeki etkisi genellikle standart olsa da, NULL değerleri yönetmek için kullanılan fonksiyonlar (Oracle'da NVL, SQL Server'da ISNULL, çoğu sistemde COALESCE) farklılık gösterebilir.
* CASE Benzeri Yapılar: CASE ifadesi evrensel olsa da, bazı sistemler (örn: SQL Server'da IIF) daha kısa sentaks sağlayan özel koşullu fonksiyonlar sunabilir.
Güvenlik ve Hata Yönetimi
SQL ifadelerini kullanırken güvenlik ve hata yönetimi konuları da göz önünde bulundurulmalıdır.
* SQL Enjeksiyonu Riski: Kullanıcı girdisini doğrudan SQL ifadelerine dahil etmek, SQL enjeksiyonu saldırılarına davetiye çıkarabilir. Bu, kötü niyetli kullanıcıların veritabanını manipüle etmesine veya hassas verilere erişmesine olanak tanır. Bu riskten korunmak için parametreli sorgular (prepared statements) veya ORM (Object-Relational Mapping) araçları kullanılmalıdır. Asla kullanıcı girdilerini doğrudan string birleştirme yoluyla sorguya eklemeyin.
* Hata Yakalama ve NULL Değerler: SQL ifadeleri, veri türü uyumsuzlukları veya NULL değerlerle karşılaştığında hatalara veya beklenmedik sonuçlara yol açabilir. Örneğin, NULL bir değerle yapılan herhangi bir aritmetik işlem genellikle NULL sonucunu döndürür. Bu durumu yönetmek için COALESCE, NVL veya ISNULL gibi fonksiyonlar kullanılabilir.
Örnek: SELECT UrunAdi, COALESCE(StokMiktari, 0) Fiyat AS ToplamDeger FROM Urunler; (StokMiktari NULL ise 0 kabul eder.)
* Veri Türü Uyumsuzlukları: İfadelerdeki farklı veri türleri arasında işlem yaparken, veritabanı örtük (implicit) veya açık (explicit) dönüşümler yapar. Örtük dönüşümler her zaman beklenen şekilde çalışmayabilir veya performans sorunlarına neden olabilir. Açık dönüşümler (CAST veya CONVERT kullanarak) kullanmak, daha güvenli ve öngörülebilir sonuçlar sağlar.
Sonuç
SQL ifadeleri, SQL dilinin kalbidir ve veritabanlarıyla etkileşim kurmanın temelini oluşturur. Literallerden operatörlere, güçlü fonksiyonlardan koşullu CASE ifadelerine ve alt sorgulara kadar geniş bir yelpazede sunulan bu araçlar, veriyi seçme, dönüştürme, filtreleme ve güncelleme yeteneklerimizi katbekat artırır. Bir veritabanı uzmanı veya geliştirici olarak, SQL ifadelerini derinlemesine anlamak ve etkin bir şekilde kullanmak, daha güçlü, esnek ve performanslı sorgular yazmanın anahtarıdır.
Farklı veritabanı sistemleri arasındaki sentaks ve davranış farklılıklarının farkında olmak, ifadeleri doğru ve taşınabilir bir şekilde kullanmak için önemlidir. Ayrıca, güvenlik ve performans konularını göz önünde bulundurarak ifadeleri optimize etmek, uygulamalarınızın sağlamlığını ve verimliliğini artıracaktır. SQL ifadeleri üzerinde pratik yapmak, çeşitli senaryolarda denemeler yapmak ve veritabanınızın dokümantasyonunu incelemek, bu güçlü araçları ustalıkla kullanmanızı sağlayacaktır.