Menu

SQLite WHERE: Koşullu Satır Filtreleme Rehberi

SQLite'ta WHERE ile satırları nasıl filtrelersiniz? Karşılaştırma operatörleri, AND/OR, LIKE, IN, BETWEEN ve herkesin takıldığı NULL tuzağı tek yazıda.

Bu sayfada çalıştırılabilir editörler var — düzenle, çalıştır ve sonucu anında gör.

WHERE ile Satırları Tek Tek Filtrelemek

WHERE olmadan yazılan bir SELECT, tablodaki tüm satırları geri döndürür. Çoğu zaman aslında istediğimiz bu değildir. İşte tam burada WHERE devreye giriyor: belirlediğiniz koşula uyan satırları süzmene yarar. SQLite tabloyu satır satır gezer, her satır için koşulu değerlendirir ve sadece koşulun doğru çıktığı satırları sonuçta tutar.

Üç satır dönüyor: Neuromancer, Hyperion ve The Martian. year > 1980 koşulu her satır için tek tek değerlendirildi ve yalnızca eşleşenler süzgeçten geçti.

Şöyle düşünebilirsiniz: WHERE, FROM ile seçtiğiniz sütunların arasında duran bir filtredir. Sonucu true olan her şey bu filtreden geçer.

Karşılaştırma Operatörleri

Temel operatörler tam da beklediğiniz gibi çalışır:

= eşitlik için, != veya <> "eşit değil" için, sıralama içinse <, <=, >, >= operatörlerini kullanırız. String karşılaştırmalarında da aynı operatörler geçerli — author = 'Asimov' tam olarak, karakter karakter eşleşir.

Bir noktaya dikkat: SQL'de string değerler için tek tırnak kullanılır. Çift tırnak ise tanımlayıcılar (sütun veya tablo adları) içindir. WHERE author = "Asimov" ifadesi SQLite'ta tarihsel sebeplerle çalışıyor olabilir, ama taşınabilir değil ve "string"iniz tesadüfen bir sütun adıyla aynıysa sessiz sedasız yanlış sonuç verebilir. Tek tırnakta kalın.

AND, OR ve Parantezler ile birden fazla koşul

Gerçek sorgularda genellikle koşulları birleştirirsiniz. AND her iki tarafın da doğru olmasını ister; OR ise en az birinin doğru olmasıyla yetinir:

İlk sorgu hem yeni hem de kısa kitapları filtreliyor. İkincisi ise iki yazardan birinin kitaplarını getiriyor.

AND ve OR'u birlikte kullanırken çoğu kişiyi yakan şey öncelik sırasıdır. AND, OR'a göre daha güçlü bağlanır, yani:

Herbert OR (Gibson AND year > 1980) şeklinde okunur — yani yıla bakılmaksızın tüm Herbert kitapları, ayrıca 1980 sonrası Gibson kitapları. Muhtemelen kastettiğiniz bu değildi. Niyetinizi parantezle belirtin:

Şüpheye düşerseniz parantez kullan. Sorgu optimize edicinin umurunda olmaz ama sorguyu sonradan okuyacak kişi sana teşekkür eder.

NULL bir değer gibi davranmaz

Bu, WHERE koşullarında herkesin en az bir kez düştüğü klasik tuzaktır. SQL'de NULL "bilinmiyor" anlamına gelir ve bilinmeyen şeyler karşılaştırılamaz. column = NULL ifadesi yanlış değildir — sonucu NULL'dur ve WHERE bunu "bu satırı atla" olarak yorumlar.

IS NULL ve IS NOT NULL, NULL değerini doğrudan test eden tek operatörlerdir. Bunu parmaklarınıza kazıyın — NULL ile yapılan diğer tüm karşılaştırmalar NULL döner ve satırları sessizce eler.

Aynı kural olumsuzlama için de geçerli. WHERE author != 'Asimov' ifadesi author IS NULL olan satırları geri döndür_mez_, çünkü NULL != 'Asimov' sonucu da NULL olur. NULL değerlerini de dahil etmek istiyorsanız, açıkça belirtmeniz gerekir: WHERE author != 'Asimov' OR author IS NULL.

IN ve BETWEEN: Her Gün Kullanacağınız Kısayollar

IN, bir değerin listede olup olmadığını kontrol eder. Art arda gelen OR zincirlerini yazmanın çok daha temiz bir yoludur:

BETWEEN, her iki ucu da dahil olacak şekilde bir aralığı kontrol eder:

year BETWEEN 1980 AND 2000 ifadesi, year >= 1980 AND year <= 2000 ile birebir aynı işi yapar — sadece daha kısa yazılışıdır. Aklınızda bulunsun: her iki uç değer de aralığa dahildir. Uçları hariç tutmak istiyorsanız karşılaştırmaları açıkça yazmanız gerekir.

IN ve NULL konusunda kısa bir uyarı: WHERE column NOT IN (1, 2, NULL) sorgusu hiçbir zaman satır döndürmez, çünkü NULL ile yapılan her karşılaştırmanın sonucu NULL olur. Listenizdeki NULL değerleri ayıklayın ya da bunları IS NULL ile ayrıca ele alın.

LIKE ile Desen Eşleştirme

