Takip et

SQL BETWEEN Operatörü: Aralık Sorgularının Güçlü Aracı

SQL BETWEEN Operatörü: Aralık Sorgularının Güçlü Aracı SQL BETWEEN operatörü, bir ifadenin belirli bir değer aralığında olup olmadı

SQL BETWEEN Operatörü: Aralık Sorgularının Güçlü Aracı

SQL BETWEEN operatörü, bir ifadenin belirli bir değer aralığında olup olmadığını kontrol etmek için kullanılan mantıksal bir operatördür. Bu operatör, karmaşık WHERE koşullarını daha okunabilir ve yönetilebilir hale getirerek sorgu yazımını basitleştirir. Özellikle sayısal değerler, metinler ve tarih/saat bilgileri gibi sıralanabilir veri tipleri için idealdir.

Bu rehberde, BETWEEN operatörünün temel kullanımını, MySQL özelinde tarih ve saat karşılaştırmalarındaki inceliklerini ve NOT BETWEEN ile aralık dışı sorgulamayı detaylıca inceleyeceğiz. Ayrıca, pratik ipuçları ve sıkça sorulan sorularla konuyu pekiştireceğiz.

BETWEEN Operatörünün Temelleri

BETWEEN operatörü, belirtilen iki değerin dahil olduğu bir aralık tanımlar. Yani, value1 ve value2 arasındaki tüm değerleri (bu iki değer de dahil olmak üzere) döndürür.

Sözdizimi (Syntax)

BETWEEN operatörünün genel sözdizimi şu şekildedir:

SELECT kolon1, kolon2, ...
FROM tablo_adi
WHERE kolon_adi BETWEEN deger1 AND deger2;

Burada:
* kolon_adi: Sorgulamak istediğiniz sütun.
* deger1: Aralık başlangıç değeri (dahil).
* deger2: Aralık bitiş değeri (dahil).

Örnek Veritabanı ve Tablo

Aşağıdaki urunler tablosunu ve örnek verileri kullanarak tüm örneklerimizi uygulayacağız:

CREATE TABLE urunler (
    id INT PRIMARY KEY AUTO_INCREMENT,
    ad VARCHAR(100) NOT NULL,
    fiyat DECIMAL(10, 2) NOT NULL,
    stok INT NOT NULL,
    eklenme_tarihi DATETIME NOT NULL
);

INSERT INTO urunler (ad, fiyat, stok, eklenme_tarihi) VALUES
('Laptop', 1200.00, 50, '2023-01-15 10:00:00'),
('Klavye', 75.50, 200, '2023-02-01 11:30:00'),
('Fare', 30.00, 300, '2023-02-01 11:45:00'),
('Monitör', 350.00, 80, '2023-03-10 09:00:00'),
('Webcam', 50.00, 150, '2023-03-10 09:15:00'),
('SSD Disk', 150.00, 100, '2023-04-05 14:00:00'),
('Harici Disk', 80.00, 120, '2023-04-05 14:30:00'),
('Kulaklık', 60.00, 180, '2023-05-01 16:00:00'),
('Yazıcı', 250.00, 40, '2023-05-01 16:15:00'),
('Router', 90.00, 70, '2023-06-01 10:00:00');

Sayısal Değerlerle Kullanım

BETWEEN operatörü sayısal aralıkları sorgulamak için oldukça kullanışlıdır.

Örnek: Fiyatı 50 ile 150 arasında (50 ve 150 dahil) olan ürünleri listeleyelim.

SELECT ad, fiyat
FROM urunler
WHERE fiyat BETWEEN 50.00 AND 150.00;

Sonuç:

ad           | fiyat
-------------|-------
Klavye       | 75.50
Webcam       | 50.00
SSD Disk     | 150.00
Harici Disk  | 80.00
Kulaklık     | 60.00
Router       | 90.00

Metin (String) Değerlerle Kullanım

BETWEEN operatörü metin değerleri için de kullanılabilir, ancak bu durumda alfabetik sıralamaya göre bir aralık belirlenir.

Örnek: Adı ‘C’ ile ‘M’ harfleri arasında başlayan ürünleri listeleyelim.

SELECT ad
FROM urunler
WHERE ad BETWEEN 'C' AND 'M';

Sonuç:

ad
--------
Klavye
Fare
Monitör
Kulaklık

Not: Metin karşılaştırmalarında veritabanının COLLATE (karşılaştırma) ayarları önemlidir. Büyük/küçük harf duyarlılığı bu ayarlara göre değişebilir.

MySQL BETWEEN Dates: Tarih ve Saat Karşılaştırmaları

BETWEEN operatörünün en yaygın ve bazen yanıltıcı kullanımı tarih ve saat değerleri üzerindedir. MySQL’de DATE, DATETIME ve TIMESTAMP gibi tarih/saat tipleriyle çalışırken dikkatli olmak gerekir, çünkü BETWEEN operatörü saat bileşenlerini de dikkate alır.

Temel Tarih Aralığı Sorgulama

Örnek: 2023 yılının Şubat ayı içerisinde eklenen ürünleri bulalım.

