07 12 2008

MySQL’de LIKE ve REGEXP Kullanımları

Yazıyı Yazan: İsa Engiz. Zaman: 8:29 pm. Yazının Kategorisi: mysql

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



Sayfa İşlemleri

- Yazıyı arkadaşına gönder:

- Yazıları RSS ile takip et: Yazılar için RSS

- Sosyal İmleme: | |
linkiboluna ekle!


5 Yorum Yapılmış! to “MySQL’de LIKE ve REGEXP Kullanımları”

  1. farukon 13 07 2008 - 4:16 pm

    Güzel bir yazı olmuş, teşekkürler.

    Daha sık yazmanız dileğiyle :)

  2. e-hadion 22 07 2008 - 9:24 pm

    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..

  3. Keremon 29 07 2008 - 10:08 pm

    Şö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…

  4. İsa Engizon 30 07 2008 - 10:28 am

    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.

  5. Keremon 31 07 2008 - 11:17 pm

    Cevabın için teşekkür ederim

GeriBağlantı Adresi | Yorumlar için RSS

Bu yazı hakkında görüşünüzü belirtebilirsiniz.

Koodla | Blog'a Hoşgeldiniz!

Merhaba, Koodla | Blog'da PHP, Ajax, MySQL, Javascript ve benzer konularda yazılar bulabilirsiniz. Yazıları kategorilerine göre listeleyebilir, dilerseniz bütün yazıları İçindekiler sayfasında görebilirsiniz. Bilginin keyfini çıkarın!