SQL Sorgulama nedir?
SQL Sorgulama: Veri Dünyasının Anahtarı
Veriyle çalışıyorsan, SQL sorgulama senin için bir zorunluluk. Basitçe söylemek gerekirse, bir veritabanından istediğin bilgiyi çekmenin, düzenlemenin veya güncellemenin bir yolu. Bu, bir kütüphaneden belirli bir kitabı bulmak gibi; ama bu kütüphane milyonlarca kitap barındırıyor ve aradığın kelime veya cümlenin geçtiği sayfayı anında bulabiliyorsun.
Deneyimlerime göre, SQL'in gücünü kavramak için temel birkaç konuya odaklanmak en doğrusu. Bunlar veri çekme, veriyi filtreleme, veriyi gruplama ve veriyi sıralama.
- Veri Çekme (SELECT)
Her şey SELECT ile başlar. Bu komut, hangi sütunları (kolonları) görmek istediğini veritabanına söyler. Örneğin, tüm müşterilerinin adlarını ve soyadlarını görmek istiyorsan, şöyle bir sorgu yazarsın:
SELECT ad, soyad FROM musteriler;
Eğer tablodaki tüm bilgileri görmek istersen, yıldız (*) işaretini kullanabilirsin:
SELECT * FROM musteriler;
Pratik ipucu: Sadece ihtiyacın olan sütunları seçmek, sorgunun daha hızlı çalışmasını sağlar. Tüm tabloyu çekmek, özellikle büyük tablolarda performansı ciddi şekilde düşürebilir. Örneğin, 100.000 satırlık bir `siparisler` tablosunda sadece `siparis_id` ve `toplam_tutar` sütunlarını istiyorsan, `SELECT *` yerine `SELECT siparis_id, toplam_tutar FROM siparisler;` kullanmalısın.
- Veriyi Filtreleme (WHERE)
Veri denizinde boğulmamak için filtreleme şart. WHERE anahtar kelimesi, sorgunu belirli kriterlere göre daraltmanı sağlar. Örneğin, yalnızca İstanbul'da yaşayan müşterilerini görmek istiyorsan:
SELECT ad, soyad, sehir FROM musteriler WHERE sehir = 'İstanbul';
Birden fazla koşulu AND veya OR ile birleştirebilirsin. Örneğin, hem İstanbul'da yaşayan hem de sipariş toplamı 500 TL'den fazla olan müşterileri görmek için:
SELECT ad, soyad, sehir, siparis_toplam FROM musteriler WHERE sehir = 'İstanbul' AND siparis_toplam > 500;
Pratik ipucu: `WHERE` koşulunda kullanılan alanların (sütunların) indekslenmiş olması, sorgu hızını katbekat artırır. Eğer bir sütunu sık sık filtreliyorsan, veritabanı yöneticinden o sütuna indeks eklemesini isteyebilirsin. Bu, bir kitabın indeksine bakıp istediğin konuya doğrudan ulaşmak gibidir.
- Veriyi Gruplama ve Sıralama
Bazen veriyi özetlemek veya belirli bir düzene sokmak istersin. İşte burada GROUP BY ve ORDER BY devreye girer.
Gruplama (GROUP BY)
Her şehirdeki müşteri sayısını öğrenmek istediğini düşünelim. Bu durumda GROUP BY kullanırsın:
SELECT sehir, COUNT(*) AS musteri_sayisi FROM musteriler GROUP BY sehir;
Burada COUNT(*), her bir şehirdeki satır (müşteri) sayısını sayar. AS musteri_sayisi ise bu sayılan değere geçici bir isim verir.
Sıralama (ORDER BY)
Sorgu sonuçlarını belirli bir kritere göre artan (ASC) veya azalan (DESC) şekilde sıralamak için ORDER BY kullanılır. Örneğin, siparişleri toplam tutara göre en yüksekten düşüğe doğru sıralamak için:
SELECT siparis_id, musteri_id, toplam_tutar FROM siparisler ORDER BY toplam_tutar DESC;
Birden fazla alana göre de sıralama yapabilirsin. Örneğin, önce şehre göre (alfabetik), sonra da müşteri sayısına göre (azalan) sıralamak:
SELECT sehir, COUNT(*) AS musteri_sayisi FROM musteriler GROUP BY sehir ORDER BY sehir ASC, musteri_sayisi DESC;
Pratik ipucu: Gruplama yaparken `SELECT` listesinde kullandığın alanların çoğu `GROUP BY` içinde olmalı ya da bir toplama fonksiyonu (COUNT, SUM, AVG, MAX, MIN) ile kullanılmalı. Aksi halde hangi grubun hangi değerine ait olduğunu bilemezsin.
- İleri Seviye Filtreleme ve Koşullu İfade (HAVING, CASE)
Bazen filtrelemeyi gruplama işleminden sonra yapmak istersin. İşte burada HAVING gelir. Örneğin, müşteri sayısı 100'den fazla olan şehirleri listelemek için:
SELECT sehir, COUNT() AS musteri_sayisi FROM musteriler GROUP BY sehir HAVING COUNT() > 100;
CASE ifadesi ise, koşullu mantık yürütmeni sağlar. Bir duruma göre farklı değerler döndürmek için kullanışlıdır. Örneğin, sipariş toplamı 1000 TL'den fazlaysa "Yüksek Değerli", değilse "Normal Değerli" olarak etiketlemek için:
SELECT siparis_id, toplam_tutar, CASE
WHEN toplam_tutar > 1000 THEN 'Yüksek Değerli'
ELSE 'Normal Değerli'
END AS siparis_degeri
FROM siparisler;
Pratik ipucu: `HAVING` sadece `GROUP BY` ile birlikte kullanılırken, `WHERE` her sorguda kullanılabilir. `CASE` ile karmaşık mantıkları tek bir sorguda çözebilirsin, bu da veri işleme adımlarını azaltır.
SQL sorgulama, başlangıçta karmaşık görünse de, temel komutlara hakim olduğunda veriyle konuşmaya başlayacaksın. Bol pratikle bu dili daha akıcı konuşabilirsin.