SELECT ad, eklenme_tarihi
FROM urunler
WHERE eklenme_tarihi BETWEEN '2023-02-01 00:00:00' AND '2023-02-28 23:59:59';

Sonuç:

ad      | eklenme_tarihi
--------|--------------------
Klavye  | 2023-02-01 11:30:00
Fare    | 2023-02-01 11:45:00

Bu örnekte, BETWEEN operatörünü tam DATETIME değerleri ile kullandık. 2023-02-01 00:00:00 tarihinin başlangıcından, 2023-02-28 23:59:59 tarihinin sonuna kadar olan tüm kayıtları getirir.

En Sık Yapılan Hata: Saat Bileşenini Göz Ardı Etmek

Eğer sadece tarih (örneğin YYYY-MM-DD) kullanarak bir aralık belirlerseniz, BETWEEN operatörü bitiş tarihinin sadece 00:00:00 saatini kabul edecektir. Bu durum, bitiş tarihinin günündeki tüm kayıtları kaçırmanıza neden olabilir.

Yanlış Kullanım Örneği: 2023 yılının Şubat ayı içerisinde eklenen ürünleri bulmak isterken…

SELECT ad, eklenme_tarihi
FROM urunler
WHERE eklenme_tarihi BETWEEN '2023-02-01' AND '2023-02-28';

Bu sorgu, eklenme_tarihi sütunundaki değerleri 2023-02-01 00:00:00 ile 2023-02-28 00:00:00 arasında arayacaktır. Dolayısıyla, 28 Şubat’a ait herhangi bir kayıt (saat bileşeni 00:00:00 olmadığı sürece) gelmeyecektir.

Doğru Tarih Aralıkları İçin Çözümler

1. Tam Saat Bileşenini Belirtmek: En güvenli yol, aralığın başlangıç ve bitiş tarihlerinin saat bileşenlerini açıkça belirtmektir. Bitiş tarihi için 23:59:59 kullanmak, o günün son saniyesine kadar olan tüm kayıtları dahil eder.

SELECT ad, eklenme_tarihi
    FROM urunler
    WHERE eklenme_tarihi BETWEEN '2023-02-01 00:00:00' AND '2023-02-28 23:59:59';

2. DATE() Fonksiyonunu Kullanmak: Eğer sadece tarih bileşeni üzerinden sorgulama yapmak istiyorsanız, DATE() fonksiyonunu kullanarak DATETIME sütununu DATE tipine dönüştürebilirsiniz. Bu, saat bileşenlerini tamamen göz ardı etmenizi sağlar.

Örnek: 2023 yılının Şubat ayı içerisinde eklenen ürünleri bulalım, saatten bağımsız.

SELECT ad, eklenme_tarihi
    FROM urunler
    WHERE DATE(eklenme_tarihi) BETWEEN '2023-02-01' AND '2023-02-28';

Bu yöntem, bitiş tarihinin tüm gününü doğru bir şekilde kapsayacaktır çünkü DATE() fonksiyonu saat bilgisini atar.

3. DATE_ADD() veya INTERVAL Kullanımı (Bitiş Tarihi + 1 Gün): Özellikle dinamik tarih aralıklarında, bitiş tarihinin bir sonraki gününün başlangıcına kadar olan kayıtları aramak daha esnek olabilir. Bu, BETWEEN yerine kolon >= baslangic_tarihi AND kolon < bitis_tarihi_arti_bir_gun şeklinde bir yapı gerektirir.

Örnek: 2023 yılının Şubat ayı içerisinde eklenen ürünleri bulalım.

SELECT ad, eklenme_tarihi
    FROM urunler
    WHERE eklenme_tarihi >= '2023-02-01 00:00:00' AND eklenme_tarihi < '2023-03-01 00:00:00';

Bu yaklaşım, BETWEEN operatörünün dahil edici yapısından kaynaklanan son saniye sorununu ortadan kaldırır ve genellikle dinamik sorgularda daha güvenlidir. DATE_ADD('2023-02-28', INTERVAL 1 DAY) kullanarak bitiş tarihini dinamik olarak bir sonraki güne ayarlayabilirsiniz.

SELECT ad, eklenme_tarihi
    FROM urunler
    WHERE eklenme_tarihi >= '2023-02-01 00:00:00'
      AND eklenme_tarihi < DATE_ADD('2023-02-28 00:00:00', INTERVAL 1 DAY);

NOT BETWEEN Operatörünün Kullanımı

NOT BETWEEN operatörü, BETWEEN operatörünün tam tersidir. Belirtilen aralığın dışındaki değerleri döndürür. Yani, deger1 ile deger2 arasında olmayan tüm kayıtları getirir (bu iki değer de dahil değildir).

Sözdizimi

SELECT kolon1, kolon2, ...
FROM tablo_adi
WHERE kolon_adi NOT BETWEEN deger1 AND deger2;

Örnekler

Örnek 1: Sayısal Değerlerle NOT BETWEEN
Fiyatı 50 ile 150 arasında olmayan ürünleri listeleyelim.

SELECT ad, fiyat
FROM urunler
WHERE fiyat NOT BETWEEN 50.00 AND 150.00;

