MySQL’de LIKE ve REGEXP Kullanımları
Veritabanının kullanımı genelde eldeki verilerin belli bir yerde tutulması, ihtiyaç duyulduğunuda ise belli koşullara göre çekilmesi şeklindedir. Bununla beraber ikinci sırayı ise arama cümlecikleri alır; belli bir kritere uyan verilerin veritabanından çekilmesi.

Bu ihtiyacı en güzel şekilde “LIKE” kelimesi karşılar. LIKE ve ardından gelen ‘%’ işareti ile kriterimizi belirtir ve verimizi çekeriz. Ancak ‘%’ işareti her zaman ihtiyacımızı karşılamayabilir, ama farklı koşullar için de farklı alternatifler bulunmaktadır.
Örnek tablomuz şu şekilde olsun:
‘musteriler’
| id | isim | soyisim | sehir | telefon |
| 1 | ahmet | mene | istanbul | 2222222 |
| 2 | ayşe | mendes | izmir | 2222223 |
| 3 | hakan | koçak | ankara | 2222224 |
| 4 | hasan | konduran | samsun | 2222225 |
| 5 | fatma | fatma | istanbul | 2222226 |
Sırasıyla gidelim isterseniz:
‘%’ işareti kullanımı
Genelde aşina olduğumuz yöntemdir:
SELECT * FROM musteriler WHERE isim LIKE 'ha%'
İsim sütununda ilk iki harfi ‘ha’ olan bütün kayıtları dönecektir; hasan ve hakan.
SELECT * FROM musteriler WHERE soyisim LIKE '%en%'
Soyisiminin içerisinde ‘en’ geçen satırları listeleyecektir; mene ve mendes.
‘_’ işareti kullanımı
Kullanımı % işaretine benzer ancak % işareti gibi karakter sayısını önemsemeden hareket etmez:
SELECT * FROM musteriler WHERE telefon LIKE '222222_'
Bu kod satırında öncelikle yaptğımız iş aslında dönecek sonuçlardaki karakter sayısını sınırlandırmak. Yani sonuçlar ya 6 karakterli olacak ya da 7. Eğer tablomuzda telefon numarası ‘22222245′ olan bir kayıt olsaydı, sonuç tablosunda yer almayacaktı, çünkü ‘_’ işareti yalnızca 1 karakter için geçerli, halbuki ‘%’ işaretinde ilk altı karakteri 2 olan bütün satırlar sonuç tablosunda yer alacaktı, Çünkü % işareti bir karakter sınırlaması koymaz.
SELECT * FROM musteriler WHERE isim LIKE 'ha_an'
5 karakterli, ilk iki harfi ha, son iki harfi an olan satırlar, yani hakan ve hasan.
SELECT * FROM musteriler WHERE isim LIKE '____'
Burada ise 4 tane alt çizgi var, 4 karakterli isimleri listeleyecek, yani ayşe.
NOT LIKE kullanımı
Not like kullanımı ise, adından da anlaşılacağı üzere, belirlediğimiz koşula uymayan satırları listelemek için kullanılır.
SELECT * FROM musteriler WHERE isim NOT LIKE 'ha%'
‘ha’ ile başlamayan satırlar, yani ahmet, ayşe ve fatma.
Derinlere dalmak: REGEXP
Daha detaylı arama durumları için MySQL REGEXP komutunu sunmakta. Bu komut ile yapabileceklerimiz oldukça derinlere gitmekte, burada işimize yarayacak bir kaç örnek vermek istiyorum.
Öncelikle REGEXP komutuna bir öernek verelim:
SELECT * FROM musteriler WHERE isim REGEXP '^h'
Görüldüğü üzere kullanımı LIKE gibi, ancak kendine has komutlar kabul etmekte, ve bu komutlar ile istediğiniz arama kriterlerini oluşturabilirsiniz. Bunlardan bir kaçı:
‘.’ ifadesi
Tek bir karakteri temsil eder.
‘^’ ifadesi
Başlangıç karakterini ifade eder. Yani, yukarıda da yazdığımız kod, baş harfi h olan satirları çekecek.
[ ] ifadesi
Belli bir aralığı ifade eder. [abcdef] dersek, içerisinde yalnızca bu karakterleri barındırn satırlar dönecektir. Ya da [a-z] dersek, içerisinde yalnızca harf olan satırlar dönecektir.
Aşağıdaki sql komutlarını inceleyelim:
SELECT * FROM musteriler WHERE isim REGEXP '^[abc]'
Bu komut, baş harfleri a ya da b ya da c olan isimleri geri döndürür.
SELECT * FROM musteriler WHERE isim REGEXP '[a-dx]'
Bu sorgu ise yalnızca abcdx harflerini içeren isimlri geri döndürür.
SELECT * FROM musteriler WHERE isim REGEXP '^.[a-k]'
Bu komut ise başlangıcı her hangi bir karakter olan ve sonrakileri a-k aralığında olan isimleri geri döndürür.
Sonuç
REGEXP ile yapılabilecekler aslında çok daha geniş, LIKE kelimesinin kısıtlayıcılığından kurtarıyor, MySQL’in çevrimiçi belgelerinde regexp’in kullanım imkanları tek tek listelenmekte. Umarım onların hepsini de bu blogda detaylı olarak tartışma şansı buluruz.
Bir sonraki MySQL yazısında görüşmek üzere!
Not: Daha detaylı bilgiler için:
– http://dev.mysql.com/doc/refman/5.0/en/regexp.html
- Ya da bu blogda yer alan bütün yazıları içindekiler sayfasında görüntüleyebilirsiniz. Tıklayın!
MySQL’de LIKE ve REGEXP Kullanımları yazısına 9 Yorum yapılmış.
görüşünü belirt
Arama
E-Posta Aboneliği
RSS Aboneliği
En Çok Yorumlanan Yazılar
- Blogger’da “devamını oku” bağlantısı (21)
- Ajax ile dinamik listeleme (21)
- MySQL’de Transaction ve PHP ile kullanımı (16)
- PHP ile sınırsız alt kategori mantığı (14)
- Kullanıcı dostu url hazırlamak (12)
- PHP’nin (muhtemelen) az bilinen 10 özelliği (12)
- Kullandığınız programlama dili ne kadar popüler? (12)
- MySQL’de “join” kullanımı (11)
- .htaccess konuları [Giriş] (11)
- Blogger’da arama kutusu ekleme (10)
Etiketler
Son Yorumlar
- isa engiz: Yazı için teşekkürler. sabit ip 2.75 tl. bu ücreti verip kendi web sunucumuzu kurabiliriz… En yakın...
- osman: Yazı için teşekkürler. Pardus projesinin Türkiye için çok önemli olduğunu düşünüyorum. Ancak yazıda da...
- Mustinet: siblings kullanarak da yazılabilir. Teşekkürler
- is: CSS kullanmadan sadece HTML kodlarıyla yanyana iki sütun (tablo kullanmadan) oluşturulabilir mi?
- Doğan Yılmaz: verdiğiniz bilgiler için çok ama çok teşekkür ederim. artık sıkı bir takipçiniz olmaya karar verdim
12 / Temmuz / 2008
Güzel bir yazı olmuş, teşekkürler.
Daha sık yazmanız dileğiyle
gercekten cok guzel olmuşşşş bu bana yaptıgım videolar sayfamın benzer videolar sayfasını hatırlattı orda bı suru like ‘% sorgusu kullandıgımı hatırlattı sımdı bunları denedım onca koddan benı kurtardı dıyebılırım.. bence like yerıne regexp kullanımı daha iyi sonuc verir..
Şöyle bir senaryo olsaydı kod nasıl olurdu.
Genel mantık zaten aynı bir sayfadan gelen komutla veritabanındaki herhangi bir sutunun içinden bilgileri listeletmek isteseydik SQL komutu nasıl olurdu.
Saygılar…
Merhaba Kerem,
Sadece bir sütunun içinde arama yapmak istiyorsak, SELECT * FROM … burada yıldız yerine ilgili sütunun ismini (veya isimlerini) yazarız;
SELECT soyisim FROM musteriler WHERE isim REGEXP ‘^[abc]‘
bu komut yalnızca soyisim sütunun geri döndürecektir.
Cevabın için teşekkür ederim
Çok güzel ve değerli bi’paylaşım olmuş, çok teşekkürler.
tskler..
peki “ha” ile başlayıp yanında yanlızca “s” olan bilgilere bak ve soyismini çağır dendiğide nasıl bir komut kullanılıyor.
yani “has” değil “ha” ve hemen ardındaki “s” olan
alacağım sonuç “konduran” olucak yani bu tablodaki örneğe göre.
(benim 1.tablomda “ha” vs.. olan kayıtlar var, bunları alıp 2. tablomda ha ile başlayan ama yanında karakter olan bilgiler var onları çağırmam gerekiyoda başaramadım.
kısaca “ha”nın yanına karakter ekleyip çağırtmak istiyorum. biraz karışık galiba uzman lazım .)teşekkürler.
Bir süredir aradığım konuydu. Teşekkürler.