LIKE, iki joker karakter kullanarak metin üzerinde desen eşleştirme yapar:

  • % herhangi bir karakter dizisini eşleştirir (boş dizi de dahil).
  • _ tam olarak bir karakteri eşleştirir.

SQLite'ta LIKE operatörü, ASCII harfler için varsayılan olarak büyük/küçük harf duyarsızdır — yani 'Dune' LIKE 'dune' ifadesi true döner. Postgres'ten geliyorsanız bu durum kafa karıştırıcı olabilir; çünkü orada LIKE büyük/küçük harfe duyarlıdır ve duyarsız sürüm için ayrı bir ILIKE operatörü vardır. (SQLite'ta ILIKE yoktur.)

Büyük/küçük harfe duyarlı eşleşme yapmanız gerekiyorsa iki seçeneğiniz var. İlki, global pragma'yı değiştirmek:

PRAGMA case_sensitive_like = ON;

Alternatif olarak GLOB kullanabilirsiniz; bu her zaman büyük/küçük harfe duyarlıdır ve Unix tarzı joker karakterler kullanır (herhangi bir karakter dizisi için *, tek karakter için ?):

GLOB 'd*' burada hiçbir kayıtla eşleşmez — büyük/küçük harf önemli.

Tarihlere göre filtreleme

SQLite tarihleri metin olarak saklar (genelde YYYY-MM-DD ya da tam ISO 8601 biçiminde). Bu sayede string karşılaştırmaları aynı zamanda tarih karşılaştırması olarak da çalışır — tabii ISO formatına sadık kaldığınız sürece:

'2024-06-01' < '2024-11-08' ifadesi hem metin olarak hem de tarih olarak doğru sonuç verdiği için bu sorgular beklediğiniz gibi çalışır. Ancak tarihlerinizi başka bir formatta ('15/01/2024', 'Jan 15 2024' gibi) saklarsanız, karşılaştırmalar sessiz sedasız yanlış sonuçlar üretir. Bu yüzden her zaman ISO 8601 kullanın — ileride kendinize teşekkür edeceksiniz.

Daha karmaşık tarih hesaplamaları için (yılı çıkarmak, "bugün" ile karşılaştırmak gibi), SQLite size date(), strftime() ve julianday() fonksiyonlarını sunuyor. Bunları tarih ve saat bölümünde detaylıca ele alacağız.

Hepsini Bir Arada Kullanmak

Bu öğrendiklerimizin birkaçını aynı anda kullanan bir sorgu:

Satır satır okuyun: yılı belli olan, aralıkta kalan, iki yazardan biri tarafından yazılmış veya yeterince uzun olan ve taslak olmayan kayıtları tutuyoruz. İşte WHERE koşulunun en iyi yaptığı şey tam olarak bu — küçük ve okunabilir koşulları bir araya getirip hassas filtreler kurmak.

Edinmeye değer iki alışkanlık:

  • Her koşulu ayrı bir satıra girintileyin. Uzun WHERE ifadeleri tek satıra sıkıştırıldığında okunmaz hale gelir.
  • Niyet açık değilse koşulun amacını yorum satırıyla belirtin. -- taslakları hariç tut ucuz bir sigortadır.

Sırada: Operatörler ve NULL Detaylı

WHERE koşulu aslında büyük ölçüde sütunlara uygulanan operatörlerden ibarettir ve NULL her operatörün davranışını sessiz sedasız değiştirir. Bir sonraki sayfada SQLite'ın operatör setine daha derinlemesine bakacağız — aritmetik işlemler, || ile string birleştirme, IS ailesi, üç değerli mantık — böylece sürprizler artık sürpriz olmaktan çıkacak.

Sıkça Sorulan Sorular

SQLite'ta WHERE koşulu nasıl çalışır?

WHERE, sorgudaki her satırı verdiğiniz koşula göre tek tek test eder. Koşul true dönen satırlar sonuca girer; false ya da NULL dönenler elenir. Yazım sırası FROM'dan hemen sonradır: SELECT ... FROM tablo WHERE koşul.

SQLite WHERE içinde birden fazla koşulu nasıl birleştiririm?

AND ve OR kullanırsınız. AND her iki tarafın da doğru olmasını ister; OR ise birinin doğru olması yeterli. Dikkat: AND operatörü OR'dan daha öncelikli çalışır, bu yüzden karışık koşullarda parantez kullanmak şart: WHERE (a OR b) AND c.

Neden WHERE sütun = NULL çalışmıyor?

Çünkü NULL "bilinmeyen" demektir. = veya != ile yapılan herhangi bir karşılaştırma true/false yerine NULL döner — ve sadece true dönen satırlar sonuca girer. Bunun için IS NULL ve IS NOT NULL kullanın; NULL değerini doğrudan test edebilen tek operatörler bunlardır.

SQLite'ta LIKE büyük/küçük harfe duyarlı mı?

Varsayılan olarak LIKE, ASCII karakterlerde büyük/küçük harf ayrımı yapmaz — yani 'Hello' LIKE 'hello' sonucu true'dur. Tam duyarlılık için PRAGMA case_sensitive_like = ON; çalıştırabilir ya da her zaman büyük/küçük harf duyarlı olan ve Unix tarzı joker karakterler (*, ?) kullanan GLOB'a geçebilirsiniz.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA