18 Mart 2010 Perşembe

MySQL'de SELECT İşlemleri

Merhaba Webkolog ailesi! MySQL serimizde veritabanı oluşturma ve CRUD işlemlerinin genelini ele almıştık. Bugün ise CRUD'un en temel ve en sık kullanılan operasyonlarından biri olan READ (Okuma) işlemini, yani SELECT sorgularını derinlemesine inceleyeceğiz. Veritabanınızdaki zengin bilgi hazinesini ortaya çıkarmak için SELECT komutunu nasıl kullanacağınızı öğrenmek, web geliştirme yolculuğunuzda size büyük bir güç katacak!

SELECT Komutu Nedir ve Neden Hayatidir?

SELECT, bir veritabanından veri almak için kullanılan temel SQL komutudur. Web sitenizdeki kullanıcı listesinden, bir e-ticaret sitesindeki ürün kataloglarına, bir blogdaki makale içeriklerinden, yorumlara kadar gördüğünüz her dinamik bilgi, arka planda bir SELECT sorgusu ile veritabanından çekilir. SELECT komutunun esnekliği, ihtiyacınız olan spesifik veriyi binlerce kayıt arasından süzmenize olanak tanır.

SELECT komutunun genel yapısı şu şekildedir:


SELECT [sütunlar veya ifadeler]
FROM [tablo adları]
WHERE [koşullar]
GROUP BY [gruplama özellikleri]
ORDER BY [sıralama özellikleri]
LIMIT [seçim limiti]

Şimdi bu yapıya uygun olarak çeşitli SELECT kullanım senaryolarını inceleyelim.


Temel Veri Çekme

Bir tablodaki tüm verileri veya belirli sütunları çekmekle başlayabiliriz.


-- 'insanlar' tablosundaki tüm sütunları ve tüm kayıtları getir
SELECT * FROM insanlar;

-- 'tablo' adlı tablodan sadece 'isim' sütununu getir
SELECT isim FROM tablo;

Sıralama (ORDER BY)

Çektiğiniz verileri belirli bir sütuna göre sıralamak isteyebilirsiniz. ORDER BY komutu bu işe yarar.


-- 'tablo'dan verileri 'isim'e göre alfabetik (artan) sırada getir
SELECT * FROM tablo ORDER BY isim ASC; -- ASC varsayılan olduğu için yazmayabiliriz de

-- 'tablo'dan verileri 'isim'e göre tersten (azalan) sırada getir
SELECT * FROM tablo ORDER BY isim DESC;

-- Önce 'isim'e göre artan, sonra 'soyad'a göre azalan sırada sırala
SELECT * FROM tablo ORDER BY isim ASC, soyad DESC;

-- Tablodan rastgele 5 kayıt getir (performans gerektiren durumlarda dikkatli kullanılmalı)
SELECT * FROM tablo ORDER BY RAND() LIMIT 5;

-- 'isim'e göre artan sırada sırala, NULL değerleri sona koy
SELECT * FROM tablo ORDER BY isim ASC NULLS LAST;

Koşullu Sorgulama (WHERE)

Sadece belirli kriterlere uyan verileri çekmek için WHERE koşulunu kullanırız. Bu, SELECT komutunun en güçlü özelliklerinden biridir.


-- id'si 1 olan kaydı getir
SELECT * FROM tablo WHERE id = 1;

-- Soyadı 'Mantar' veya 'Candan' olan ve ismi 'Ali' olan kayıtları getir
SELECT * FROM tablo WHERE (soyad = 'Mantar' OR soyad = 'Candan') AND isim = 'Ali';
LIKE Operatörü ile Desen Eşleştirme

Metin tabanlı aramalarda belirli desenlere uyan kayıtları bulmak için LIKE operatörünü kullanırız:

  • % (yüzde işareti): Sıfır veya daha fazla karakteri temsil eder.
  • _ (alt çizgi): Tek bir karakteri temsil eder.

-- İsmi 'a' harfi içeren tüm kayıtları getir
SELECT * FROM tablo WHERE isim LIKE '%a%';

-- İsmi 'can' ile biten tüm kayıtları getir
SELECT * FROM tablo WHERE isim LIKE '%can';

-- İsmi 'Abdul' ile başlayan tüm kayıtları getir
SELECT * FROM tablo WHERE isim LIKE 'Abdul%';

-- İsmi 'Se' ile başlayıp ardından tek bir karakter ve 'can' ile bitenleri getir (örn: Sercan, Sevcan, Selcan)
SELECT * FROM tablo WHERE isim LIKE 'Se_can%';
İç İçe Sorgular (Subqueries)

Bir sorgunun sonucunu başka bir sorguda kullanmak için iç içe sorgular oluşturabiliriz.


-- Ortalamanın üzerinde maaş alan çalışanları listele
SELECT FirstName, Salary
FROM employees
WHERE Salary > (SELECT AVG(Salary) FROM employees)
ORDER BY Salary DESC;
Full Text Search

Büyük metin alanlarında kelime veya cümle aramaları yapmak için FULLTEXT indekslerinden yararlanabiliriz. Bunun için tablonuzun MyISAM motorunda olması ve ilgili sütunlara FULLTEXT indeksi eklemeniz gerekir.


SELECT * FROM tablo WHERE MATCH(baslik,icerik) AGAINST("Cümle içinde geçen kelimelerin baslik ve icerik alanlarında arar");

Bu özelliği kullanabilmek için:

  • Tablo tipi MyISAM olmalı.
  • FULLTEXT tipinde indeks yaratılmalı ve arama yapılacak sütunları (örn: baslik, icerik) içermeli.

Gruplama ve Toplama Fonksiyonları (GROUP BY & Aggregate Functions)

Verilerinizi belirli kriterlere göre gruplayabilir ve gruplanmış veriler üzerinde hesaplamalar yapabilirsiniz.


-- 'isim'e göre grupla ve her isimden kaç adet olduğunu say
SELECT isim, COUNT(id) FROM tablo GROUP BY isim;
Aggregate (Toplama) Fonksiyonları

Veri kümeleri üzerinde hesaplamalar yapmak için kullanılırlar:

  • AVG(): Ortalama değeri döndürür.
  • SELECT AVG(yas) FROM tablo;
  • MAX(): Maksimum değeri döndürür.
  • SELECT MAX(yas) FROM tablo;
  • MIN(): Minimum değeri döndürür.
  • SELECT MIN(yas) FROM tablo;
  • SUM(): Toplam değeri döndürür.
  • SELECT SUM(puan) FROM tablo;
  • COUNT(): Kayıt sayısını döndürür.
  • 
    SELECT COUNT(id) FROM tablo; -- Tüm id'lerin sayısını verir
    SELECT COUNT(DISTINCT user_id) AS countUsers FROM tablo; -- Farklı user_id'lerinin sayısını verir
        
  • DISTINCT: Tekrarlayan değerleri hariç tutarak farklı verileri döndürür.
  • SELECT DISTINCT isim FROM insanlar;

Metin İşleme Fonksiyonları

SELECT sorgularınızda metin tabanlı sütunlar üzerinde çeşitli işlemler yapabilirsiniz.

  • CONCAT(): Birden fazla sütunu veya metni birleştirir.
  • SELECT CONCAT(isim,' ',soyisim) AS tam_ad FROM tablo;
  • LOWER(): Metni küçük harfe çevirir.
  • SELECT LOWER(isim) FROM insanlar;
  • UPPER(): Metni büyük harfe çevirir.
  • SELECT UPPER(isim) FROM insanlar;
  • LENGTH(): Metin uzunluğunu verir.
  • TRIM(): Metnin başındaki ve sonundaki boşlukları siler.
  • SUBSTRING(metin, başlangıç, uzunluk): Metnin belirli bir kısmını alır.
  • LEFT(metin, uzunluk): Metnin solundan belirli sayıda karakter alır.
  • RIGHT(metin, uzunluk): Metnin sağından belirli sayıda karakter alır.
  • REVERSE(): Metni tersine çevirir.
  • REPLACE(metin, eski_değer, yeni_değer): Metindeki bir değeri başka bir değerle değiştirir.

Diğer Faydalı SELECT Özellikleri
Alias (AS)

Sütunlara veya tablolara geçici takma isimler (alias) verebilirsiniz. Bu, sorgularınızı daha okunur hale getirir.


SELECT isim AS ad FROM insanlar; -- 'isim' sütununu 'ad' olarak döndürür
JOIN İşlemleri

