SQL LIKE, WHERE içinde belirli bir metin desenine uyan kayıtları bulmak için kullanılır. Yüzde işareti (%) sıfır veya daha fazla karakteri, alt çizgi (_) ise tek bir karakteri temsil eder. Bu özellik, tam eşleşmenin ötesine geçen metin aramaları yapmanı sağlar.
Bir değerin tamamını karşılaştırmak için =, belirli bir başlangıç, bitiş veya içerik desenini aramak için LIKE kullanılır. Aramada joker karakter bulunmadığında iki operatör basit metinlerde benzer sonuç verebilir, ancak anlamları aynı değildir.
LIKE ile = arasındaki farkı WHERE içinde nasıl görürsün?
LIKE operatörü WHERE içinde bir metin desenini, = operatörü ise eşit bir değeri karşılaştırır. Joker karakter, desen içinde özel anlam taşıyan karakterdir; SQL LIKE için temel joker karakterler % ve _ işaretleridir.
Örnekleri aşağıdaki kitaplar tablosundaki veriler üzerinden inceleyelim:
| id | baslik | yazar |
|---|---|---|
| 1 | Simyacı | Paulo Coelho |
| 2 | Simyasal Bahçe | Ayşe Demir |
| 3 | Mavi Deniz | Zeynep Kaya |
| 4 | Deniz Feneri | Bora Yılmaz |
| 5 | Mavi | Ece Arslan |
| 6 | Koru | Can Öz |
SELECT id, baslik, yazar
FROM kitaplar
WHERE baslik LIKE 'Sim%';
SELECT id, baslik, yazar
FROM kitaplar
WHERE baslik = 'Simyacı';
İlk sorgu, başlığı Sim ile başlayan kitapları bulur:
| id | baslik | yazar |
|---|---|---|
| 1 | Simyacı | Paulo Coelho |
| 2 | Simyasal Bahçe | Ayşe Demir |
İkinci sorgu yalnızca değeri tam olarak Simyacı olan satırı getirir:
| id | baslik | yazar |
|---|---|---|
| 1 | Simyacı | Paulo Coelho |
Sonuçları büyük ve küçük harflerin karşılaştırılması ile metin sıralama kuralları da etkileyebilir. Bu davranış kullanılan veritabanına ve sütunun karşılaştırma ayarlarına göre değişebilir.
Yüzde ve alt çizgi jokerleri hangi metinleri eşleştirir?

