Bu rehberde, SQL dilini öğrenmek veya geliştirmek isteyen herkes için Müşteri veritabanı üzerinden örneklerle açıklanmış 30′ dan fazla SQL sorgusunu bulacaksınız. Temel seçme işlemlerinden alt sorgulara, toplu işlemlerden güncelleme ve silmeye kadar birçok farklı başlık altında SQL pratiği yapabilirsiniz.
🎯 SQL Nedir? Ne İşe Yarar?
SQL (Structured Query Language), ilişkisel veritabanlarında veri oluşturmak, okumak, güncellemek ve silmek (CRUD işlemleri) için kullanılan standart bir programlama dilidir. Modern veri analizinden raporlamaya kadar birçok alanda temel araçtır.
SQL, veriyi anlamak ve işlemek isteyen herkes için vazgeçilmez bir beceridir.
📌 SQL Sorgusu (Query) Nedir?
SQL sorgusu, veritabanına gönderdiğimiz bir istektir. Bu istek ile veriyi:
- Alabiliriz (
SELECT) - Güncelleyebiliriz (
UPDATE) - Ekleyebiliriz (
INSERT) - Silebiliriz (
DELETE)
📘 Bu Rehberde Neler Öğreneceksiniz?
✅ 40’tan fazla gerçek SQL sorgusu örneği
✅ Temel SQL sözdizimi
✅ Veri alma (SELECT), filtreleme, sıralama, gruplama
✅ Birden fazla tabloyu birleştirme (JOIN)
✅ Alt sorgular (Subqueries), koşullu mantık (CASE)
✅ Gelişmiş analiz (Window Fonksiyonları)
Her sorgu için gerçek dünya örnekleri sunulmuştur. Hedefimiz: SQL’i öğrenmekten öte, uygulayabilmenizi sağlamak!
🧠 Neden SQL Öğrenmeliyim?
- 👨💻 Veri bilimi ve analizinde temel dil
- 📊 Raporlama ve dashboard oluşturma yetenekleri kazandırır
- 🧩 Veriler arasında ilişkileri çözmenizi sağlar
- 💼 Her sektörde geçerli bir beceridir (web programlama, e-ticaret, finans, eğitim…)
🔍 Temel SQL Sorguları
1- CREATE TABLE ile Yeni Tablo Oluşturma
Yeni bir tablo oluşturmak için CREATE TABLE sorgusu kullanılır. Aşağıda “Musteriler” isimli bir tablo oluşturduk. Bu tablo Musteri ID, Ad, Soyad, Sehir, Email, KayıtTarihi ve Aktif isimli sütunlar içerecektir. Rehberimizdeki tüm örnekleri de bu tablo üzerinden vereceğiz.
CREATE TABLE Musteriler_Satisli (
MusteriID INT PRIMARY KEY,
Ad VARCHAR(50),
Soyad VARCHAR(50),
Sehir VARCHAR(50),
Satis DECIMAL(10,2),
KayitTarihi DATE,
Aktif BOOLEAN
);
2- INSERT INTO ile Tabloya Veri (Kayıt) Ekleme
INSERT INTO ifadesi, SQL’de yeni veri (kayıt) eklemek için kullanılır. Yani, bir tabloya yeni satırlar eklememizi sağlar. INSERT INTO komutu, veri ekler ama güncellemez. Güncelleme için UPDATE kullanılır.
Birden fazla kayıt eklemek istersen, VALUES kısmına birden fazla parantez açarak yazabilirsiniz.
INSERT INTO Musteriler_Satisli (MusteriID, Ad, Soyad, Sehir, Satis, KayitTarihi, Aktif) VALUES
(1, 'Ayşe', 'Yılmaz', 'İstanbul', 1500.00, '2021-01-15', TRUE),
(2, 'Mehmet', 'Demir', 'Ankara', 2750.50, '2021-11-30', FALSE),
(3, 'Elif', 'Kaya', 'İzmir', 3200.00, '2022-02-20', TRUE),
(4, 'Ahmet', 'Çelik', 'Bursa', 1980.00, '2022-06-05', TRUE),
(5, 'Zeynep', 'Şahin', 'Antalya', 2550.75, '2022-09-10', FALSE),
(6, 'Murat', 'Aydın', 'Konya', 3100.00, '2024-04-01', TRUE),
(7, 'Fatma', 'Koç', 'Eskişehir', 1450.90, '2024-07-25', TRUE),
(8, 'Emre', 'Polat', 'Samsun', 2800.00, '2024-12-12', FALSE),
(9, 'Derya', 'Arslan', 'Adana', 2300.50, '2025-03-03', TRUE),
(10, 'Hasan', 'Yavuz', 'Kayseri', 2950.00, '2025-05-18', TRUE);
🧾 Oluşan Musteriler Tablosu
Yukarıdaki sorgu komutları sonucunda oluşan tablo şu şekilde olacaktır:
| MusteriID | Ad | Soyad | Sehir | Satis | KayitTarihi | Aktif |
|---|---|---|---|---|---|---|
| 1 | Ayşe | Yılmaz | İstanbul | 1500.00 | 2021-01-15 | TRUE |
| 2 | Mehmet | Demir | Ankara | 2750.50 | 2021-11-30 | FALSE |
| 3 | Elif | Kaya | İzmir | 3200.00 | 2022-02-20 | TRUE |
| 4 | Ahmet | Çelik | Bursa | 1980.00 | 2022-06-05 | TRUE |
| 5 | Zeynep | Şahin | Antalya | 2550.75 | 2022-09-10 | FALSE |
| 6 | Murat | Aydın | Konya | 3100.00 | 2024-04-01 | TRUE |
| 7 | Fatma | Koç | Eskişehir | 1450.90 | 2024-07-25 | TRUE |
| 8 | Emre | Polat | Samsun | 2800.00 | 2024-12-12 | FALSE |
| 9 | Derya | Arslan | Adana | 2300.50 | 2025-03-03 | TRUE |
| 10 | Hasan | Yavuz | Kayseri | 2950.00 | 2025-05-18 | TRUE |
🔹 SELECT ile Veri Okuma ve Listeleme
SQL’ de bir tablodan veri çekmek için kullanılan komut, SELECT komutudur.
1. Tüm müşteri kayıtlarını listele:
SELECT * FROM Musteriler;
SQL’de * (yıldız işareti), “tüm sütunları” temsil eder.
2. Sadece müşteri adlarını ve soyadlarını göster:
SELECT Ad, Soyad FROM Musteriler;
3. Ankara şehrindeki müşterileri getir:
SELECT * FROM Musteriler WHERE Sehir = 'Ankara';
4. Aktif müşterileri göster:
SELECT * FROM Musteriler WHERE Aktif = TRUE;
5. Kayıt tarihi 2023’ten sonra olan müşteriler:
SELECT * FROM Musteriler WHERE KayitTarihi > '2023-01-01';
🔹 Sıralama ve Filtreleme
6. Müşterileri ada göre alfabetik sırala:
SELECT * FROM Musteriler ORDER BY Ad ASC;
Ad sütunundaki isimleri A’ dan Z’ ye doğru sırayla listeler. DESC ile Z’ den A’ ya sıralanabilir.
7. En yeni kayıt olan ilk 5 müşteriyi listele:
SELECT * FROM Musteriler ORDER BY KayitTarihi DESC LIMIT 5;
Eğer SQL Server kullanıyorsanız LIMIT ifadesi desteklenmez. Onun yerine TOP ve ORDER BY ifadeleri kullanılır.
SELECT TOP 5 *
FROM Musteriler
ORDER BY KayitTarihi DESC;
8. Müşteri adında hem “a” hem de “e” geçenleri listele:
SELECT * FROM Musteriler
WHERE Ad LIKE '%a%' AND Ad LIKE '%e%';
9. Bugün kayıt olan müşteriler:
SELECT * FROM Musteriler WHERE KayitTarihi = CURRENT_DATE;
10. 2024 Yılında kayıt olan müşteriler:
SELECT *
FROM Musteriler
WHERE KayitTarihi BETWEEN '2024-01-01' AND '2024-12-31';
11. Sadece ilk harfi büyük ad ve soyadları göster:
SELECT INITCAP(Ad) AS Ad, INITCAP(Soyad) AS Soyad FROM Musteriler;
🔹 Fonksiyonlar ve Toplu İşlemler
12. Toplam müşteri sayısını öğren:
SELECT COUNT(*) AS ToplamMusteri FROM Musteriler;
13. Her şehirdeki müşteri sayısı:
SELECT Sehir, COUNT(*) AS MusteriSayisi
FROM Musteriler
GROUP BY Sehir;
14. Aktif ve pasif müşteri sayılarını göster:
SELECT Aktif, COUNT(*) AS Sayisi
FROM Musteriler
GROUP BY Aktif;
15. Toplam satış tutarını hesapla:
SELECT
SUM(Satis) AS ToplamSatis,
FROM Musteriler
WHERE Satis IS NOT NULL;
16. Ortalama Satış Tutarını Hesapla:
SELECT
AVG(Satis) AS OrtalamaSatis,
FROM Musteriler
WHERE Satis IS NOT NULL;
17. En Düşük Satış Tutarını Göster:
SELECT
MIN(Satis) AS EnDusukSatis
FROM Musteriler
WHERE Satis IS NOT NULL;
18. En Yüksek Satış Tutarını Göster:
SELECT
MAX(Satis) AS EnYuksekSatis,
FROM Musteriler
WHERE Satis IS NOT NULL;
19. GROUP BY ve HAVING
GROUP BY: Verileri belirli bir sütuna göre gruplamak için kullanılır. Genellikle COUNT, SUM, AVG, MAX, MIN gibi fonksiyonlarla birlikte kullanılır.
HAVING: GROUP BY ile oluşturulan gruplar üzerinde filtreleme yapmak için kullanılır. WHERE koşulu satırları filtrelerken, HAVING grupları filtreler.
SELECT Sehir, AVG(Satis) AS OrtalamaSatis
FROM Musteriler
GROUP BY Sehir
HAVING AVG(Satis) > 2000;
Her şehirdeki müşterilerin ortalama satışlarını hesaplar ve ortalaması yalnızca 2000’den fazla olan şehirleri listeler.
🔹 Gelişmiş Sorgular
20. İsmi “Ali” ile başlayan müşteriler:
SELECT * FROM Musteriler WHERE Ad LIKE 'Ali%';
21. Email bilgisi eksik olan müşteriler:
SELECT * FROM Musteriler WHERE Email IS NULL;
22. “istanbul” veya “izmir” şehirlerinden müşteriler:
SELECT * FROM Musteriler WHERE Sehir IN ('Istanbul', 'Izmir');
🔹 Alt Sorgular ve JOIN
23. En erken kayıt olan müşteriyi getir:
SELECT * FROM Musteriler
WHERE KayitTarihi = (SELECT MIN(KayitTarihi) FROM Musteriler);
🔹 Güncelleme ve Silme
24. Ankara’daki tüm müşterileri pasif yap:
UPDATE Musteriler SET Aktif = FALSE WHERE Sehir = 'Ankara';
25. Email bilgisi olmayan müşterileri sil:
DELETE FROM Musteriler WHERE Email IS NULL;
🔹 Yeni Sütun ve Veri Ekleme
26. Yeni Sütun Ekleme
ALTER TABLE Musteriler
ADD Iletisim VARCHAR(100);
Iletisim: Eklenen yeni sütunun adı.VARCHAR(100): Maksimum 100 karakterlik metin tutar (telefon numarası, WhatsApp, Instagram vb. bilgiler için uygundur).
27. Yeni Sütuna Veri Ekleme
UPDATE Musteriler SET Iletisim = '0599 111 1122' WHERE MusteriID = 1;
UPDATE Musteriler SET Iletisim = 'mehmet.demir@example.com' WHERE MusteriID = 2;
UPDATE Musteriler SET Iletisim = '0955 333 3344' WHERE MusteriID = 3;
-- diğerlerini de isteğe göre doldurabilirsiniz
Yeni eklenen sütun ve verilerden sonra tablonun son görünümü şu şekilde olacaktır:
| MusteriID | Ad | Soyad | Sehir | Satis | KayitTarihi | Aktif | Iletisim |
|---|---|---|---|---|---|---|---|
| 1 | Ayşe | Yılmaz | İstanbul | 1500.00 | 2021-01-15 | TRUE | 0599 111 1122 |
| 2 | Mehmet | Demir | Ankara | 2750.50 | 2021-11-30 | FALSE | mehmet.demir@example.com |
| 3 | Elif | Kaya | İzmir | 3200.00 | 2022-02-20 | TRUE | 0955 333 3344 |
| 4 | Ahmet | Çelik | Bursa | 1980.00 | 2022-06-05 | TRUE | NULL |
| 5 | Zeynep | Şahin | Antalya | 2550.75 | 2022-09-10 | FALSE | NULL |
| 6 | Murat | Aydın | Konya | 3100.00 | 2024-04-01 | TRUE | NULL |
| 7 | Fatma | Koç | Eskişehir | 1450.90 | 2024-07-25 | TRUE | NULL |
| 8 | Emre | Polat | Samsun | 2800.00 | 2024-12-12 | FALSE | NULL |
| 9 | Derya | Arslan | Adana | 2300.50 | 2025-03-03 | TRUE | NULL |
| 10 | Hasan | Yavuz | Kayseri | 2950.00 | 2025-05-18 | TRUE | NULL |
🔹 Başka Tablolarla İlişkilendirme
Varsayalım ki elimizde Musteriler tablosundan başka Sehirler, Siparisler ve Departmanlar gibi ek tablolarımız olsun.
Farklı tablolarla ilişkilendirmelerde “Alias” denilen takma adlar kullanılır. Örneğin;
m.Ad→ “MusterilertablosundakiAdsütunu” anlamına gelir.m→Musterilertablosuna verilen takma addır (alias).Ad→Musterilertablosundaki sütun adıdır.
Alias kullanmadan da sorgulamalar yapmak mümkündür ancak daha uzun ve karmaşık olur. Örneğin; aşağıdaki sorguların ikisi de şu anlama gelir ve doğrudur:
Musteriler tablosundaki Ad ile Sehirler tablosundaki SehirAdi bilgilerini getir.
SELECT m.Ad, s.SehirAdi
SELECT Musteriler.Ad, Sehirler.SehirAdi
28. Farklı Tablolara ait Sütunları Eşleştirme:
SELECT m.Ad, s.SehirAdi
FROM Musteriler m
INNER JOIN Sehirler s ON m.Sehir = s.SehirKodu;
Musteriler tablosundaki Sehir sütunu, Sehirler tablosundaki SehirKodu ile eşleşiyor.
29. Siparişi Olan ve Olmayan Tüm Müşteriler:
SELECT m.Ad, s.SiparisID
FROM Musteriler m
LEFT JOIN Siparisler s ON m.MusteriID = s.MusteriID;
30. Siparişi olan müşteriler ve eşleşen müşteri bilgileri
SELECT m.Ad, s.SiparisID
FROM Musteriler m
RIGHT JOIN Siparisler s ON m.MusteriID = s.MusteriID;
Sadece siparişi olanlar listelenir, ancak eşleşmeyen müşteriler null çıkar.
31. Müşteri ve Tavsiye Eden Müşteri
Varsayalım ki her müşteri başka bir müşteri tarafından tavsiye edilebiliyor (TavsiyeEdenID sütunu var).
SELECT m1.Ad AS Musteri, m2.Ad AS TavsiyeEden
FROM Musteriler m1
JOIN Musteriler m2 ON m1.TavsiyeEdenID = m2.MusteriID;
32. Satış Miktarına Göre Kategori
SELECT Ad,
CASE
WHEN Satis > 5000 THEN 'Yüksek'
WHEN Satis BETWEEN 2000 AND 5000 THEN 'Orta'
ELSE 'Düşük'
END AS SatisSeviyesi
FROM Musteriler;
33. Belirli Şehirden Gelen Müşteriler
SELECT *
FROM Musteriler
WHERE Sehir = (
SELECT SehirKodu FROM Sehirler WHERE SehirAdi = 'İstanbul');
34. Şehre Göre Satış Sıralaması
SELECT Ad, Sehir, Satis,
RANK() OVER (PARTITION BY Sehir ORDER BY Satis DESC) AS SehirIciSira
FROM Musteriler;
Her şehirdeki müşterileri, satış miktarına göre sıralar.






















