SQL'in ABC'si: SELECT, WHERE, GROUP BY
SQL ABCs
Bu derste neler öğreneceksin
- SELECT ile sütun seçer
- WHERE ile filtreler
- GROUP BY ile gruplar
SQL’in ABC’si: SELECT, WHERE, GROUP BY, ORDER BY
Veritabanı bir dosya dolabı değil. Ona sadece “şu kaydı getir” demezsin, soru sorarsın. SQL bu soruların dilidir. Bir veri mühendisi olarak SQL senin en çok kullandığın beceri — günde 50-100 sorgu yazmak normal. O yüzden temelleri şimdiden sağlam at.
Bugün dört temel cümle öğreneceğiz: SELECT, WHERE, GROUP BY, ORDER BY. Bunlar veri analizinin %80’idir.
SELECT: Neyi Görüyorum?
En basit sorgu: hepsini getir.
SELECT * FROM musteriler;
* “tüm sütunlar” demek. Ama production’da * kullanma. Neden? Çünkü yarın biri tabloya 50 sütun eklerse senin sorgun patlar ya da gereksiz veri çeker. Açıkça iste:
SELECT id, isim, icecek, fiyat FROM musteriler;
Sütunlara alias verebilirsin:
SELECT
isim AS musteri_adi,
fiyat AS birim_fiyat,
fiyat * 1.20 AS kdv_dahil
FROM musteriler;
Hesaplanmış sütunlar bu şekilde yazılır. fiyat * 1.20 KDV dahil fiyat verir.
WHERE: Filtrele
Veri azsa hepsini görmek sorun değil, ama milyon satır gelince filtrelemek zorunlu.
SELECT isim, icecek, fiyat
FROM musteriler
WHERE fiyat > 25.00;
Operatörler:
| Operatör | Anlam |
|---|---|
= | Eşit |
<> veya != | Eşit değil |
>, <, >=, <= | Karşılaştırma |
IN (...) | Liste içinde |
BETWEEN x AND y | Aralık |
LIKE '...' | Desen eşleşme |
IS NULL / IS NOT NULL | Boş kontrolü |
Örnek:
-- 25 ile 35 arası fiyat
SELECT * FROM musteriler WHERE fiyat BETWEEN 25 AND 35;
-- "Limonata" ile başlayan içecekler
SELECT * FROM musteriler WHERE icecek LIKE 'Limonata%';
-- Birkaç isimden biri
SELECT * FROM musteriler WHERE isim IN ('Ayşe', 'Mehmet');
Birden fazla koşul:
SELECT *
FROM musteriler
WHERE fiyat > 25 AND icecek LIKE '%Limonata%';
AND kesişim, OR birleşim. Karmaşık koşullarda parantez kullan:
WHERE (fiyat > 30 OR icecek = 'Limonata') AND tarih >= '2026-01-01';
GROUP BY: Gruplayarak Hesapla
Bu SQL’in en güçlü ve en çok yanlış anlaşılan kısmı. Mantığı şu: aynı değere sahip satırları bir satıra indir, o satırda hesaplama yap.
SELECT
icecek,
COUNT(*) AS adet,
SUM(fiyat) AS toplam_ciro,
AVG(fiyat) AS ortalama_fiyat,
MIN(fiyat) AS en_dusuk,
MAX(fiyat) AS en_yuksek
FROM musteriler
GROUP BY icecek
ORDER BY toplam_ciro DESC;
Bu sorgu şunu yapar: her içecek için kaç satır var, toplam kaç TL, ortalama, en düşük ve en yüksek fiyat. Sonra ciroya göre azalan sırada dizer.
Altın kural: SELECT içinde GROUP BY’da olmayan bir sütun kullanırsan hata alırsın. Sebebi: gruptan tek bir değer döndüremez, hangisini seçeceğini bilemez. Aggregation fonksiyonları (COUNT, SUM, AVG, MIN, MAX) istisnadır — onlar grubu temsil eden tek bir değer üretir.
HAVING: Grupları Filtrele
WHERE satırları gruplamadan önce filtreler. Grupladıktan sonra filtrelemek istersen HAVING:
SELECT icecek, COUNT(*) AS adet
FROM musteriler
GROUP BY icecek
HAVING COUNT(*) >= 2;
Bu, “2 veya daha fazla satıra sahip içecekleri göster” demek. Eğer WHERE kullansaydık satır bazlı filtrelerdik, bu sorguyu yazamazdık.
Sıralama şöyle çalışır:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
ORDER BY ve LIMIT
Sonuçları sırala ve kısıtla:
SELECT isim, fiyat
FROM musteriler
ORDER BY fiyat DESC, isim ASC
LIMIT 5;
Birden fazla sütuna göre sıralayabilirsin: önce fiyata göre azalan, eşit fiyatlarda isme göre artan.
Sorgu Anatomisi
Tipik bir analitik sorgu:
SELECT -- 5) ne gösterilecek
icecek,
COUNT(*) AS adet
FROM musteriler -- 1) hangi tablo
WHERE tarih >= '2026-01-01' -- 2) hangi satırlar
GROUP BY icecek -- 3) nasıl gruplanacak
HAVING COUNT(*) >= 1 -- 4) hangi gruplar
ORDER BY adet DESC -- 6) hangi sırada
LIMIT 10; -- 7) kaç tanesi
Her parçanın sırası sabit. Bu kalıbı içselleştir, her sorguda işini görür.
Alıştırma
SELECT COUNT(DISTINCT icecek) FROM musteriler;— kaç farklı içecek var?- En yüksek 3 fiyatı getir (
ORDER BY ... LIMIT). - İsmi ‘A’ ile başlayan müşterileri getir (
LIKE).
Sıradaki
Tek tabloda soru sormayı öğrendin. Şimdi iki tabloyu birleştiriyoruz →