Tam Deneme Mülakatı Problem Seti
Mülakat koşullarında birleştirmeleri, pencereleri ve CTE'leri bir araya getiren, süreli uçtan uca problemler.
Tam Deneme Mülakatı Problem Seti, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.
Bir SQL Mülakat Turu Nasıl İlerler
Bu son bölümde, mülakat koşullarında birleştirmeleri, pencere işlevlerini ve CTE kullanımını birleştiren kapsamlı deneme problemlerini çözersiniz. Önce üst beceriye bakalım: görüşme sırasında nasıl davranmalısınız?
- Problemi yeniden ifade edin ve şemayı doğrulayın.
- Kod yazmadan önce köşe durumlarını netleştirin (NULL değerleri, eşitlikler, yinelenenler).
- Yaklaşımınızı açıklayın, ardından sorguyu yazın.
- Zihninizde küçük bir örnek üzerinde test edin.
Mülakatçılar sürecinizi, son sorgunuz kadar önemser.
Ortak Şema
Aşağıdaki tüm problemler bu küçük e-ticaret şemasını kullanır. Her sorgunun anlam kazanması için şemayı bir kez okuyun.
customers(id, name, country)orders(id, customer_id, order_date, status, amount)order_items(order_id, product_id, quantity)products(id, name, category, price)
Bunu aklınızda tutun; dersin geri kalanında bu tablolara başvurulacaktır.
-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currencyProblem 1: Harcamaya Göre En İyi Müşteriler
"Toplam ödenmiş harcamaya göre en fazla harcayan ilk 3 müşteriyi, adları ve toplamlarıyla birlikte döndürün."
Yaklaşım: ödenmiş siparişleri filtreleyin, müşteri bazında toplulaştırın, sonuçları sıralayın ve sınırlandırın. İptal edilmiş ve bekleyen siparişleri dahil etmediğinizi belirtin; bu, mülakatçıların özellikle eklediği bir köşe durumudur.
SELECT c.name,
SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY total_spend DESC
LIMIT 3;Problem 2: Hiç Sipariş Vermeyen Müşteriler
"Hiç sipariş vermemiş müşterileri listeleyin." Bu, anti-birleştirme örüntüsüdür. İki temiz çözüm vardır: IS NULL ile LEFT JOIN kullanmak veya NOT EXISTS kullanmak.
NOT EXISTS kullanmayı tercih edin; çünkü NOT IN'in aksine NULL değerlerine karşı güvenlidir. Bu ayrımdan söz edin; mülakatçının tam olarak öğrenmek istediği nokta budur.
-- NULL-safe anti-join
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);Problem 3: İkinci En Yüksek Sipariş Tutarı
"Birbirinden farklı sipariş tutarları arasından ikinci en yüksek olanı bulun." En temiz ve eşitliklerden etkilenmeyen çözüm, yinelenen tutarların aynı sırayı paylaşması için DENSE_RANK kullanır.
Belirtmeniz gereken köşe durumu şudur: ikinci farklı değer yoksa bu sorgu hiç satır döndürmez; bunun kabul edilebilir olup olmadığı veya gereksinimlere bağlı olarak bir COALESCE sarmalayıcısına ihtiyaç duyulup duyulmayacağı değerlendirilmelidir.
SELECT amount
FROM (
SELECT amount,
DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
FROM orders
) ranked
WHERE rnk = 2;Problem 4: Müşteri Başına Son Sipariş
"Her müşterinin en yakın tarihli siparişini döndürün." Bu, anahtar başına en son satırı tutma örüntüsüdür; müşteri bazında bölümlenmiş ve tarihe göre azalan sıralanmış ROW_NUMBER ile çözülür.
İki sipariş aynı tarihi paylaştığında sonucun belirli olması için bir eşitlik bozucu (sipariş kimliği) ekleyin; iyi adayların özellikle belirttiği ayrıntılardan biri budur.
SELECT customer_id, id AS order_id, order_date, amount
FROM (
SELECT o.*,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC, id DESC
) AS rn
FROM orders o
) t
WHERE rn = 1;Problem 5: Aydan Aya Büyüme
"Aylık ödenmiş geliri ve önceki aya göre yüzde değişimini hesaplayın." Bu işlem, bir CTE içindeki toplulaştırmayı LAG ile birleştirir.
İlk adım ay bazında toplulaştırır; ikinci adımda her ay, LAG kullanılarak önceki ayla karşılaştırılır. İlk ayın (önceki ayı olmadığından) hata vermemesi için bölme işlemini güvenli hale getirin.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS mth,
SUM(amount) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY DATE_TRUNC('month', order_date)
)
SELECT mth,
revenue,
LAG(revenue) OVER (ORDER BY mth) AS prev_revenue,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY mth))
/ NULLIF(LAG(revenue) OVER (ORDER BY mth), 0), 2
) AS pct_change
FROM monthly
ORDER BY mth;Problem 6: Kategori Başına En İyi Ürün
"Her kategori için toplam miktara göre en çok satan ürünü döndürün." Bu, grup başına en iyi N örüntüsüdür: toplulaştırın, bölüm içinde sıralayın ve 1. sıraya göre filtreleyin.
Eşitlikler önemliyse ROW_NUMBER yerine RANK kullanarak aynı anda lider olanların tümünü döndürün. Bu tercihi açıklamanız, aradaki farkı anladığınızı gösterir.
WITH sales AS (
SELECT p.category,
p.name AS product,
SUM(oi.quantity) AS qty
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.category, p.name
)
SELECT category, product, qty
FROM (
SELECT s.*,
ROW_NUMBER() OVER (
PARTITION BY category ORDER BY qty DESC
) AS rn
FROM sales s
) r
WHERE rn = 1;Problem 7: Gelirin Kümülatif Toplamı
"Ödenmiş gelirin gün bazında kümülatif toplamını gösterin." Sıralı bir çerçeve kullanan pencere SUM işlevi, kendi kendine birleştirme yapmadan kümülatif toplamı üretir.
Gerçek bir satır satır kümülatif toplam için ROWS çerçevelemesinden söz edin; varsayılan RANGE çerçevesi aynı tarihli kayıtlarla beklenmedik davranabilir.
SELECT order_date,
SUM(daily) OVER (
ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM (
SELECT order_date, SUM(amount) AS daily
FROM orders
WHERE status = 'paid'
GROUP BY order_date
) d
ORDER BY order_date;Problem 8: Ardışık Etkin Günler
"Ödenmiş sipariş içeren en az 3 ardışık güne sahip kullanıcıları bulun." Bu, satır numarası farkı hilesini kullanan bir boşluklar ve adalar çeşididir.
Kullanıcı başına satır numarasından tarihi çıkarmak, ardışık bir dizi içinde sabit bir değer verir; böylece bu sabite göre gruplandırıp sayım yapabilirsiniz. Bu, kıdemli düzeyde olduğunuzu gösteren bir işarettir.
WITH days AS (
SELECT DISTINCT customer_id, order_date
FROM orders WHERE status = 'paid'
),
grp AS (
SELECT customer_id, order_date,
order_date - (ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY order_date
) * INTERVAL '1 day') AS island
FROM days
)
SELECT customer_id, COUNT(*) AS streak_len
FROM grp
GROUP BY customer_id, island
HAVING COUNT(*) >= 3;Performans ve Yaygın Tuzaklar
Doğru bir sorgudan sonra mülakatçılar "Bunu nasıl hızlandırırdınız?" diye sorar ve klasik tuzaklara düşüp düşmediğinizi izler. Hazır bir kontrol listeniz olsun:
- Birleştirme ve filtreleme sütunlarını indeksleyin (örneğin
orders(customer_id, status)); WHERE içinde indekslenmiş sütunlara işlev uygulamaktan kaçının. - Büyük anti-birleştirmelerde IN yerine EXISTS kullanmayı tercih edin; NULL içeren
NOT INsessizce hiçbir sonuç döndürmez. - Dış birleştirmeyle alınan bir sütunu WHERE içinde filtrelemek, sorguyu fark ettirmeden iç birleştirmeye dönüştürür.
- En iyi N sonuçlarının belirli olması için her zaman bir eşitlik bozucu ekleyin.
- Büyük tablolarda sıralı taramalar yapılıp yapılmadığını EXPLAIN planında kontrol edin.
Hızlı Kontrol
Her müşterinin tek bir en yakın tarihli siparişini almanız gerekiyor ve iki sipariş aynı tarihi paylaşabilir.
Özet: Tam Deneme Mülakat Seti
En sık karşılaşılan mülakat problemlerini baştan sona çözdünüz:
- En fazla harcayan N müşteriyi bulmak için toplulaştırma + LIMIT.
- NOT EXISTS ile anti-birleştirmeler (NULL değerlerine karşı güvenli).
- N'inci en yüksek değer için DENSE_RANK; anahtar başına son kayıt ve grup başına en iyi kayıt için ROW_NUMBER.
- Aydan aya karşılaştırma için LAG; kümülatif toplamlar için SUM OVER.
- Diziler için boşluklar ve adalar satır numarası hilesi.
- Her yanıtı indeksleri, EXPLAIN'i ve yaygın tuzakları tartışarak tamamlayın.
Yapay zeka eğitmeniyle SQL öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 30
- Dersler
- 120
Sıkça Sorulan Sorular
“Tam Deneme Mülakatı Problem Seti” dersi ücretsiz mi?
Evet — “Tam Deneme Mülakatı Problem Seti” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.
“Tam Deneme Mülakatı Problem Seti” dersinde ne öğreneceğim?
Mülakat koşullarında birleştirmeleri, pencereleri ve CTE'leri bir araya getiren, süreli uçtan uca problemler. SQL Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Tam Deneme Mülakatı Problem Seti” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- 3NF'ye Kadar Normalleştirme
- ER Modellemesi ve İlişki Kardinalitesi
- Yıldız Şema ve Veri Ambarı Tasarımı
- Tam Deneme Mülakatı Problem Seti