📝 Pratik & Referans
Pratik & Referans: SQL öğrenmek, yüzmeyi kitaptan öğrenmek gibi değil — suya girmek gerekir. Kitap sana kulaç tekniğini anlatabilir, ama nefesini ne zaman alacağını ancak bir kez
SQL öğrenmek, yüzmeyi kitaptan öğrenmek gibi değil — suya girmek gerekir. Kitap sana kulaç tekniğini anlatabilir, ama nefesini ne zaman alacağını ancak bir kez yutkunduğunda öğrenirsin. Editörü aç, sorguyu çalıştır, hata al, düzelt. Peki neden okuyarak öğrenmek burada özellikle yetersiz kalıyor — sözdizimi bu kadar basitken? Çünkü SQL'in zorluğu sözdiziminde değil, **sessiz yanlışlarında**dır. Yanlış yazılmış bir Java kodu derlenmez, ekrana kırmızı bir hata basar; yanlış yazılmış bir SQL sorgusu ise çoğu zaman gayet düzgün çalışır ve sana YANLIŞ bir tablo döndürür. JOIN koşulunu unuttuğunda hata almazsın — 200 satır yerine 40.000 satır alırsın. `WHERE x = NULL` yazdığında hata almazsın — sıfır satır alırsın. Bu tür hataları kitap okuyarak değil, ancak beklediğin sonuçla gerçek sonucu yan yana koyarak fark edersin. Java'da derleyici senin ilk gözden geçireninidir; SQL'de o rol boştur ve o boşluğu doldurması gereken kişi sensin. Bu yüzden alışkanlık edin: yıkıcı bir sorgu yazmadan önce aynı WHERE ile bir SELECT koş, dönen satır sayısına bak. QA açısından bu pratik yapma biçimi doğrudan işe dönüşür: mülakatta 'şu sorguyu yaz' dendiğinde ezberden değil, kafanda çalıştırarak cevap verirsin; sahada ise pipeline'ı bekletmeden bug'ın kök nedenini bulan kişi olursun. Her alıştırmayı önce kendin çözmeye çalış, çözümü ancak kendi cevabını yazdıktan sonra aç.
Alıştırma 1: Başarısız Test Çalıştırmalarını Sorgula
id, test_name, status (PASS/FAIL/SKIP), duration_ms, run_date sütunlarına sahip bir test_runs tablosu verilmektedir. ÜÇ sorgu yazın: (a) bugünün tüm başarısız çalıştırmaları, (b) her durumun sayısı, (c) en yavaş 3 test.
DATE() bir DATETIME'den yalnızca tarih bölümünü çıkarır. CURDATE() bugünün tarihini döndürür. Bunlar MySQL fonksiyonlarıdır — PostgreSQL'de CURRENT_DATE kullanılır.
Alıştırma 2: Çoklu Tablo JOIN
Üç tablonuz var: users (id, name, email), test_cases (id, title, category), results (id, user_id, test_case_id, status, run_date). Son 30 günde çalıştırılan testler için: test uzmanı adı, test case başlığı, durum ve tarihi gösteren, en yenisi önce sıralı bir sorgu yazın.
"results" tablosundan (users ve test_cases'ı birleştiren ara tablo) başlayıp JOIN yapın. Bu, istenmeyen kartezyen çarpımı önler.
Alıştırma 3: CTE + Window Fonksiyonu — Test Uzmanlarını Başarı Oranına Göre Sırala
results tablosunu (user_id, status, sprint) kullanarak: CTE ile istatistikleri hesaplayıp RANK() window fonksiyonu ile test uzmanlarını SPRINT BAŞINA başarı oranına göre sıralayan bir sorgu yazın. Göster: sprint, uzman adı, toplam test, başarı sayısı, başarı oranı %, sprint içi sıralama.
İki CTE: birincisi ham sayımları toplar, ikincisi oranı hesaplar ve kullanıcı adlarını JOIN eder. Son SELECT window fonksiyonunu ekler. CTE'lere bölmek her adımı ayrıca hata ayıklanabilir kılar.
Hızlı Referans Kartı
Hızlı deneyler için db-fiddle.com'u yer imlerine ekleyin. DELETE veya UPDATE çalıştırmadan önce WHERE koşulunu SELECT ile test edin — tek bir eksik WHERE tüm tabloyu silebilir.
Birden fazla satiri tek bir ozet degere indirgeyen fonksiyon: COUNT, SUM, AVG, MIN, MAX.
Her yeni satirda otomatik olarak artan tam sayi. MySQL terimi; SQLite de INTEGER PRIMARY KEY, PostgreSQL de SERIAL.