% karakteri sıfır veya daha fazla karakterlik bir bölümü, _ karakteri ise tam olarak tek bir karakteri temsil eder. Desenin tamamı sütun değerine uygulandığı için aramanın başına veya sonuna eklenen joker karakter, eşleşmenin kapsamını değiştirir.
SELECT baslik FROM kitaplar WHERE baslik LIKE 'Sim%';
SELECT baslik FROM kitaplar WHERE baslik LIKE '%Deniz';
SELECT baslik FROM kitaplar WHERE baslik LIKE '%Deniz%';
SELECT baslik FROM kitaplar WHERE baslik LIKE '____';
LIKE 'Sim%' başlıkla başlayan aramadır ve Simyacı ile Simyasal Bahçe sonuçlarını verir.
| baslik |
|---|
| Simyacı |
| Simyasal Bahçe |
LIKE '%Deniz' metnin Deniz ile bitmesini, LIKE '%Deniz%' ise metnin herhangi bir yerinde Deniz bulunmasını arar.
| baslik |
|---|
| Mavi Deniz |
| baslik |
|---|
| Mavi Deniz |
| Deniz Feneri |
LIKE '____' tam olarak dört karakterlik metinleri eşleştirir. Dört alt çizginin her biri bir karakter istediği için boş metin veya üç karakterlik bir değer bu deseni karşılamaz.
| baslik |
|---|
| Mavi |
| Koru |
Desenin başında % bulunduğunda indeks kullanımı, motorun özelliklerine, sorgu planına ve yapılandırmaya bağlı olarak sınırlanabilir; kesin durumu sorgu planını inceleyerek kontrol etmek gerekir.
Kitaplar tablosunda üç LIKE araması nasıl yazılır?
Kitaplar tablosunda üç temel LIKE araması, metnin başlangıcını, herhangi bir bölümünü veya belirli karakter sayısını WHERE koşulunda tanımlayarak yazılır. Örnek tablo yapısı kitaplar(id, baslik, yazar) şeklindedir ve veriler arasında Simyacı, Simurg, Deniz Feneri, Mavi Deniz, Kıyıdaki Ses ve Rüzgâr kitapları bulunur.
Başlığı Sim ile başlayan kitapları bulma
“Adı Sim ile başlayan” ifadesinde arama baslik alanında yapılır. Sim% deseni, başlığın Sim ile başlamasını ve devamında sıfır veya daha fazla karakter bulunabilmesini sağlar.
SELECT id, baslik, yazar
FROM kitaplar
WHERE baslik LIKE 'Sim%';
Bu sorgu, verilen örnek veride aşağıdaki satırları döndürür:
| id | baslik | yazar |
|---|---|---|
| 1 | Simyacı | Paulo Coelho |
| 2 | Simurg | Derya |
Başlığında Deniz geçen kitapları bulma
Bir metnin başlık içinde herhangi bir konumda geçmesini istiyorsan yüzde işaretini iki tarafa da yazabilirsin. %Deniz% deseni, başlığın başında veya sonunda başka karakterler bulunmasına izin verir.
SELECT id, baslik, yazar
FROM kitaplar
WHERE baslik LIKE '%Deniz%';
| id | baslik | yazar |
|---|---|---|
| 3 | Deniz Feneri | Eren |
| 4 | Mavi Deniz | Suna |
Yazar adı dört karakter olan kayıtları bulma
Alt çizgi karakteri, tek bir karakterlik eşleşme arar. Bu nedenle dört alt çizgiden oluşan desen, yazar alanının dört karakterden oluşmasını bekler.
SELECT id, baslik, yazar
FROM kitaplar
WHERE yazar LIKE '____';
| id | baslik | yazar |
|---|---|---|
| 3 | Deniz Feneri | Eren |
| 4 | Mavi Deniz | Suna |
| 6 | Rüzgâr | Mert |
Paulo Coelho gibi boşluk içeren tam adlar bu basit dört karakterlik desene uymaz. Sonuçlar, verilen örnek veri ve bu verideki yazım biçimi için geçerlidir. Büyük ve küçük harf davranışı, kullanılan veritabanı ve ayarlara göre ayrıca değerlendirilmelidir.
NOT LIKE ve ESCAPE ne zaman kullanılır?

