Basit Bir Rapor Oluşturma Uygulaması
Bu, SQL ve Veritabanı Temelleri kursunun son dersidir. Önceki yedi derste öğrendiğimiz SELECT, WHERE, GROUP BY ve JOIN yapılarını tek bir uçtan uca rapor sorgusunda birleştireceğiz. Böylece gerçek bir iş isteğini karşılayan, anlamlı bir çıktı üreten bir sorguyu baştan sona nasıl kurgulayacağımızı göreceğiz.
Bu derste ne yapacağız?
Amacımız, birden fazla tablodan gelen verileri birleştirip belirli bir kritere göre filtreleyen, sonra da kategori bazında özetleyen basit bir satış raporu sorgusu yazmak. Bu dersi rahat takip edebilmek için önceki derslerde geçen SELECT, FROM, WHERE, JOIN, GROUP BY ve toplama fonksiyonları (SUM, COUNT) konularına aşina olmanız yeterli. Elinizde çalışan bir veritabanı yönetim aracı (örneğin DB Browser for SQLite, MySQL Workbench veya phpMyAdmin benzeri bir araç) olması faydalı olur; arayüz sürümden sürüme değişebilir, bu yüzden menü adları küçük farklılıklar gösterebilir.
Kavram
Gerçek hayatta bir rapor hazırlamak, dağınık bilgileri bir araya toplayıp anlamlı bir özet çıkarmaya benzer. Diyelim ki elinizde ayrı ayrı iki defter var: birinde hangi ürünün hangi kategoriye ait olduğu yazıyor, diğerinde ise hangi tarihte hangi üründen kaç adet satıldığı yazıyor. Sadece bu iki defteri yan yana koyup karşılaştırarak \"bu ay hangi kategoriden ne kadar satış oldu?\" sorusuna cevap veremezsiniz; önce iki defterin ortak bir sütunu (örneğin ürün kodu) üzerinden eşleştirilmesi, sonra belirli bir tarih aralığına göre süzülmesi, en sonunda da kategoriye göre toplanması gerekir.
SQL'de bu üç işlem sırasıyla JOIN (defterleri eşleştirme), WHERE (tarih aralığına göre süzme) ve GROUP BY (kategoriye göre toplama) ile yapılır. Bu derste bu üç adımı tek bir sorguda birleştireceğiz.
Adım adım uygulama
Örnek veritabanımızda üç tablo olduğunu varsayalım: musteriler (musteri_id, ad), urunler (urun_id, urun_adi, kategori) ve satislar (satis_id, musteri_id, urun_id, tarih, adet, birim_fiyat). Aşağıdaki adımları sırayla uygulayın.
- 1. Adım — Aracı açın ve veritabanına bağlanın. Veritabanı yönetim aracınızı açın, sol taraftaki bağlantı listesinden çalışacağınız veritabanına tıklayın. Üstteki Yeni Sorgu (bazı arayüzlerde New Query veya SQL Sekmesi) düğmesine tıklayarak boş bir sorgu penceresi açın.
- 2. Adım — Temel SELECT ve JOIN'i yazın. Önce hangi tabloları birleştireceğinizi belirleyin: satislar tablosunu urunler tablosuyla urun_id üzerinden eşleştirin. Sorgu penceresine şunu yazın: SELECT u.kategori, s.adet, s.birim_fiyat FROM satislar AS s JOIN urunler AS u ON s.urun_id = u.urun_id şeklinde başlayan bir sorgu kurun. Buradaki AS s ve AS u kısaltmaları, tablo adlarını her seferinde uzun uzun yazmamak için kullanılan takma adlardır (alias).
- 3. Adım — WHERE ile tarih filtresi ekleyin. Sadece belirli bir aya ait satışları görmek istiyorsanız, JOIN satırının hemen altına WHERE s.tarih BETWEEN '2026-08-01' AND '2026-08-31' satırını ekleyin. Bu, sadece Ağustos ayı içindeki kayıtları getirir.
- 4. Adım — GROUP BY ile kategoriye göre özetleyin. Şimdi tek tek satış satırları yerine kategori bazında toplam tutarı görmek istiyoruz. SELECT satırını şöyle güncelleyin: SELECT u.kategori, SUM(s.adet * s.birim_fiyat) AS toplam_ciro, COUNT(*) AS satis_sayisi. Sorgunun sonuna da GROUP BY u.kategori satırını ekleyin. SUM fonksiyonu her satırdaki adet ile birim_fiyat çarpımını toplar, COUNT(*) ise o kategoriye ait kaç satış satırı olduğunu sayar.
- 5. Adım — Sonucu sıralayın. En çok ciro getiren kategoriyi en üstte görmek için sorgunun en sonuna ORDER BY toplam_ciro DESC satırını ekleyin. DESC, büyükten küçüğe sıralama anlamına gelir.
- 6. Adım — Sorguyu çalıştırın. Araç çubuğundaki Çalıştır (bazı arayüzlerde Execute veya bir oynat/üçgen simgesi) düğmesine tıklayın. Alt panelde her kategori için toplam ciro ve satış sayısını içeren bir sonuç tablosu görmelisiniz.
- 7. Adım — Sonucu kontrol edin. Kategori sayısı kadar satır olması, sayısal sütunların anlamlı (negatif olmayan) değerler içermesi ve en yüksek cironun en üstte görünmesi beklenir. Beklenmedik bir sonuçla karşılaşırsanız, önce WHERE ve JOIN koşullarınızı tekrar kontrol edin.
Tam sorgunun mantığı özetle şöyledir: önce ilgili tablolar JOIN ile birleştirilir, sonra WHERE ile istenmeyen satırlar elenir, ardından GROUP BY ile kalan satırlar kategoriye göre gruplanır, SUM ve COUNT gibi fonksiyonlarla her grup için özet değerler hesaplanır ve son olarak ORDER BY ile sonuçlar anlamlı bir sırada sunulur. Bu akış, neredeyse her raporlama sorgusunda karşınıza çıkacak temel bir kalıptır.
Sık karşılaşılan sorunlar
| Hata veya belirti | Olası neden ve çözüm |
|---|---|
| \"column is ambiguous\" (sütun belirsiz) hatası | Aynı isimli sütun birden fazla tabloda var; sütun adının önüne tablo takma adını ekleyin, örneğin s.tarih. |
| GROUP BY kullanınca hata alınması | SELECT içindeki her sütun ya GROUP BY listesinde olmalı ya da bir toplama fonksiyonu (SUM, COUNT gibi) içinde olmalı; eksik sütunu GROUP BY'a ekleyin. |
| JOIN sonrası hiç satır dönmemesi | ON koşulundaki sütun adları veya veri tipleri eşleşmiyor olabilir; iki tablodaki ilgili sütunları ayrı ayrı kontrol edin. |
| Toplamların yanlış veya çok yüksek çıkması | JOIN, beklenmeyen şekilde satırları çoğaltmış olabilir (örneğin bire çok ilişki); WHERE ve JOIN koşullarını gözden geçirin. |
| Tarih filtresi hiç satır getirmemesi | Tarih sütununun biçimi (YYYY-AA-GG gibi) tırnak içindeki değerle uyuşmuyor olabilir; sütundaki örnek bir değere bakıp biçimi eşitleyin. |
Mini görev
Kendi örnek veritabanınızda (ya da bu ders için oluşturduğunuz basit tablolarda) aşağıdaki raporu kendi başınıza yazın: her müşterinin toplam kaç adet ürün satın aldığını ve bunun için toplam ne kadar ödediğini gösteren bir sorgu. Bunun için satislar tablosunu musteriler tablosuyla musteri_id üzerinden birleştirin, sadece belirli bir tarih aralığındaki satışları alın, müşteri adına göre gruplayın ve toplam tutara göre büyükten küçüğe sıralayın.
- JOIN koşulunuz doğru sütunlar üzerinden mi kuruldu?
- WHERE ile istediğiniz tarih aralığını doğru yazdınız mı?
- GROUP BY listesinde SELECT içindeki gruplanmamış her sütun var mı?
- SUM ve COUNT gibi fonksiyonlara anlamlı takma adlar (AS toplam_tutar gibi) verdiniz mi?
- ORDER BY ile sonucu istediğiniz sırada görüyor musunuz?
Kendini sına
1. Bir sorguda hem JOIN hem WHERE hem de GROUP BY kullanıldığında, SQL bu üç işlemi kavramsal olarak hangi sırayla ele alır?
2. GROUP BY kullanılan bir sorguda, SELECT içine hem gruplanmamış bir sütun hem de bir toplama fonksiyonu birlikte yazılabilir mi? Koşulu nedir?
3. \"column is ambiguous\" hatasını çözmek için genellikle ne yapılır?
4. ORDER BY ile DESC birlikte kullanıldığında sonuçlar nasıl sıralanır?
5. İki tablo arasında JOIN kurarken ON ifadesinin görevi nedir?
Cevaplar
1. Önce JOIN ile tablolar birleştirilir, sonra WHERE ile satırlar filtrelenir, en son GROUP BY ile kalan satırlar gruplanıp özetlenir.
2. Evet, ancak gruplanmamış sütun mutlaka GROUP BY listesinde de yer almalıdır; aksi hâlde veritabanı hata verir.
3. Belirsiz sütunun önüne, hangi tablodan geldiğini belirten tablo adı veya takma ad eklenir, örneğin s.tarih gibi.
4. Sonuçlar, ilgili sütuna göre büyükten küçüğe doğru sıralanır.
5. ON ifadesi, iki tablonun hangi ortak sütun üzerinden eşleştirileceğini belirtir; bu olmadan JOIN anlamsız veya hatalı sonuçlar üretir.
Bu dersle birlikte SQL ve Veritabanı Temelleri kursunu tamamlamış oldunuz. Basit SELECT sorgularından başlayıp WHERE ile filtrelemeyi, GROUP BY ile özetlemeyi ve JOIN ile birden fazla tabloyu birleştirmeyi öğrendiniz; son olarak bunların hepsini gerçek bir rapor sorgusunda bir araya getirdiniz. Artık kendi veritabanlarınızda anlamlı sorular sorup bu soruları SQL sorgularına dönüştürebilecek temel bilgiye sahipsiniz. Öğrendiklerinizi pekiştirmek için kendi ilgi alanınıza uygun küçük bir veri seti üzerinde farklı raporlar denemenizi öneririz.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol