MySQL’de LIKE ve REGEXP Kullanımları

Date12 / Temmuz / 2008 Author İsa Engiz    Category mysql     Tags Yorumlar9 Yorum Yapilmis.

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

- Bu blogda yer alan yazıları RSS ile takip edebilirsiniz. RSS aboneliği için tıklayın.

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

  • faruk 13 Temmuz 2008, 16:16

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

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

  • e-hadi 22 Temmuz 2008, 21:24

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

  • Kerem 29 Temmuz 2008, 22:08

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

  • İsa Engiz 30 Temmuz 2008, 10:28

    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.

  • Kerem 31 Temmuz 2008, 23:17

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

  • yedincisenol 01 Ekim 2008, 00:25

    Çok güzel ve değerli bi’paylaşım olmuş, çok teşekkürler.

  • mirc 09 Ocak 2009, 11:20

    tskler..

  • tolga 13 Şubat 2009, 12:08

    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.

  • taylan 05 Mart 2009, 22:34

    Bir süredir aradığım konuydu. Teşekkürler.

görüşünü belirt

Spam Protection by WP-SpamFree

Arama


E-Posta Aboneliği


RSS Aboneliği

En Çok Yorumlanan Yazılar

Etiketler

404 ajax apache arama butonu as astrofizik açık kaynak banner blogger blogger/blogspot Blogger / Blogspot blogspot case chmod css date dosya yükleme editör etiket etkinlik favicon featured form ftp galeri Genel gimp hata sayfası header htaccess htpasswd ilişkisel veritabanı index innodb javascript join JQuery kategori koodla linux mysql opacity php resim url

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

Sayfalar


Faydalı Bağlantılar