Birden fazla tabloyu birbirine bağlayarak ilişkili verileri çekmek için JOIN komutlarını kullanırız. Bu, ilişkisel veritabanlarının gücünü ortaya çıkaran en önemli özelliklerden biridir.

  • LEFT JOIN: Sol tablodaki tüm kayıtları ve sağ tablodan eşleşen kayıtları getirir. Eşleşme yoksa sağ tablonun sütunları NULL olur.
  • 
    SELECT t1.isim, t2.deger
    FROM tablo AS t1
    LEFT JOIN tablo2 AS t2 ON t1.id = t2.kid;
        
  • INNER JOIN: Yalnızca iki tabloda da eşleşen kayıtları getirir.
  • RIGHT JOIN: Sağ tablodaki tüm kayıtları ve sol tablodan eşleşen kayıtları getirir. Eşleşme yoksa sol tablonun sütunları NULL olur.

Birden fazla JOIN işlemi de yapabilirsiniz:


SELECT t1.isim, t2.deger
FROM tablo AS t1
LEFT JOIN tablo2 AS t2 ON t1.id = t2.kid
LEFT JOIN tablo3 AS t3 ON t1.sid = t3.sid;

Veya daha karmaşık yapılar:


SELECT t1.isim, t2.deger
FROM tablo AS t1
LEFT JOIN (tablo2 AS t2, tablo3 AS t3) ON t1.id = t2.kid AND t2.id = t3.kid;
LIMIT (Sorgu Sonucu Sınırlayıcısı)

Sorgunuzdan dönen kayıt sayısını sınırlamak için kullanılır ve her zaman sorgunun en sonuna yazılır.


-- İlk 5 kaydı getir
SELECT * FROM tablo LIMIT 5;

-- 2. kayıttan sonraki 5 kaydı getir (yani 3. kayıttan başlayarak 5 kayıt)
SELECT * FROM tablo LIMIT 2, 5;
CASE ve IF Kullanımı

SELECT sorgularınızda koşullu ifadeler kullanabilirsiniz.

  • CASE: Birden fazla koşulu kontrol etmek için kullanılır.
  • 
    SELECT alan1, alan2,
        CASE alan3
            WHEN 'deger1' THEN 'deger1a'
            WHEN 'deger2' THEN 'deger2b'
            ELSE 'diger'
        END AS yeni_alan
    FROM tablo;
        
  • IF(): Basit bir koşulu kontrol etmek için kullanılır.
  • 
    SELECT IF(500 < 1000, "YES", "NO") AS durum; -- 'YES' döndürür
        
Tarih ve Saat Fonksiyonları

Tarih ve saat verileriyle çalışırken kullanabileceğiniz birçok fonksiyon bulunur:


-- Tarihe gün ekleme
SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY); --> '2008-02-02'
SELECT ADDDATE('2008-01-02', INTERVAL 31 DAY); --> '2008-02-02'

-- Tarihi belirli bir formatta gösterme
SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); --> 'Sunday October 2009'
SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); --> '22:23:00'

Yaygın kullanılan format belirteçleri:

  • %Y: Dört haneli yıl (örn: 2023)
  • %y: İki haneli yıl (örn: 23)
  • %M: Tam ay adı (örn: January)
  • %m: Sayısal ay (01-12)
  • %d: Ayın günü (01-31)
  • %W: Haftanın tam günü adı (örn: Sunday)
  • %H: Saat (00-23)
  • %i: Dakika (00-59)
  • %s: Saniye (00-59)
  • %r: 12 saat formatında zaman (hh:mm:ss AM/PM)

Diğer faydalı tarih fonksiyonları:

  • CURRENT_DATE(): Mevcut tarihi döndürür.
  • CURRENT_TIME(): Mevcut saati döndürür.
  • NOW(): Mevcut tarih ve saati döndürür.
  • DAY(tarih), MONTH(tarih), YEAR(tarih): Tarihten gün, ay, yıl bilgisini çeker.
  • DATE_SUB(tarih, INTERVAL değer BİRİM): Tarihten belirli bir süre çıkarır.

İndeks Oluşturma ve Silme

Sorgularınızın performansını artırmak için indeksler oluşturabilirsiniz.


-- 'insanlar' tablosunda 'sutun1' ve 'sutun2' için bir indeks oluştur
CREATE INDEX index_adi ON insanlar (sutun1, sutun2);

-- Oluşturulan indeksi sil
DROP INDEX index_adi ON insanlar;

SELECT komutu, MySQL'de verilerinize erişim sağlamanız için sınırsız olanaklar sunar. Bu makalede ele aldığım temel ve ileri seviye kullanımlarla artık veritabanınızdan istediğiniz bilgiyi çekmek için güçlü araçlara sahipsiniz. Bol bol pratik yaparak bu yeteneklerinizi geliştirmeyi unutmayın!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder