ile

Temel SQL serisi, SON SQL-5 Sayfalama ve Arama işlemleri

Bir sürü şeyi hallettik. Veri ekleme, düzenleme, güncelleme ve silme. Bir de birleştirme. Geriye ne kaldı? Görelim bakalım..

  1. Tüm yazıların başlıklarının olduğu bir liste göstermek.
  2. Kategori eklemek, silmek, düzenlemek.
  3. Kategori içindeki yazıları göstermek
  4. Ayrıca yazı başlıklarını gösterirken, sayfalama yapmak, her sayfada 20 yazı göstermek, 2. sayfada bir sonraki 20 yazıyı yani 20 ile 40 arası yazıları göstermek
  5. Arama yapmak

Başlık listesi görüntülememek de çok kolay.

SELECT title FROM posts;

Bu komutu yazdığımız zaman Girdilerden sadece başlıkların olduğu listeyi çekebiliyoruz. 2. maddedeki ekleme, silme, düzenleme işlemlerinden zaten bahsetmiştik. Kategori içindeki yazıları da verileri birleştirerek alıyoruz. Bunu da bir önceki yazıda hallettik.

Sayfalama

Sayfalama dediğimiz olay, örneğin 1 milyon makale olan bir internet sitesinde, hiçbir kısıtlama olmadan “SELECT * FROM posts” dersek, hem kullanıcı bir milyon makalenin inmesini bekler, hem de bu veriyi çeken yazılım da belirli bir süre sonra timeout olur, yani sonsuza dek sistemin bu işleme kilitlenmesini engellemek için konulan zaman ve bellek sınırına ulaşacağı için veri çekme işlemi yarım kalır. Bu nedenle basit bir mantıkla, ne kadar veri çekeceğimizi LIMIT ifadesiyle sisteme söyleyeceğiz.

SELECT * FROM `posts` ORDER BY 'created' DESC LIMIT 0,20;

Komutumuzu inceleyelim:

  1. SELECT: Seç ifadesiyle * diyerek tüm alanları istediğimizi ve FROM posts diyerek girdiler tablosundan tüm verileri çekiyoruz
  2. ORDER BY ifadesiyle ‘created’ yani, oluşturma tarihine göre veriyi sıralamak istediğimizi yazdık.
  3. DESC ifadesiyle Descending yani azalarak en yeniden en eskiye göre verilerin çekilmesini istediğimizi belirttik, Ascending ASC yani artarak deseydiki, ilk gelen veri en eski veri olacaktı.
  4. LIMIT 0,20 diyerek gelen verilerin ilk 20 adedini istediğimizi söyledik.
  5. 2. Sayfaya gitmek isteseydik, LIMIT, 20, 40 dememiz gerekiyordu. Bu şekilde 100 kaydımız varsa, her sayfada 20 adet veri çekerek, tek sayfada 100 girdi göstermek yerine, 5 adet sayfada 20’şer girdi gösterdik ki, kullanıcıların internet kotalarını doldurmayalım ve verinin yüklenmesini beklerken sıkılıp sistemimizden çıkmasınlar.

Arama

Ekran Resmi 2014-08-18 15.15.54

Sitelerde genelde gördüğümüz arama formları nasıl yapılıyor? Örneğin, başlıklar içinde, veya yazıda geçen bir kelimeyi nasıl ararız? Bunun bi kolay yöntemi var bir de daha profesyonel yöntemi. Biz kolay yönteminden başlayacağız.

SELECT title FROM categories WHERE title LIKE '%php%';

Kodu her zaman yaptığımız gibi, phpMyAdmin’in veritabanı seçtikten sonra gelen SQL menüsüne yapıştırıp, GO diyerek çalıştıralım.

Ekran Resmi 2014-08-18 15.23.32

Ekran Resmi 2014-08-18 15.23.37

Kodu her zaman yaptığımız gibi adım adım inceleyelim

  1. SELECT title FROM categories: Her zamanki veri çekme kodumuz, kategoriler tablosundan title yani başlık alanını çektik.
  2. WHERE title LIKE ‘%php%’; Koşul ifadelerini biliyoruz. Burada LIKE, gibi demek. Yani title=’php’ deseydik, değeri ‘php’ ye eşit olan veri satırını alacaktık. Ancak burada LIKE dediğimiz için ve % işaretini kullandığımız için, php’den farklı olan verileri de getirecek. Sadece LIKE ‘%php’ kullansaydık, sonunda php geçen tüm ifadeleri bulacaktı, ‘herkes için php’ gibi. Ancak ‘php hakkında herşey ifadesini bulamayacaktı.’
  3. sadece ‘php hakkında herşey’ örneğinde olduğu gibi ‘php’ ifadesiyle başlayan bütün verileri çekmek isteseydik, LIKE ‘php%’ kullanmamız gerekirdi.
  4. php ifadesinin başında ve sonunda ne olduğu önemli değil, içinde php geçen tüm ifadeleri aramak istediğimiz için komutumuzda LIKE ‘%php%’ ifadesini kullandık.

Son olarak like ile arama yavaş olduğundan ve verilerimiz çok uzun ise daha etkili bir yöntem olarak FULL-TEXT SEARCH, yani tam metin arama kullanabiliriz. Bunun için arama yapacağımız alanlara text index vermemiz gerekiyor.

ALTER TABLE categories ADD FULLTEXT( title );

Bu işlemi yaptıktan sonra arama işlemimizi şu şekilde yapmamız gerekir:

SELECT title FROM categories WHERE MATCH(title) AGAINST ('PHP')

Bu yöntem büyük verilerle çalışırken daha hızlı. Ancak veritabanımızı oluştururken myISAM tipinde oluşturmamız gerekiyor.

Bu yazı serisinde temel SQL ve mySQL bilgilerini öğrendik. Artık temel veritabanı bilgisine sahipsiniz. Her zaman yaptığımız gibi, kullanım klavuzu kafasında kafamızı zor şeylerle karıştırmadan bebek adımlarıyla önce mantığını anlatmaya çalıştık. Detaylara inmeyi projelerinizde sizlere bıraktım.

Daha ileri konuları araştırmak isterseniz:

  1. Veritabanı fonksiyonları, SUM(), COUNT(), CONCATENATE() gibi.
  2. VIEW yaratarak kullanıcıların veritabanını bozmasını engellemek.
  3. Stored procedure, yani kayıtlı fonksiyon üretme, TRIGGER oluşturma, oracle’da PL/SQL diline benzer
  4. Veritabanı motorları, InnoDB ve MyISAM arasındaki farklar
  5. Uzaktaki anahtarlar, FOREIGN KEY, CASCADE  ON UPDATE, CASCADE ON DELETE gibi işlemler
  6. Veritabanı performansını artırma, sorgu iyileştirme
  7. Veritabanına farklı kaynaklardan veri çekme, .CSV veya MsSQL gibi
  8. SQLite gibi basit, PostgreSQL gibi ileri düzey veritabanları
  9. Doküman tabanlı NoSQL veritabanları

Bunlar gibi ileri düzey konuları, sistemlerinizde ihtiyaç duydukça araştırıp kullanacaksınız.

Şimdilik bu kadar. Hep meraklı olun, meraklı kalın.

Kaynaklar:

  1. http://php.net/manual/tr/intro-whatis.php
  2. http://www.cemdemir.net/jquery/jquery-nedir-nasil-kullanilir-nasil-ogrenilir-465.html
  3. http://stackoverflow.com/questions/759580/how-to-implement-a-keyword-search-in-mysql
  4. http://devzone.zend.com/26/using-mysql-full-text-searching/
  5. http://dev.mysql.com/doc/refman/5.0/en/faqs-stored-procs.html
  6. http://www.bakale.com/mysql/myfultext.htm BUNA DIKKAT

Yorumla

Yorum

  1. Emeğinize sağlık, ben de bu script yapma işlerini yeni öğrenen biri olarak sitenizi ilgiyle takip ediyorum. Eğer mümkünse MySQL komutları ile 1-1, 1-sonsuz, sonsuz-sonsuz ilişkilerin nasıl yapıldığını gösteren bir yazı hazırlayabilirseniz çok memnun olurum, yapmazsanız da canınız sağolsun, teşekkürler…