WHERE ile Filtreleme
Bir önceki derste tablolardan SELECT ile sütun seçmeyi ve ORDER BY ile sonuçları sıralamayı öğrenmiştik. Bu derste sorgularımıza koşul ekleyerek yalnızca işimize yarayan satırları filtrelemeyi öğreneceğiz. Bir sonraki derste ise GROUP BY ile satırları gruplayıp özetler çıkaracağız; bu yüzden filtreleme becerisi, iyi bir gruplama için de temel oluşturacak.
Bu derste ne yapacağız?
Amacımız, WHERE ifadesini kullanarak bir tablodaki milyonlarca satır arasından yalnızca belirli koşulu sağlayan satırları getirmeyi öğrenmek. Karşılaştırma operatörlerini (eşittir, büyüktür, küçüktür gibi) ve mantıksal operatörleri (AND, OR, NOT) birlikte kullanarak birden fazla koşulu aynı anda uygulayacağız. Bu dersi takip edebilmek için SELECT ile sütun seçmeyi ve temel tablo yapısını (satır, sütun kavramlarını) bilmeniz yeterli; herhangi bir kurulum gerekmiyor, önceki derste kullandığınız aynı ortamda devam edebilirsiniz.
Kavram
WHERE ifadesini bir elemeden geçirme işlemi gibi düşünebilirsiniz. Bir markette meyve reyonundan sadece kırmızı elmaları toplamak istediğinizde, tüm meyveleri sepete atıp sonra ayıklamazsınız; daha baştan "sadece kırmızı elma" kuralına uyanları seçersiniz. SQL'de de WHERE ifadesi tam olarak bunu yapar: veritabanı, tablodaki her satıra tek tek bakar, yazdığınız koşulu sağlayıp sağlamadığını kontrol eder ve yalnızca koşulu sağlayan satırları sonuç olarak döndürür.
Koşulları yazarken kullandığımız karşılaştırma operatörleri şunlardır: eşittir için =, eşit değildir için <> veya !=, büyüktür için >, küçüktür için <, büyük eşittir için >=, küçük eşittir için <=. Birden fazla koşulu aynı anda kontrol etmek istediğimizde ise mantıksal operatörler devreye girer: AND hem bu hem şu koşulunun ikisinin de doğru olmasını ister (örneğin hem kırmızı hem tatlı elma), OR koşullardan en az birinin doğru olmasını yeterli sayar (kırmızı veya yeşil elma), NOT ise bir koşulun tersini alır (kırmızı olmayan elmalar).
Adım adım uygulama
Örneklerimizde, bir mağazanın satışlarını tuttuğunu varsayacağımız satislar adlı bir tablo kullanacağız. Bu tabloda urun_adi, kategori, fiyat ve adet gibi sütunlar bulunduğunu düşünelim.
- Öncelikle tek bir koşulla filtreleme yapalım. Kullandığınız veritabanı aracında (örneğin DB Browser for SQLite, MySQL Workbench veya benzeri bir program) yeni bir sorgu penceresi açın ve aşağıdaki kodu yazın:
Bu sorguda ilk satır hangi sütunları göreceğimizi belirtir, ikinci satır hangi tablodan veri çekeceğimizi söyler, üçüncü satır ise yalnızca fiyatı 100'den büyük olan satırların getirilmesini ister. Sorguyu çalıştırmak için genellikle araçtaki Çalıştır veya Execute düğmesine tıklarsınız; klavye kısayolu çoğu araçta F5 tuşudur.SELECT urun_adi, fiyat FROM satislar WHERE fiyat > 100; - Şimdi metin tabanlı bir koşul deneyelim. Metin (yazı) değerlerini karşılaştırırken tek tırnak içine almamız gerekir:
Bu sorgu, yalnızca kategorisi tam olarak "Elektronik" olan satırları getirir. Büyük-küçük harf duyarlılığı kullandığınız veritabanı sistemine göre değişebilir; bu yüzden arayüzünüzde farklı sonuç alırsanız yazımı kontrol etmenizi öneririz.SELECT urun_adi, kategori FROM satislar WHERE kategori = 'Elektronik'; - Şimdi iki koşulu AND ile birleştirelim, yani her iki koşulun da aynı anda sağlanmasını isteyelim:
Bu sorgu, hem kategorisi "Elektronik" olan hem de fiyatı 500'den küçük olan ürünleri listeler. İki şartın da aynı anda doğru olması gerektiğini unutmayın.SELECT urun_adi, kategori, fiyat FROM satislar WHERE kategori = 'Elektronik' AND fiyat < 500; - Şimdi de OR operatörünü deneyelim, yani koşullardan sadece birinin sağlanması yeterli olsun:
Bu sorgu, kategorisi "Elektronik" veya "Giyim" olan tüm satırları getirir. İki kategoriden herhangi birine uyan her satır sonuçta yer alır.SELECT urun_adi, kategori FROM satislar WHERE kategori = 'Elektronik' OR kategori = 'Giyim'; - Son olarak NOT ile bir koşulun tersini alalım:
Bu sorgu, kategorisi "Elektronik" olmayan tüm satırları getirir. NOT operatörünü genellikle belirli bir grubu dışarıda bırakmak istediğimizde kullanırız.SELECT urun_adi, kategori FROM satislar WHERE NOT kategori = 'Elektronik'; - Dilerseniz birden fazla operatörü parantezlerle birlikte kullanarak daha karmaşık koşullar da yazabilirsiniz:
Buradaki parantez, önce OR koşulunun değerlendirilmesini, ardından bu sonucun AND ile fiyat koşuluyla birleştirilmesini sağlar. Parantez kullanmak, karmaşık koşullarda okunabilirliği ve doğruluğu artırır.SELECT urun_adi, kategori, fiyat FROM satislar WHERE (kategori = 'Elektronik' OR kategori = 'Giyim') AND fiyat >= 200;
Sık karşılaşılan sorunlar
| Hata / Durum | Çözüm |
|---|---|
| Metin değeri tırnaksız yazıldığında hata alınması (örneğin kategori = Elektronik) | Metin (yazı) değerlerini her zaman tek tırnak içine alın: kategori = 'Elektronik' |
| Sorgu hiç sonuç döndürmüyor | Koşulda yazım hatası olup olmadığını, sütun adının doğru yazıldığını ve karşılaştırdığınız değerin tablodaki gerçek verilerle eşleştiğini kontrol edin |
| AND ve OR birlikte kullanıldığında beklenmeyen sonuçlar gelmesi | Öncelik sırası kafa karıştırabilir; hangi koşulların birlikte değerlendirilmesini istediğinizi parantez içine alarak netleştirin |
| Büyük-küçük harf farkından dolayı beklenen satırların gelmemesi | Kullandığınız veritabanı sisteminin büyük-küçük harf duyarlılığını kontrol edin; gerekirse arama değerini tablodaki yazımla birebir eşleştirin |
| Sayısal bir sütunu tırnak içine alınca hata veya yanlış sonuç alınması | Sayısal değerleri tırnaksız yazın, örneğin fiyat > 100 şeklinde; tırnak yalnızca metin değerleri için gereklidir |
Mini görev
Kendi satislar tablonuzda (veya elinizdeki herhangi bir örnek tabloda) aşağıdaki üç sorguyu kendi başınıza yazıp çalıştırın:
- Fiyatı 50'den büyük olan ürünleri, ürün adı ve fiyat sütunlarıyla listeleyin.
- Kategorisi "Gıda" olan ve fiyatı 20'den küçük olan ürünleri AND kullanarak listeleyin.
- Kategorisi "Gıda" veya "Temizlik" olan ürünleri OR kullanarak listeleyin.
Kontrol listesi:
- Her sorguda WHERE ifadesini doğru sütun adıyla kullandınız mı?
- Metin değerlerini tek tırnak içine aldınız mı?
- Sayısal değerleri tırnaksız bıraktınız mı?
- Sorgu çalıştığında sonuçların koşula gerçekten uyduğunu gözle kontrol ettiniz mi?
Kendini sına
1) WHERE ifadesinin görevi nedir?
2) Metin (yazı) değerlerini bir koşulda karşılaştırırken neye dikkat etmeliyiz?
3) AND ile OR arasındaki temel fark nedir?
4) NOT kategori = 'Elektronik' ifadesi hangi satırları getirir?
5) Aşağıdaki sorguda parantez neden kullanılmıştır?
WHERE (kategori = 'Elektronik' OR kategori = 'Giyim') AND fiyat >= 200
Cevaplar
1) Tablodaki satırlar arasından yalnızca belirtilen koşulu sağlayanları filtreleyip sonuç olarak döndürür.
2) Metin değerleri tek tırnak içine alınmalıdır, örneğin 'Elektronik'.
AND, tüm koşulların aynı anda doğru olmasını gerektirir; OR ise koşullardan en az birinin doğru olmasını yeterli sayar.
4) Kategorisi "Elektronik" olmayan tüm satırları getirir.
5) Parantez, önce kategori koşulunun (Elektronik veya Giyim) birlikte değerlendirilmesini, ardından bu sonucun fiyat koşuluyla AND ile birleştirilmesini sağlamak için kullanılmıştır; böylece koşulların hangi sırayla değerlendirileceği netleşir.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol