LIKE Nasıl Kullanılır? Joker Karakterlerle Esnek Metin Arama
Beceri rehberi

LIKE Nasıl Kullanılır? Joker Karakterlerle Esnek Metin Arama

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

LIKE ile yüzde ve alt çizgi joker karakterlerini kullanarak metin aramayı, büyük küçük harf, Türkçe karakter ve performans tuzaklarıyla birlikte öğrenin.

LIKE ne işe yarar?

LIKE, bir metin sütununu tam eşitlik yerine kalıba göre aramak için kullanılan SQL operatörüdür. Eşittir işareti yalnızca birebir aynı değeri bulur; LIKE ise aranan değerin bir kısmını bildiğiniz durumlarda işe yarar: adı belirli bir harfle başlayanlar, e-postası belirli bir alan adıyla bitenler, açıklamasında belirli bir kelime geçenler gibi.

Kullanım WHERE satırında olur: WHERE ad LIKE 'Ay%' ifadesi, adı Ay ile başlayan tüm kayıtları getirir. Kalıp, tek tırnak içindeki bir metindir ve içinde sıradan karakterlerle birlikte özel anlamı olan joker karakterler bulunabilir. Tersi için NOT LIKE kullanılır; kalıba uymayan kayıtları verir.

LIKE yalnızca metin sütunlarında anlamlıdır. Tarih ya da sayı sütunlarında kullanmak yerine, değerin uygun bir aralık koşuluyla filtrelenmesi daha doğrudur. Sayısal kodların başını aramak gerekiyorsa kodlar zaten metin olarak saklanıyor olmalıdır.

Joker karakterler: yüzde ve alt çizgi

Standart SQL'de başlıca joker karakterler şunlardır. Yüzde işareti (%) sıfır ya da daha fazla karakterin yerini tutar, alt çizgi (_) tam olarak tek bir karakterin yerini tutar. Bunlar birlikte kullanılarak kalıp inşa edilir.

Temel kalıplar şunlardır: • 'A%': A ile başlayan değerler. • '%com': com ile biten değerler. • '%kredi%': içinde kredi geçen değerler. • 'A_a': A ile başlayıp a ile biten, aralarında tek karakter olan kısa değerler. • '_a%': ilk karakterden hemen sonra a gelen değerler.

Bazı sistemlerde ek joker kalıpları da vardır. SQL Server'da köşeli parantez karakter kümesi tanımlar: [abc] ifadesi a, b ya da c harflerinden birini, [a-f] bir aralığı, [^abc] ise bunların dışındaki karakteri eşler. PostgreSQL ve MySQL gibi sistemlerde bu tür gelişmiş kalıplar için düzenli ifade operatörleri (REGEXP, SIMILAR TO ya da ~) kullanılır. Hangi sözdiziminin sisteminizde geçerli olduğunu dokümantasyondan doğrulayın.

Joker karakterin kendisini aramak: ESCAPE

Aranan metnin içinde gerçekten yüzde ya da alt çizgi karakteri geçiyorsa, bunların joker olarak yorumlanmasını engellemek gerekir. Örneğin ürün adında indirim oranı yazan, yüzde işareti taşıyan kayıtları aramak istiyorsunuz. Bunun için bir kaçış karakteri seçilir ve ESCAPE ifadesiyle bildirilir: WHERE ad LIKE '%\%%' ESCAPE '\' gibi. Kaçış karakterinden hemen sonra gelen yüzde ya da alt çizgi sıradan karakter sayılır.

Kaçış karakteri bazı sistemlerde varsayılan olarak tanımlıdır, bazılarında açıkça belirtmek gerekir. Alt çizgi içeren kodlarda, örneğin ürün kodları, bu sorun daha sık yaşanır: product_code LIKE 'AB_C' beklediğinizden fazla satır getirebilir; çünkü alt çizgi herhangi bir karakteri eşler.

Kullanıcıdan gelen arama metnini LIKE kalıbına eklerken de dikkatli olun. Kullanıcı yüzde işareti girerse tüm kayıtları eşleyen bir kalıp oluşur. Giriş değerinden joker karakterleri temizlemek ya da kaçışlamak, hem sonuçların doğruluğu hem güvenlik açısından iyi bir pratiktir; ayrıca parametreli sorgu kullanımı şarttır.

Büyük küçük harf ve Türkçe karakter tuzakları

LIKE'ın harf duyarlılığı sisteme ve sütunun harmanlama (collation) ayarına bağlıdır. SQL Server'da varsayılan harmanlamalar genellikle büyük küçük harfe duyarsızdır. MySQL'de de çoğu varsayılan harmanlama duyarsızdır. PostgreSQL'de ise LIKE büyük küçük harfe duyarlıdır; duyarsız arama için ILIKE operatörü ya da sütunu LOWER ile küçültüp kalıbı da küçük yazmak gerekir.

Türkçede ek bir tuzak vardır: noktalı ve noktasız i harfleri (İ, I, i, ı). Harmanlama Türkçe kurallarını uygulamıyorsa 'ISPARTA' ile 'Isparta' ve 'ıspartA' beklediğiniz gibi eşleşmeyebilir. LOWER ve UPPER fonksiyonlarının Türkçe harfleri doğru çevirip çevirmediği de sisteme ve yerel ayara göre değişir. Türkçe metin üzerinde arama yapan bir sorgunun beklenmedik biçimde eksik sonuç döndürmesinin yaygın nedeni budur.

Bu yüzden Türkçe verilerle çalışırken harmanlamayı bilmek ve test verisinde İ ile ı içeren örneklerle denemek gerekir. Gerekirse sorguda COLLATE ifadesiyle harmanlama belirtilebilir.

Performans: baştaki % indeksi devre dışı bırakır

LIKE sorgularının hızı, kalıbın nasıl yazıldığına bağlıdır. 'Ay%' gibi sabit bir başlangıçla kurulan kalıplar, sütunda indeks varsa çoğunlukla indeksten yararlanabilir; çünkü sistem alfabetik sırada o başlangıcı doğrudan bulur. Buna karşılık '%ay' ya da '%ay%' gibi başında joker olan kalıplarda sistem değerin nerede geçtiğini bilemez ve tablodaki tüm satırları taramak zorunda kalır. Büyük tablolarda bu yavaşlığın en yaygın kaynağıdır.

Başta joker gerektiğinde alternatifler vardır: tam metin arama (full-text search) özellikleri, PostgreSQL'de trigram indeksleri, ters çevrilmiş metin için ayrı bir sütun ya da arama motoru kullanımı. Bunların kurulumu sisteme göre değişir.

Diğer bir pratik de önceden filtrelemektir. Metin aramasından önce tarih ya da kategori gibi indeksli sütunlarla satır sayısını daraltırsanız LIKE daha az satır üzerinde çalışır. Fonksiyon uygulanan sütunlarda (LOWER(ad) LIKE gibi) normal indeks genellikle kullanılmaz; bu durumda fonksiyon temelli indeks ya da duyarsız harmanlama düşünülmelidir.

Örnek senaryolar ve sık yapılan hatalar

Örneğin müşteri listesinde yalnızca kurumsal e-posta adreslerini ayırmak istiyorsunuz: e-posta LIKE '%@company.com' ile belirli bir alan adıyla bitenleri alırsınız. Ürün kodlarında belirli bir kategoriyi ayırmak için kod LIKE 'KB-%' yeterlidir. Birden fazla kelimeyi aramak için kalıpları OR ile birleştirir, hiçbirini içermeyenleri bulmak için NOT LIKE ile AND kullanırsınız.

Yaygın hatalar: • Boşluk karakterlerini unutmak: sütun sonunda fazladan boşluk varsa 'Ankara' kalıbı bulamaz; TRIM ile temizlemek gerekebilir. • NOT LIKE ile NULL değerleri: NULL içeren satırlar NOT LIKE koşulunda da gelmez. Boş değerleri dahil etmek için IS NULL koşulunu ayrıca yazın. • Alt çizgiyi sıradan karakter sanmak. • Her aramayı başı % ile yazmak ve performans sorununu fark etmemek. • Büyük küçük harf duyarlılığını varsaymak; sistemi değiştirdiğinizde sorgu farklı sonuç verir. • Kalıp yerine tam eşitlik gereken yerde LIKE kullanmak; kod gibi tam değerlerde eşittir işareti daha hızlıdır.

Bu konu, SQL ile Veri Sorgulama (Temel) eğitiminin Filtreleme Teknikleri ve Temel Fonksiyonlar modülünün ve SQL ile Programlama Eğitiminin Sorgular modülünün kapsamındadır. Bu modüller, müşteri verisi arayan destek, satış ve raporlama ekipleri için uygundur.

İlgili Mindset programı

SQL ile Veri Sorgulama (Temel)

Sık sorulanlar

Sık sorulan sorular

LIKE büyük küçük harfe duyarlı mıdır?

Sisteme ve sütunun harmanlama ayarına bağlıdır. SQL Server ve MySQL varsayılan harmanlamalarında genellikle duyarsızdır, PostgreSQL'de duyarlıdır ve duyarsız arama için ILIKE ya da LOWER kullanılır. Türkçe karakterlerde ek farklar olabilir; sisteminizde küçük bir test yaparak doğrulayın.

LIKE ile içinde belirli kelime geçen kayıtları nasıl bulurum?

Kelimenin başına ve sonuna yüzde işareti koyarak yazarsınız: WHERE aciklama LIKE '%kelime%'. Bu kalıp sütunun herhangi bir yerinde geçen eşleşmeyi bulur. Büyük tablolarda yavaş çalışabilir; çok kullanılan aramalar için tam metin arama özelliklerine bakmak gerekir.

Yüzde işaretini metin olarak nasıl ararım?

Bir kaçış karakteri belirleyip ESCAPE ifadesiyle bildirirsiniz. Örneğin ters bölü seçilirse ters bölünün hemen ardından gelen yüzde işareti joker olarak değil sıradan karakter olarak okunur. Aynı yöntem alt çizgi için de geçerlidir.

LIKE ile düzenli ifade arasındaki fark nedir?

LIKE yalnızca yüzde ve alt çizgi gibi basit jokerlerle çalışır. Düzenli ifadeler (REGEXP gibi) karakter sınıfları, tekrar sayıları ve gruplar içeren çok daha ayrıntılı kalıplar kurmanızı sağlar, ancak sözdizimi sisteme göre değişir ve genellikle daha yavaştır.

NOT LIKE neden boş değerli satırları getirmiyor?

SQL'de NULL ile yapılan karşılaştırmalar bilinmeyen sonuç verir ve satır koşulu sağlamış sayılmaz. Bu yüzden NULL içeren satırlar hem LIKE hem NOT LIKE ile gelmez. Boş değerleri dahil etmek istiyorsanız koşula OR sütun IS NULL ifadesini ekleyin.

SQL LIKE Operatörü ve Joker Karakterlerle Metin Arama