








Mülakatlardan Konuşalım (Bölüm 2) 😎
Geçen yazıda soft skiller, STAR metodolojisi ve Excel'e değindik. Bunlar temel set. Şimdi daha ileri gidiyoruz, SQL.
Excel'i iyi öğrendiyseniz, temelleri zaten anlıyorsunuz: veriler nasıl ilişkilendirilir, bağlantılarda ne tür sorunlar olur, gruplamalar nasıl çalışır. SQL'e geçiş başlangıçta aslında 5 komuttan ibaret: SELECT, FROM, WHERE, JOIN, GROUP BY. Pencere fonksiyonları ve geçici tablolar faydalıdır ancak başlangıçta kritik değildir.
Şimdi asıl konuya gelelim. Temel sorun sözdiziminde değil. Sorun, sorguyu düşürmeyen bloklarda. Kod çalışır, yorumlayıcı sessiz kalır, ancak sonuç görüşmecinin beklediği gibi olmaz. İşte bu noktada çuvallarlar.
1️⃣NOT IN + NULL: Veri yerine sessizlik
SQL'de: NULL ≠ boş ≠ 0. Python öğrenenler bilir: sıfır sıfırdır, NULL ise boşluk, hiçliktir. Bunu aklınızda tutun.
Görev: Kara listede olmayan kullanıcıları bulun.
❌
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked)Görünüşte her şey doğru. Ancak blocked tablosunda user_id = NULL olan en az bir satır varsa, sonuç: 0 satır. SQL NULL ile karşılaştırma yapamaz ve sessizce boş döndürür.
✅
SELECT * FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM blocked b
WHERE b.user_id = u.id
)Bu arada, NOT EXISTS ayrıca daha hızlıdır: id'yi alır, ikinci tabloya gider, ilk eşleşmeyi bulur, durur. NOT IN tabloyu baştan sona tarar. Büyük tablolarda fark belirgindir.
2️⃣ Sessizce INNER JOIN'e dönüşen LEFT JOIN
JOIN türlerini serinin sonraki yazılarında detaylıca ele alacağız. Şimdi sadece tuzağın özü.
❌
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.status = 'completed'Ne olur: WHERE, sağ tablodaki NULL satırları öldürür. Siparişi olmayan müşteriler kaybolur. LEFT JOIN, INNER JOIN'e dönüşür. Sonuç yanlış.
✅
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON c.id = o.customer_id
AND o.status = 'completed'AND ile tek satır. Fark temel.
3️⃣AVG güzel yalan söyler
İşte size bir soru. Satışlarla ilgili 10 satır. Üçünde NULL var. AVG kaç döndürür? 10 üzerinden değil, 7 üzerinden ortalama. Değerler gerçeğe benziyorsa, hileyi fark etmek zordur. Rakam gerçekçidir ancak çarpıktır.
❌
SELECT AVG(salary) FROM employees✅
SELECT AVG(COALESCE(salary, 0)) FROM employeesCOALESCE: NULL ile karşılaştığında 0 ile değiştirir. Onsuz da yapabilirsiniz, ancak o zaman görüşmeciye AVG'nin davranışını anladığınızı ve bilinçli olarak kabul ettiğinizi açıklamanız gerekir. Her iki seçenek de kabul edilir 👌
4️⃣Çalıştırma sırası: En büyük tuzak
Yazarken: SELECT → FROM → WHERE → GROUP BY.
Çalıştırılırken: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
Mantıksız mı? Kesinlikle 🤷♀️
❌
SELECT category, AVG(sales) AS avg_sales
FROM orders
WHERE avg_sales > 1000
GROUP BY categoryavg_sales takma adı WHERE aşamasında henüz mevcut değil. Sistem bu alanı bilmez.
✅
SELECT category, AVG(sales) AS avg_sales
FROM orders
GROUP BY category
HAVING AVG(sales) > 1000HAVING, gruplamadan sonra filtrelemedir. Serinin ayrı bir yazısında daha detaylı ele alacağız.
5️⃣Sözdizimini mi unuttunuz? Panik yapmayın
Olur: sinirler, konuya uzun süre dokunmamışsınızdır. Kimin başına gelmez ki. Doğrudan söyleyin: "Mantığı anlıyorum, adımları tarif edebilirim. Tam sözdizimini Google'da arardım." Her makul uzman bunu takdir eder. Mantığı anlamak başka bir şey. Bir fonksiyonu Google'da aramak = 30 saniye.
Son olarak bonus: Test sorusundaki ilk soru = "Hangi DBMS'yi kullanıyorsunuz?".
DATE_TRUNC — PostgreSQL. DATE_FORMAT — MySQL. Yanlış veritabanı için doğru sorgu = boş yere hata.
Bir sonraki SQL yazısında: Retention ve kohortlar. Yarın ise ekibimin Grand-Alpha şirketiyle ilgili vakası hakkında bir yazı ve makale. Hayvan yemiyle uğraşıyorlar.
Size bir soru. Hiç cevabı unutup hatırlayamadığınız oldu mu? Bu durumda ne yaptınız? 👇
#sql
@data_dzen
Yorumlar
0Henüz yorum yok.
Tartışmaya katılmak için giriş yapın.