Sonuç:

ad       | fiyat
---------|--------
Laptop   | 1200.00
Fare     | 30.00
Monitör  | 350.00
Yazıcı   | 250.00

Örnek 2: Tarih Değerleriyle NOT BETWEEN
2023 yılının Şubat ayı içerisinde eklenmeyen ürünleri listeleyelim.

SELECT ad, eklenme_tarihi
FROM urunler
WHERE eklenme_tarihi NOT BETWEEN '2023-02-01 00:00:00' AND '2023-02-28 23:59:59';

Sonuç:

ad           | eklenme_tarihi
-------------|--------------------
Laptop       | 2023-01-15 10:00:00
Monitör      | 2023-03-10 09:00:00
Webcam       | 2023-03-10 09:15:00
SSD Disk     | 2023-04-05 14:00:00
Harici Disk  | 2023-04-05 14:30:00
Kulaklık     | 2023-05-01 16:00:00
Yazıcı       | 2023-05-01 16:15:00
Router       | 2023-06-01 10:00:00

Pratik İpuçları ve Dikkat Edilmesi Gerekenler

Kapsayıcılık (Inclusive): BETWEEN operatörünün başlangıç ve bitiş değerlerini dahil ettiğini* unutmayın. Bu, özellikle tarih aralıklarında önemlidir.
* Veri Tipleri: BETWEEN operatörünü kullanırken, karşılaştırdığınız sütun ve değerlerin veri tiplerinin uyumlu olduğundan emin olun. MySQL genellikle otomatik dönüşümler yapar, ancak açıkça doğru veri tiplerini kullanmak daha iyi performans ve hata önleme sağlar. Örneğin, bir INT sütunu için '100' yerine 100 kullanın.
* NULL Değerler: BETWEEN operatörü NULL değerleri döndürmez. Bir sütunun değeri NULL ise, bu değer hiçbir aralıkta değildir ve sorgu sonuçlarına dahil edilmez. NULL değerleri de dahil etmek isterseniz, OR kolon_adi IS NULL koşulunu eklemeniz gerekir.
* Performans: BETWEEN operatörü, uygun şekilde indekslenmiş sütunlarda kullanıldığında genellikle iyi performans gösterir. kolon >= deger1 AND kolon <= deger2 ifadesiyle aynı şekilde optimize edilir ve genellikle aynı performans karakteristiklerine sahiptir.
* Alternatifler: BETWEEN yerine kolon >= deger1 AND kolon <= deger2 yapısı da kullanılabilir. Bu iki ifade fonksiyonel olarak aynıdır. Bazı geliştiriciler, özellikle tarih aralıklarında kolon >= baslangic_tarihi AND kolon < bir_sonraki_gun yapısını daha açık bulabilir.

Sonuç ve Sıkça Sorulan Sorular (SSS)

BETWEEN operatörü, SQL sorgularında belirli bir aralıktaki verileri filtrelemek için güçlü ve okunabilir bir araçtır. Sayısal, metin ve tarih/saat verileriyle kullanılabilen bu operatör, özellikle MySQL'de tarih sorgulamalarında saat bileşenleri nedeniyle özel dikkat gerektirir. NOT BETWEEN ise aralığın dışındaki verileri bulmak için kullanılır. Doğru kullanımıyla sorgularınızı daha etkili ve anlaşılır hale getirebilirsiniz.

Sıkça Sorulan Sorular (SSS)

S1: BETWEEN operatörü başlangıç ve bitiş değerlerini dahil eder mi?
C1: Evet, BETWEEN operatörü başlangıç ve bitiş değerlerini dahil edici (inclusive) bir şekilde değerlendirir.

S2: Tarih aralıklarında BETWEEN kullanırken neden dikkatli olmalıyım?
C2: Çünkü DATETIME veya TIMESTAMP sütunlarında BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' şeklinde kullanım, bitiş tarihinin sadece 00:00:00 saatini içerir. Bu da bitiş günündeki daha sonraki saatlere ait kayıtları kaçırmanıza neden olur. Çözüm olarak tam saat belirtmek (23:59:59), DATE() fonksiyonunu kullanmak veya kolon >= baslangic AND kolon < bitis_arti_bir_gun yapısını tercih etmek daha doğrudur.

S3: BETWEEN operatörü NULL değerleri döndürür mü?
C3: Hayır, BETWEEN operatörü NULL değerleri döndürmez. Bir değer NULL ise, herhangi bir aralıkta kabul edilmez.

S4: BETWEEN yerine > ve < operatörlerini kullanabilir miyim?
C4: Evet, kolon BETWEEN deger1 AND deger2 ifadesi fonksiyonel olarak kolon >= deger1 AND kolon <= deger2 ile aynıdır. Özellikle tarih sorgularında kolon >= baslangic_tarihi AND kolon < bitis_tarihi_arti_bir_gun yapısı daha güvenli olabilir.

S5: BETWEEN operatörü performanslı mıdır?
C5: Evet, uygun şekilde indekslenmiş sütunlarda kullanıldığında BETWEEN operatörü oldukça performanslıdır ve indeksleri verimli bir şekilde kullanabilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.