NOT LIKE, belirli bir desene uyan kayıtları dışlamak için kullanılır; ESCAPE ise yüzde ve alt çizgi gibi joker karakterleri gerçek karakter olarak aramanı sağlar.
Başlığında Deniz geçmeyen kitapları seçmek için şu sorgu kullanılabilir:
SELECT id, baslik, yazar
FROM kitaplar
WHERE baslik NOT LIKE '%Deniz%';
Verilen örnek veride bu sorgu 1, 2, 5 ve 6 numaralı kitapları seçer. baslik değeri NULL olan bir kayıt ise koşulu doğru kabul edilmez ve WHERE sonucu içinde yer almaz. Böyle kayıtları ayrıca ele almak gerekiyorsa IS NULL koşulu da düşünülmelidir.
Bir başlıkta gerçek yüzde işaretini aramak için yüzde işaretinden önce bir kaçış karakteri kullanılır. Aşağıdaki sorguda ! karakteri kaçış karakteri olarak seçilmiştir:
SELECT id, baslik, yazar
FROM kitaplar
WHERE baslik LIKE '%10!%%' ESCAPE '!';
Burada !% ifadesi gerçek yüzde işaretini, sorgunun sonundaki % ise devamında başka karakterler bulunabileceğini belirtir. Verilen örnek kitaplar tablosunda 10% içeren bir başlık bulunmadığı için bu sorgu satır döndürmez.
Gerçek bir alt çizgiyi aramak için benzer biçimde !_ yazılır:
SELECT id, baslik, yazar
FROM kitaplar
WHERE baslik LIKE '%!_%' ESCAPE '!';
ESCAPE '!' sözdizimi, bu kullanım amacıyla MySQL, PostgreSQL ve SQLite üzerinde aynı biçimde kullanılabilir. Bu nedenle seçtiğin kaçış karakterini sorguda açıkça belirtmek, farklı veritabanı motorlarında deseni daha anlaşılır kılar.
Kullanıcının arama metninde seçtiğin kaçış karakteri de bulunuyorsa onu da kaçırmalısın. Örneğin gerçek bir ünlem işaretini aramak için !! kullanılır; böylece ünlem, desenin kontrol karakteri olarak değil metnin parçası olarak değerlendirilir.
MySQL, PostgreSQL ve SQLite harf duyarlılığını nasıl ele alır?
MySQL, PostgreSQL ve SQLite, büyük ve küçük harfleri aynı kabul etme konusunda aynı davranışı göstermez. Harf duyarlılığı, bir karşılaştırmada büyük ve küçük harflerin eşit sayılıp sayılmadığını belirleyen davranıştır.
MySQL’de LIKE sonucunu karakter kümesi ve collation ayarı belirler. Büyük ve küçük harfe duyarsız bir collation kullanıldığında Deniz ile deniz aynı kabul edilebilir. utf8mb4_bin gibi ikili karşılaştırma kullanan bir collation ise harf biçimini ayırır. Türkçe i, İ ve ı karakterlerinin eşleştirilmesi de seçilen collation'a bağlıdır.
PostgreSQL’de LIKE büyük ve küçük harfleri ayırır. Büyük ve küçük harf ayrımını kaldırmak için PostgreSQL'e özgü ILIKE kullanılabilir, ancak bu karşılaştırmanın sonucu etkin yerel ayara göre değişebilir. Bu nedenle Türkçe karakterler için veritabanının yerel ayarı belirtilmeden tek bir sonuç tablosu hazırlamak doğru olmaz.
SQLite ise varsayılan olarak ASCII karakterlerde büyük ve küçük harfleri eşit değerlendirebilir. ASCII dışındaki karakterlerde aynı harf duyarsızlığı uygulanmaz. Bu yüzden İ ve ı gibi Türkçe karakterlerde SQLite sonucu, İngilizce ASCII harflerindeki sonuçtan farklı olabilir.
Davranışı karşılaştırmak için küçük bir test verisi kullanabilirsin:
CREATE TABLE arama_test (
id INTEGER,
deger TEXT
);
INSERT INTO arama_test (id, deger) VALUES
(1, 'Deniz'),
(2, 'deniz'),
(3, 'DENİZ'),
(4, 'denız');
SELECT id, deger
FROM arama_test
WHERE deger LIKE 'deniz'
ORDER BY id;
| Veritabanı | Ayar | LIKE 'deniz' için temel değerlendirme |
|---|---|---|
| MySQL | Collation'a bağlı | Deniz ve deniz eşleşebilir. Türkçe karakterlerin sonucu collation belirler. |
| PostgreSQL | LIKE |
Büyük ve küçük harf ayrılır; doğrudan deniz değeri eşleşir. |
| PostgreSQL | ILIKE |
Büyük ve küçük harf ayrımı azalır, Türkçe karakter sonucu etkin yerel ayara bağlıdır. |
| SQLite | Varsayılan LIKE |
Deniz ve deniz eşleşebilir; İ ve ı için aynı sonuç beklenmez. |
Veritabanı seçerken önce aramanın tam eşleşme mi yoksa esnek metin araması mı olduğunu belirle. Ardından büyük ve küçük harf ayrımının önemli olup olmadığını, Türkçe karakterlerin nasıl işleneceğini ve bu davranışın collation ya da yerel ayarlarla yönetilip yönetilemeyeceğini test et.
Kullanıcı aramasını LIKE ile nasıl güvenli kurarsın?
Kullanıcıdan gelen metni SQL cümlesine string birleştirmeyle eklemek yerine parametreli sorgu kullanmalısın. Parametreli sorguda SQL yapısı ayrı tutulur, kullanıcı girdisi ise veritabanına veri olarak bağlanır. Bu yöntem SQL enjeksiyonu riskini azaltır.
Güvensiz yaklaşımda kullanıcı metni doğrudan SQL metnine eklenir:
aranan = "deniz"
sql = "SELECT id, baslik, yazar FROM kitaplar " +
"WHERE baslik LIKE '%" + aranan + "%';"
Daha güvenli yaklaşımda sorgu ve parametre ayrı hazırlanır:
sql = "SELECT id, baslik, yazar FROM kitaplar WHERE baslik LIKE :pattern;"
parametreler = {
"pattern": "%deniz%"
}
Bu sorgu, başlığında deniz metni geçen kitapları döndürür. Örneğin tablo aşağıdaki kayıtları içeriyorsa sonuçta ilk ve üçüncü satır görünür:
| id | baslik | yazar |
|---|---|---|
| 1 | Deniz Feneri | Örnek Yazar |
| 3 | Deniz Kıyısında | Başka Yazar |
Sürücüye göre :pattern yerine ? veya farklı bir yer tutucu kullanılabilir. Kullanıcı girdisindeki % ve _ karakterlerinin joker olarak çalışmasını istemiyorsan bu karakterleri uygun bir kaçış karakteriyle dönüştürüp ardından parametre olarak bağlayabilirsin:
SELECT id, baslik, yazar
FROM kitaplar
WHERE baslik LIKE :pattern ESCAPE '!';
Bu örnekte kullanıcı metnindeki yüzde işareti !%, alt çizgi !_ biçimine çevrilir. Kaçış karakterinin kendisi olan ! karakteri de !! olarak dönüştürülmelidir.
- Arama türünü belirle.
- Başta, sonda veya metnin herhangi bir yerinde arama yapacağına göre deseni seç.
- Harf duyarlılığını kullandığın veritabanında test et.
- Gerçek joker karakter gerekmiyorsa
ESCAPEstratejisi kullan. - Kullanıcı girdisini SQL metnine eklemek yerine parametre olarak bağla.
Sık Sorulan Sorular
LIKE ile = arasındaki temel fark nedir?
= iki değerin eşitliğini karşılaştırır, LIKE ise % ve _ joker karakterleriyle desen araması yapabilir. Joker karakter içermeyen bir desen bazı veritabanlarında eşitlik benzeri sonuç verse de metin arama amacı açıkça belirtilmek isteniyorsa LIKE kullanılmalıdır.
LIKE '%ali%' araması neden 'Halil' gibi bir kaydı da bulabilir?
%ali% deseni, içinde art arda ali karakterleri bulunan herhangi bir metni eşleştirir. Halil içinde bu karakterler bulunduğu için kayıt sonuçlara dahil olabilir.
SQL LIKE içinde alt çizgi karakteri tam olarak neyi eşleştirir?
Alt çizgi karakteri _, bulunduğu konumda tam olarak bir karakteri eşleştirir. Örneğin 'a_c' deseni abc ve a1c ile eşleşebilir, ancak ac ile eşleşmez.
MySQL, PostgreSQL ve SQLite'ta LIKE büyük küçük harfleri aynı şekilde mi değerlendirir?
Hayır, üç veritabanı aynı davranışı kullanmaz. MySQL sonucu collation ayarına bağlar, PostgreSQL’de LIKE ve ILIKE ayrımı bulunur, SQLite ise varsayılan olarak özellikle ASCII karakterlerde harf duyarsız davranır.
Kullanıcıdan gelen metin LIKE sorgusuna nasıl güvenli biçimde eklenir?
Kullanıcı metni SQL cümlesiyle birleştirilmemeli, parametreli sorguda yer tutucuya bağlanmalıdır. Arama metninde gerçek joker karakter kullanılmayacaksa % ve _ karakterleri ayrıca kaçırılmalıdır.
LIKE kullanırken desenin anlamını, harf duyarlılığını ve kullanıcı girdisinin nasıl bağlandığını birlikte kontrol etmek, daha öngörülebilir ve güvenli metin aramaları yapmanı sağlar.