# PostgreSQL’de WHERE NOT EQUAL Nasıl Kullanılır?
PostgreSQL veritabanınızda belirli bir değere eşit *olmayan* kayıtları seçmek istiyorsunuz, değil mi? Bu oldukça yaygın bir sorundur ve doğru yaklaşımı bilmek veritabanı sorgularınızın performansını ve doğruluğunu önemli ölçüde etkiler. Bu makalede, PostgreSQL’de WHERE NOT EQUAL operatörünün nasıl kullanılacağını, gerçek dünya senaryolarıyla adım adım öğreneceğiz. Başlangıç seviyesinden ileri seviyeye kadar, performans optimizasyonuna kadar geniş bir yelpazede konuyu ele alacağız.
Öğrenme Yol Haritası:
* Yeni Başlayan: Temel != ve <> operatörleri, basit örnekler.
* Orta Seviye: Karmaşık koşullar, NOT IN, NOT EXISTS kullanım örnekleri, performans ipuçları.
* İleri Seviye: Performans analizi, indeksleme stratejileri, edge case’ler ve NULL değerlerinin ele alınması.
PostgreSQL’de Eşit Olmayan Koşullar: Temel Kavramlar
PostgreSQL’de bir sütunun belirli bir değere eşit *olmadığını* kontrol etmek için iki operatör kullanabilirsiniz: != ve <>. Her iki operatör de aynı işlevi görür ve birbirlerinin yerine kullanılabilirler. Bu operatörler, WHERE cümleciği içinde kullanılır. Örneğin, “müşteri_adı” sütununda “Ahmet” olmayan tüm müşterileri seçmek için şu sorguyu kullanabilirsiniz:
SELECT *
FROM musteriler
WHERE musteri_adı != 'Ahmet';
SELECT *
FROM musteriler
WHERE musteri_adı <> 'Ahmet';
Bu sorgular, “musteriler” tablosundaki tüm satırları getirir, ancak “musteri_adı” sütunu “Ahmet” olan satırlar hariçtir. Bu temel kavram, daha karmaşık sorguların yapı taşını oluşturur. != veya <> operatörlerini sayısal, metinsel veya tarih verileriyle kullanabilirsiniz.
PostgreSQL’de WHERE NOT EQUAL: Uygulamalı Kılavuz (Yeni Başlayanlar İçin)
Şimdi, basit bir örnek üzerinden adım adım ilerleyelim. Bir “urunler” tablomuz olsun ve bu tabloda “urun_adi”, “fiyat” ve “kategori” sütunları bulunsun. Fiyatı 100 TL’den fazla olmayan ürünleri listelemek istediğimizi varsayalım:
Adım 1: Veritabanına bağlanın ve “urunler” tablosunu oluşturun (eğer yoksa):
CREATE TABLE urunler (
urun_adi VARCHAR(255),
fiyat NUMERIC,
kategori VARCHAR(255)
);
Adım 2: Tabloya bazı veriler ekleyin:
INSERT INTO urunler (urun_adi, fiyat, kategori) VALUES
('Klavye', 150, 'Bilgisayar'),
('Fare', 75, 'Bilgisayar'),
('Monitör', 500, 'Bilgisayar'),
('Kitap', 30, 'Kitap'),
('Kalem', 10, 'Kırtasiye');
Adım 3: Fiyatı 100 TL’den fazla *olmayan* ürünleri seçmek için aşağıdaki sorguyu kullanın:
SELECT *
FROM urunler
WHERE fiyat <= 100;
Bu sorgu, <= (küçük veya eşittir) operatörünü kullanır, ancak != veya <> operatörlerini kullanarak da aynı sonucu elde edebiliriz. Örneğin, fiyatı 101 TL veya daha fazla olan ürünleri *hariç tutmak* için şu sorguyu kullanabiliriz:
SELECT *
FROM urunler
WHERE fiyat != 101 AND fiyat != 102 AND fiyat != 103 ... -- Bu yöntem pratik değildir!
Bu yöntem oldukça verimsizdir. Daha pratik ve doğru yöntem <= 100 koşulunu kullanmaktır.
Karmaşık Koşullar ve NOT IN Operatörü (Orta Seviye)
Veritabanınızda daha karmaşık koşullar oluşturmanız gerekebilir. Örneğin, belirli bir kategoriye ait *olmayan* ürünleri seçmek isteyebilirsiniz. Bunun için NOT IN operatörünü kullanabilirsiniz. "Bilgisayar" ve "Kırtasiye" kategorilerine ait *olmayan* ürünleri seçmek için şu sorguyu kullanabilirsiniz:
SELECT *
FROM urunler
WHERE kategori NOT IN ('Bilgisayar', 'Kırtasiye');
Bu sorgu, "kategori" sütununda "Bilgisayar" veya "Kırtasiye" değeri *bulunmayan* tüm satırları getirecektir. NOT IN operatörü, birden fazla değeri kontrol etmek için kullanışlıdır ve != operatöründen daha okunabilir ve daha verimlidir.
Gerçek Hayat Örneği: Ürün Stok Takibi
Bir e-ticaret sitesi için çalışan bir veritabanı yöneticisi olduğunuzu düşünün. Stokta az sayıda bulunan ürünleri tespit etmeniz gerekiyor. "urunler" tablosuna "stok_adedi" adında bir sütun ekleyelim ve bazı veriler ekleyelim:
ALTER TABLE urunler ADD COLUMN stok_adedi INTEGER;
UPDATE urunler SET stok_adedi = 5 WHERE urun_adi = 'Klavye';
UPDATE urunler SET stok_adedi = 20 WHERE urun_adi = 'Fare';
UPDATE urunler SET stok_adedi = 2 WHERE urun_adi = 'Monitör';
UPDATE urunler SET stok_adedi = 10 WHERE urun_adi = 'Kitap';
UPDATE urunler SET stok_adedi = 50 WHERE urun_adi = 'Kalem';
Stok adedi 5'ten az olan ürünleri bulmak için şu sorguyu kullanabilirsiniz:
SELECT *
FROM urunler
WHERE stok_adedi < 5;
Bu, stok takibi için WHERE NOT EQUAL mantığını nasıl kullanabileceğinize basit bir örnektir. Daha karmaşık stok yönetimi senaryolarında, birden çok koşulu birleştiren daha karmaşık sorgular kullanmanız gerekebilir.
Performans Optimizasyonu ve İndeksleme
Büyük veritabanlarında, WHERE cümleciğinde kullanılan koşulların performansı önemli ölçüde etkiler. Sıkça sorguladığınız sütunlara indeks eklemek, sorgu performansını artırabilir. Örneğin, "fiyat" sütununa bir indeks eklemek için şu komutu kullanabilirsiniz:
CREATE INDEX idx_fiyat ON urunler (fiyat);
İndeksler, veritabanının ilgili satırları daha hızlı bulmasına yardımcı olur. Ancak, her sütuna indeks eklemek her zaman en iyi çözüm değildir. Çok sayıda indeks, yazma işlemlerinin yavaşlamasına neden olabilir. İndeksleme stratejisi, veritabanınızın yapısına ve kullanım şekline bağlı olarak dikkatlice belirlenmelidir. [fatihsoysal.com](https://fatihsoysal.com) adresinden PostgreSQL performans optimizasyonu ile ilgili daha detaylı bilgi edinebilirsiniz.
NOT EXISTS Kullanımı (İleri Seviye)
NOT IN operatörünün bir alternatifi NOT EXISTS operatörüdür. NOT EXISTS, alt sorgu kullanarak daha karmaşık koşullar tanımlamanıza olanak tanır. Örneğin, "kategori" sütununda "Bilgisayar" değeri bulunan ürünler *hariç* tüm ürünleri seçmek için şu sorguyu kullanabilirsiniz:
SELECT *
FROM urunler u
WHERE NOT EXISTS (
SELECT 1
FROM urunler u2
WHERE u2.kategori = 'Bilgisayar' AND u2.urun_adi = u.urun_adi
);
Bu sorgu, "Bilgisayar" kategorisinde olmayan ürünleri seçer. NOT EXISTS, özellikle büyük veritabanlarında ve karmaşık koşullarda NOT IN'den daha verimli olabilir.
NULL Değerlerinin Ele Alınması (İleri Seviye)
!= ve <> operatörleri NULL değerleriyle çalışırken dikkatli olmak gerekir. NULL, bir değerin *yokluğunu* temsil eder ve diğer değerlerle karşılaştırılamaz. fiyat sütunu NULL olan ürünleri seçmek için IS NULL operatörünü kullanmanız gerekir:
SELECT *
FROM urunler
WHERE fiyat IS NULL;
fiyat sütunu NULL *olmayan* ürünleri seçmek için ise IS NOT NULL operatörünü kullanmalısınız:
SELECT *
FROM urunler
WHERE fiyat IS NOT NULL;
NULL değerlerini doğru şekilde ele almak, sorgularınızın doğruluğu için çok önemlidir.
Edge Case'ler ve Performans Analizi (İleri Seviye)
Karmaşık sorgularda, beklenmedik sonuçlar elde edebilirsiniz. Bu edge case'leri anlamak ve performans analizi yapmak için, PostgreSQL'in sağladığı araçları kullanmanız gerekir. EXPLAIN komutu, bir sorguyu çalıştırmadan önce nasıl yürütüleceğini gösterir ve performans sorunlarını tespit etmenize yardımcı olur. Ayrıca, PostgreSQL'in loglarını inceleyerek performans sorunlarını daha ayrıntılı olarak analiz edebilirsiniz.
Sonuç
Bu makalede, PostgreSQL'de WHERE NOT EQUAL koşullarını kullanmanın çeşitli yollarını ve performans optimizasyonunu ele aldık. !=, <>, NOT IN, ve NOT EXISTS operatörlerini, farklı senaryolarda nasıl kullanabileceğinizi ve NULL değerlerini nasıl ele alacağınızı öğrendiniz. Unutmayın ki, veritabanınızın yapısı ve kullanım şekline bağlı olarak en uygun yöntemi seçmek önemlidir. [fatihsoysal.com](https://fatihsoysal.com) adresinden daha fazla PostgreSQL eğitimi ve kaynak bulabilirsiniz.
Sıkça Sorulan Sorular:
1. != ve <> operatörleri arasında fark var mıdır? Hayır, her iki operatör de aynı işlevi görür.
2. NOT IN ve NOT EXISTS arasında performans farkı var mıdır? Genellikle NOT EXISTS, özellikle büyük veritabanlarında ve karmaşık koşullarda daha verimli olabilir.
3. NULL değerlerini nasıl ele alabilirim? IS NULL ve IS NOT NULL operatörlerini kullanmalısınız.
4. Sorgularımın performansını nasıl artırabilirim? İndeksleme, sorgu optimizasyonu ve veritabanı ayarlarını inceleyerek.
5. PostgreSQL'de daha fazla bilgi nereden bulabilirim? PostgreSQL resmi dokümantasyonu ve [fatihsoysal.com](https://fatihsoysal.com) gibi kaynaklar faydalı olabilir.
Yazar: Fatih Soysal
