Gereksinimler ve Ön Hazırlık
Uygulamalarınızda filtreleme işlemlerini gerçekleştirmek için öncelikle standart bir SQL veritabanı yönetim sistemine (PostgreSQL, MySQL veya SQL Server gibi) ihtiyacınız vardır. Bu rehberdeki örnekler, genel SQL standartlarına uygun olarak hazırlanmıştır.
- Veritabanı Motoru: PostgreSQL 16+ veya MySQL 8.4+ sürümü önerilir.
- Geliştirme Ortamı: SQL sorgularını test edebileceğiniz bir arayüz (DBeaver, pgAdmin veya terminal).
- Temel Bilgi: Tablo yapısı, birincil anahtarlar (Primary Key) ve temel SELECT sorguları hakkında bilgi sahibi olmanız beklenir.
Adım 1: Temel Filtreleme Mantığı ve WHERE Kullanımı
Veri filtrelemenin en temel yolu WHERE ifadesidir. Ancak, doğru filtreleme sadece veriyi getirmek değil, gereksiz veriyi işlem dışı bırakmaktır. Aşağıdaki örnek, belirli bir kategoriye ait ürünleri filtrelemek için kullanılır.
-- Belirli bir kategoriye ait aktif ürünleri filtreleme
SELECT urun_adi, fiyat
FROM urunler
WHERE kategori_id = 5 AND durum = 'aktif';
Bu sorgu, veritabanına sadece kategori_id değeri 5 olan ve durumu 'aktif' olan kayıtları taramasını söyler. Performans için kategori_id ve durum sütunlarına indeks (index) eklemek, sorgu süresini milisaniyelere indirir.
Adım 2: Dinamik Filtreleme ve SQL Injection Koruması
Uygulama geliştirirken filtreleme kriterleri genellikle kullanıcıdan gelir. Kullanıcı girdilerini doğrudan sorguya eklemek, SQL Injection saldırılarına kapı aralar. Bu nedenle her zaman "Prepared Statements" (Hazırlanmış İfadeler) kullanmalısınız.
-- PHP PDO ile güvenli filtreleme örneği
$sql = "SELECT * FROM kullanicilar WHERE sehir = :sehir AND yas > :yas";
$stmt = $pdo->prepare($sql);
$stmt->execute(['sehir' => 'Istanbul', 'yas' => 18]);
$sonuclar = $stmt->fetchAll();
Burada :sehir ve :yas parametreleri, veritabanı sürücüsü tarafından temizlenerek işlenir. Kullanıcıdan gelen veriyi asla doğrudan string birleştirme ile sorguya dahil etmeyin.
Adım 3: İndeksleme ile Performans Artırma
Filtreleme işlemlerinde veritabanı tablonuz büyüdükçe, arama süresi doğrusal olarak artar. İndeksleme, veritabanının tüm tabloyu taramak yerine, bir "içindekiler" sayfası gibi doğrudan ilgili satıra gitmesini sağlar.
-- Filtreleme sütunları için indeks oluşturma
CREATE INDEX idx_urun_kategori_durum ON urunler(kategori_id, durum);
Bu indeks, kategori_id ve durum sütunlarını içeren sorguları optimize eder. Çok sütunlu indekslerde, sorgudaki filtreleme sırasının indeks sırasıyla uyumlu olması performansı doğrudan etkiler.
Adım 4: Gelişmiş Filtreleme Teknikleri (LIKE ve BETWEEN)
Kullanıcılar bazen tam eşleşme yerine kısmi eşleşme (arama çubuğu gibi) isterler. LIKE operatörü metin tabanlı filtrelemeler için kullanılırken, BETWEEN sayısal veya tarih aralıkları için idealdir.
-- Metin içinde arama ve tarih aralığı filtreleme
SELECT * FROM siparisler
WHERE musteri_adi LIKE '%Ahmet%'
AND siparis_tarihi BETWEEN '2026-01-01' AND '2026-01-31';
Dikkat: LIKE '%metin%' kullanımı, başındaki joker karakter (%) nedeniyle indeksin kullanılmasını engeller ve tam tablo taramasına (Full Table Scan) neden olur. Büyük verilerde bu yöntem yerine "Full-Text Search" (Tam Metin Arama) özelliklerini kullanmalısınız.
Adım 5: Filtreleme Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| WHERE Eşitlik | Çok hızlı, indeks dostu | Sadece tam eşleşme |
| LIKE | Esnek arama | Büyük veride yavaş |
| BETWEEN | Aralık sorguları için temiz | Sadece belirli veri tipleri |
| Full-Text Search | Gelişmiş metin analizi | Kurulum ve yönetim maliyeti |
Adım 6: Sayfalama (Pagination) ile Veri Yönetimi
Filtrelenmiş veriler bazen binlerce satır olabilir. Tüm veriyi tek seferde çekmek, uygulamanın çökmesine veya yavaşlamasına neden olur. LIMIT ve OFFSET kullanarak veriyi parçalar halinde sunmalısınız.
-- 20'şerli sayfalama ile filtreleme
SELECT * FROM urunler
WHERE kategori_id = 5
ORDER BY id DESC
LIMIT 20 OFFSET 0;
Bu örnekte, ilk 20 kayıt çekilir. İkinci sayfa için OFFSET 20 kullanılarak veritabanı yükü dengelenir. Büyük veritabanlarında çok yüksek OFFSET değerleri performans kaybına yol açabilir; bu durumda "Cursor-based pagination" yöntemini araştırmalısınız.
Kritik Güvenlik Uyarısı: Veritabanı sorgularınızda asla kullanıcıdan gelen veriyi doğrudan sorgu metnine eklemeyin. SQL Injection saldırıları, veritabanınızın silinmesine veya tüm verilerin çalınmasına neden olabilir. Daima Prepared Statements (Hazırlanmış İfadeler) kullanın.
Sıkça Sorulan Sorular
Filtreleme sorgularım çok yavaş çalışıyor, ne yapmalıyım?
Sorgunuzun yavaş çalışmasının en büyük nedeni indeks eksikliğidir. EXPLAIN ANALYZE komutunu kullanarak sorgunun hangi aşamada tıkandığını görebilir ve ilgili sütunlara indeks ekleyebilirsiniz.
LIKE operatörü ile arama yaparken performans kaybını nasıl önlerim?
Eğer çok büyük bir metin tablosunda arama yapıyorsanız, veritabanınızın sunduğu Full-Text Search (Tam Metin Arama) indekslerini veya Elasticsearch gibi harici arama motorlarını kullanmalısınız.
NULL değerleri filtrelerken nelere dikkat etmeliyim?
SQL'de NULL değerler = operatörü ile sorgulanamaz. Bunun yerine IS NULL veya IS NOT NULL ifadelerini kullanmanız gerekir.
Birden fazla filtreyi aynı anda kullanmak sorguyu bozar mı?
Hayır, AND ve OR operatörlerini parantez kullanarak mantıksal gruplar oluşturmak sorguyu bozmaz, aksine daha hassas sonuçlar almanızı sağlar.
Veritabanı filtrelemesi mi yoksa uygulama tarafında filtreleme mi daha iyidir?
Her zaman veritabanı tarafında filtreleme yapmak daha iyidir. Uygulama tarafında filtreleme yapmak, gereksiz verinin bellek (RAM) üzerine taşınmasına neden olur ve ciddi performans sorunları yaratır.
Veritabanı Sorgu Planlarını (Execution Plan) Okuma ve Analiz Etme
SQL sorgularınızın neden yavaş çalıştığını anlamanın en etkili yolu, veritabanı motorunun sorguyu nasıl işlediğini gösteren Execution Plan (Çalıştırma Planı) analizidir. Bu planlar, veritabanının veriye ulaşmak için hangi indeksleri kullandığını, hangi tablolarda tam tarama (Full Table Scan) yaptığını ve birleştirme (join) işlemlerinde hangi algoritmaları tercih ettiğini görmenizi sağlar.
EXPLAIN Komutu ile Sorgu Analizi
MySQL, PostgreSQL ve SQLite gibi sistemlerde sorgunuzun başına EXPLAIN anahtar kelimesini ekleyerek veritabanının sorguyu nasıl yürüteceğini görebilirsiniz. Aşağıdaki örnek, bir filtreleme sorgusunun maliyetini analiz etmenize yardımcı olur:
EXPLAIN SELECT * FROM urunler
WHERE kategori_id = 5
AND fiyat BETWEEN 100 AND 500;
Bu komutu çalıştırdığınızda dönen sonuç tablosunda dikkat etmeniz gereken kritik sütunlar şunlardır:
- type: 'ALL' değeri, veritabanının tüm tabloyu taradığını gösterir (indeks eksikliği olabilir). 'ref' veya 'range' değerleri ise indeksin başarıyla kullanıldığını işaret eder.
- rows: Sorgunun sonuç döndürmek için incelemesi gereken tahmini satır sayısıdır. Bu sayının düşük olması performansın yüksek olduğu anlamına gelir.
- key: Sorgu için kullanılan indeks adını gösterir. Eğer bu sütun boşsa, sorgunuz indekslenmemiş bir sütun üzerinde çalışıyordur.
Filtreleme İşlemlerinde Hata Ayıklama (Debugging) Stratejileri
Karmaşık filtreleme mantıkları kurarken, özellikle dinamik SQL oluşturduğunuzda beklenmedik sonuçlar alabilirsiniz. Hata ayıklama sürecini hızlandırmak için şu adımları izleyebilirsiniz:
1. Dinamik Sorguları Loglama
Uygulama tarafında oluşturduğunuz SQL sorgularını, veritabanına göndermeden önce mutlaka bir log dosyasına yazdırın. Bu, parametrelerin doğru yerleşip yerleşmediğini görmenizi sağlar.
// Örnek: PHP/PDO ile dinamik sorgu loglama
$sql = "SELECT * FROM siparisler WHERE durum = :durum";
error_log("Çalıştırılan Sorgu: " . $sql . " | Parametre: " . $durum_degeri);
$stmt = $pdo->prepare($sql);
$stmt->execute(['durum' => $durum_degeri]);
2. Filtre Kombinasyonlarını Test Etme
Kullanıcıların seçebileceği tüm filtre kombinasyonlarını bir matris üzerinde test edin. Özellikle "Hiçbir filtre seçilmediğinde" veya "Tüm filtreler seçildiğinde" oluşabilecek mantıksal hataları (örneğin, eksik AND veya OR bağlaçları) önceden belirleyin.
İpucu: Filtreleme sorgularınızdaWHERE 1=1kalıbını kullanmak, dinamik olarakANDeklemeyi kolaylaştırır. Ancak, bu yöntemin sorgu planı üzerindeki etkisini her zamanEXPLAINile kontrol etmeyi unutmayın.
Performans İçin İleri İpuçları
Büyük veri setlerinde filtreleme yaparken şu teknikleri göz önünde bulundurun:
- Covering Index: Sadece filtrelediğiniz sütunları değil,
SELECTile çektiğiniz tüm sütunları kapsayan indeksler oluşturarak veritabanının tabloya gitmesine gerek kalmadan doğrudan indeksten veri okumasını sağlayın. - Partial Index: Sadece belirli bir koşulu sağlayan veriler için indeks oluşturarak (örneğin, sadece
aktif = 1olan satırlar için) indeks boyutunu küçültün. - Denormalizasyon: Çok sık filtrelediğiniz veriler için ayrı bir özet tablo (summary table) tutarak karmaşık
JOINişlemlerinden kaçının.
Sonuç
Sql & veri tabanı ile uygulamalar için veri kayıt filtreleme nasıl yapılır sorusu, verimlilik ve güvenlik ile doğrudan ilişkilidir. Doğru indeksleme stratejileri, güvenli sorgu yazımı ve sayfalama teknikleri ile kullanıcılarınıza profesyonel bir deneyim sunabilirsiniz. Bir sonraki adım olarak, veritabanı sorgu planlarını analiz etmeyi (Query Execution Plan) öğrenerek, yazdığınız SQL kodlarının arka planda nasıl çalıştığını derinlemesine inceleyebilirsiniz.
Yasal Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce veritabanı yedeklerinizi almalı ve güvenlik testlerini gerçekleştirmelisiniz. Uygulamanızın veri güvenliği tamamen geliştiricinin sorumluluğundadır.


Yorumlar (0)
Yorum Yaz