Bloglar

Deneyimler, tavsiyeler ve gerçek hikayeler...

İş Görüşmelerinde SQL Soruları

M. Mustafa BOLAT

Mon, 13 Apr 2026

İş Görüşmelerinde SQL Soruları

İş Görüşmelerinde En Çok Sorulan SQL Soruları ve Cevapları

SQL, hala veri analisti, BI geliştiricisi, veri mühendisi ve hatta yazılım geliştirici rollerinde en çok test edilen teknik becerilerden biri. İş görüşmelerinde adaylara genellikle SELECT, JOIN, GROUP BY, HAVING, alt sorgular, pencere (window) fonksiyonları ve performans odaklı sorular soruluyor.

Bu yazıda, iş görüşmelerinde en sık sorulan SQL mülakat sorularını kategorilere ayırarak kısa açıklama + örnek sorgu + pratik yorum şeklinde ele alacağız. Özellikle:

  • Veri analisti / BI rollerine hazırlananlar
  • SQL kullanarak raporlama ve dashboard hazırlayanlar
  • "Teoride biliyorum ama mülakatta kitlenmek istemiyorum" diyenler

için net bir kontrol listesi olacak.

1. Mülakatlarda SQL’de Aslında Neye Bakılıyor?

Sorular farklı görünebilir ama çoğu şu 4 beceriyi test eder:

1) Temel sorgu okuryazarlığı

SELECT, WHERE, JOIN, GROUP BY, HAVING, ORDER BY, LIMIT gibi temel yapı taşlarını zorlanmadan yazabilmek.

2) Analitik düşünme

Soruyu parçalara ayırarak çözebilmek:

  • Hangi tablolar lazım?
  • Hangi koşullar var?
  • Gruplama nerede yapılacak?
  • Sonuç nasıl sıralanacak?

3) Pratik veri problemi çözme

Birden fazla tabloyu JOIN ile bağlamak, kümülatif toplam, sıralama, önce/sonra karşılaştırmaları için window fonksiyonlarını kullanmak.

4) Performans ve veri kalitesi farkındalığı

İndeks, gereksiz SELECT *, gereksiz alt sorgular, duplikeler gibi konularda temel fikir sahibi olmak.

Devamında göreceğin sorular, bu dört ekseni kapsayan bir çekirdek soru seti gibi düşünülebilir.


2. Temel Teorik Sorular

Soru 1: SQL nedir, ne için kullanılır?

Kısa cevap:

SQL (Structured Query Language), ilişkisel veritabanı sistemlerinde veri oluşturmak, güncellemek, silmek ve sorgulamak için kullanılan standart sorgulama dilidir.

Vurgulanabilecek noktalar:

  • Tablolar ve aralarındaki ilişkilerle çalışır (relational database mantığı).
  • Hem veri tanımlama (DDL) hem veri sorgulama/güncelleme (DML) için kullanılır.

Soru 2: DDL, DML, DCL, TCL nedir? Örnek verin.

Cevap özeti:

  • DDL (Data Definition Language) – Yapı ile ilgili komutlar: CREATE, ALTER, DROP, TRUNCATE
  • DML (Data Manipulation Language) – Veri satırları üzerinde işlem: SELECT, INSERT, UPDATE, DELETE
  • DCL (Data Control Language) – Yetkilendirme: GRANT, REVOKE
  • TCL (Transaction Control Language) – Transaction yönetimi: COMMIT, ROLLBACK, SAVEPOINT

Soru 3: PRIMARY KEY, UNIQUE ve FOREIGN KEY arasındaki fark nedir?

Cevap:

  • PRIMARY KEY
    Tablodaki her satırı benzersiz tanımlar. NULL olamaz. Bir tabloda genellikle yalnızca bir adet primary key bulunur.
  • UNIQUE
    Sütundaki değerlerin benzersiz olmasını zorunlu kılar. Çoğu sistemde NULL kabul edebilir. Bir tabloda birden fazla UNIQUE kısıt olabilir.
  • FOREIGN KEY
    Bir tablodaki sütunun, başka bir tablodaki PRIMARY KEY veya UNIQUE bir sütuna referans vermesini sağlar. Veri bütünlüğünü korur (örneğin: olmayan müşteri_id’ye satış yazılmasını engeller).

Soru 4: WHERE ile HAVING arasındaki fark nedir?

Kısa cevap:

  • WHERE – Satırları gruplanmadan önce filtreler.
  • HAVINGGROUP BY sonrası gruplar üzerinde filtre uygular.

Örnek:

SELECT customer_id,
       SUM(order_amount) AS total_amount
FROM orders
WHERE order_date >= '2025-01-01'   -- satır filtresi
GROUP BY customer_id
HAVING SUM(order_amount) > 1000;   -- grup filtresi
  

Burada WHERE tarih bazlı kayıtları eler, HAVING ise toplam tutarı 1000’in altında olan müşterileri çıkarır.


3. Temel Sorgu Yazma Soruları

Soru 5: Bir tablodaki tüm sütunları ve belirli sütunları nasıl seçersiniz?

-- Tüm sütunlar
SELECT * 
FROM employees;

-- Belirli sütunlar
SELECT first_name, last_name, salary 
FROM employees;
  

Mülakatta genelde şundan bahsetmek avantaj sağlar: SELECT * yerine sadece ihtiyaç olan sütunları seçmek, performans ve okunabilirlik açısından çok daha iyidir.

Soru 6: LIKE, BETWEEN, IN, IS NULL örnekleri

-- LIKE: belirli bir paterni yakalamak
SELECT *
FROM customers
WHERE email LIKE '%@gmail.com';

-- BETWEEN: aralık
SELECT *
FROM orders
WHERE order_date BETWEEN '2025-01-01' AND '2025-01-31';

-- IN: belirli değer listesi
SELECT *
FROM products
WHERE category IN ('Books', 'Electronics');

-- IS NULL: NULL kontrolü
SELECT *
FROM employees
WHERE manager_id IS NULL;
  

Not: = NULL yerine her zaman IS NULL kullanılmalıdır.


4. JOIN Soruları (Klasik Mülakat Soruları)

Soru 7: INNER / LEFT / RIGHT / FULL JOIN farkı nedir?

Özet:

  • INNER JOIN – İki tabloda da eşleşen kayıtları getirir.
  • LEFT JOIN – Soldaki tüm satırlar + sağda eşleşenler; eşleşmeyenler için sağ tarafta NULL.
  • RIGHT JOIN – Sağdaki tüm satırlar + solda eşleşenler.
  • FULL OUTER JOIN – Her iki tablodan da tüm satırlar; eşleşmeyen taraf NULL ile dolar.

Örnek (INNER vs LEFT):

-- Sadece siparişi olan müşteriler (INNER JOIN)
SELECT c.customer_id, c.customer_name, o.order_id
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;
  
-- Tüm müşteriler + varsa siparişleri (LEFT JOIN)
SELECT c.customer_id, c.customer_name, o.order_id
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;
  

Mülakatta şu senaryo cümlesi çok iş görür: "Tüm müşterileri görmek istiyorsam LEFT JOIN, sadece siparişi olan müşteriler için INNER JOIN kullanırım."

Soru 8: SELF JOIN nedir, ne zaman kullanılır?

Cevap:

Bir tablonun kendisiyle join olmasıdır. Özellikle:

  • Çalışan–yönetici ilişkisi gibi hiyerarşik yapılarda
  • Aynı varlığın farklı zaman kayıtlarını karşılaştırırken
-- Çalışan ve yöneticisinin adını aynı satırda göster
SELECT e.employee_id,
       e.name AS employee_name,
       m.name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
  

5. GROUP BY ve Toplama (Aggregation) Soruları

Soru 9: Her müşterinin toplam sipariş tutarını bulun.

SELECT customer_id,
       SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id;
  

Burada mülakatçı genelde GROUP BY mantığını bilip bilmediğine bakar: SELECT içinde agregasyon (SUM, COUNT vb.) dışında kalan tüm sütunlar GROUP BY içinde olmalıdır.

Soru 10: Toplam siparişi 1000’den fazla olan müşterileri listeleyin.

SELECT customer_id,
       SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(order_amount) > 1000;
  

Burada HAVING kullanımını bilinçli olarak açıklamak önemli: "WHERE agregasyon öncesi, HAVING agregasyon sonrası filtre için kullanılır."


6. Alt Sorgular (Subquery) ve CTE Soruları

Soru 11: Alt sorgu (subquery) nedir? Türleri nelerdir?

Cevap özeti:

  • Alt sorgu, başka bir sorgunun içinde çalışan sorgudur.
  • İki temel türü vardır:
    • Bağımlı (correlated) subquery: Dış sorgudaki her satır için tekrar çalışır.
    • Bağımsız (non-correlated) subquery: Dış sorgudan bağımsız çalışır, çıktısı dış sorguda kullanılır.

Örnek: En yüksek maaşı alan çalışan(lar)

SELECT *
FROM employees
WHERE salary = (
    SELECT MAX(salary)
    FROM employees
);
  

Soru 12: CTE (Common Table Expression) nedir, subquery’den farkı ne?

Cevap:

CTE, sorgunun başında WITH ifadesiyle tanımlanan ve sadece o sorgu içinde kullanılan geçici, isimlendirilmiş bir sonuç kümesidir.

  • Okunabilirliği artırır.
  • Aynı alt sorguyu tekrar tekrar yazma ihtiyacını azaltır.
  • Özellikle rekürsif (özyinelemeli) sorgularda çok kullanışlıdır.
WITH sales_per_customer AS (
    SELECT customer_id,
           SUM(order_amount) AS total_amount
    FROM orders
    GROUP BY customer_id
)
SELECT *
FROM sales_per_customer
WHERE total_amount > 1000;
  

Mülakatta şu cümle çok iyi durur: "Karmaşık nested subquery yerine CTE kullanmayı tercih ediyorum; hem okunabilirlik hem de bakım açısından daha iyi."


7. Window (Pencere) Fonksiyonları Soruları

Soru 13: Window fonksiyonu nedir?

Kısa cevap:

Window fonksiyonları, satırları gruplamadan, her satır için kendi penceresi üzerinden hesaplama yapmaya izin verir. OVER() ile kullanılır.

Örnek: Her müşterinin toplam satışını, satırları kaybetmeden görmek

SELECT
    customer_id,
    order_id,
    order_amount,
    SUM(order_amount) OVER (PARTITION BY customer_id) AS total_per_customer
FROM orders;
  

Soru 14: ROW_NUMBER, RANK ve DENSE_RANK farkı nedir?

SELECT
    employee_id,
    salary,
    ROW_NUMBER()  OVER (ORDER BY salary DESC) AS rn,
    RANK()        OVER (ORDER BY salary DESC) AS rnk,
    DENSE_RANK()  OVER (ORDER BY salary DESC) AS drnk
FROM employees;
  

Farklar:

  • ROW_NUMBER: Her satıra sırayla numara verir, eşit maaşlarda bile numara atlamaz.
  • RANK: Eşit değerler aynı rütbeyi alır, bir sonraki rütbe atlayarak gelir (1, 2, 2, 4 gibi).
  • DENSE_RANK: Eşit değerler aynı rütbeyi alır, ancak rütbe atlanmaz (1, 2, 2, 3 gibi).

Soru 15: LAG ve LEAD ne işe yarar?

Zaman serisi ve önceki/sonraki satır karşılaştırmaları için klasik fonksiyonlardır.

SELECT
    order_date,
    order_amount,
    LAG(order_amount)  OVER (ORDER BY order_date) AS prev_amount,
    LEAD(order_amount) OVER (ORDER BY order_date) AS next_amount
FROM daily_sales;
  

LAG bir önceki satırdaki değeri, LEAD bir sonraki satırdaki değeri getirir. Günlük değişim, önceki aya göre fark gibi analizlerde sık kullanılır.


8. Duplike Kayıtlar ve Veri Kalitesi Soruları

Soru 16: Bir tabloda duplike kayıtları nasıl bulursunuz?

Örneğin email alanı benzersiz olmalı ama tabloda tekrarlar var diyelim:

SELECT email,
       COUNT(*) AS cnt
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
  

Devam sorusu olarak bu duplikeleri nasıl temizleyeceğin sorulabilir. Çoğu senaryoda CTE + ROW_NUMBER kullanarak, her grupta ilk kaydı bırakıp diğerlerini siliyoruz.


9. Performans ve İndeks Soruları

Soru 17: Yavaş çalışan bir sorguyu hızlandırmak için neler yaparsınız?

Burada beklenen ileri seviye tuning değil, temel farkındalıktır:

  • Sık filtrelenen veya join yapılan sütunlara uygun indeks eklemek
  • SELECT * yerine sadece gerekli sütunları seçmek
  • Gereksiz iç içe (nested) alt sorguları azaltmak, gerekirse CTE kullanmak
  • EXPLAIN / EXPLAIN ANALYZE ile sorgu planını incelemek
  • Filtreleri veriyi en çok daraltan yerden başlayarak uygulamak

10. Normalizasyon, ACID ve Diğer Teorik Sorular

  • Normalizasyon nedir?
    1NF, 2NF, 3NF gibi kurallarla tablo yapısını düzenleyerek tekrar eden veriyi azaltmak ve veri tutarlılığını artırmak.
  • ACID özellikleri (transactions)
    Atomicity, Consistency, Isolation, Durability.
  • DELETE vs TRUNCATE vs DROP
    DELETE satır bazlı siler; TRUNCATE tabloyu hızlıca boşaltır; DROP tablonun yapısını da siler.

11. Mülakatta SQL Sorularına Cevap Verirken Strateji

Sadece doğru sorguyu yazmak değil, nasıl düşündüğünü göstermek de çok önemli. Özellikle veri analisti / BI rollerinde bu kritik.

Şu adımları yüksek sesle düşünerek anlatmak güçlü bir izlenim bırakır:

  1. Veriyi kafanda canlandır: "Orders tablosu var, içinde customer_id, order_date, amount sütunları var" gibi.
  2. İhtiyacı net tarif et: "Her müşteri için toplam satış ve sadece 1000 üstü olanlar isteniyor" gibi.
  3. Adım adım sorguyu kur: Önce SELECT + FROM, sonra gerekiyorsa JOIN, ardından GROUP BY, HAVING, ORDER BY.
  4. Kenar durumları düşün: NULL değerler, aynı günde birden fazla kayıt, zaman dilimi farkları vb.
  5. Performans bilincini göster: "Üretim ortamında olsak SELECT * yerine sadece gerekli sütunları seçerdim" gibi cümleler kullanmak.

Bu yaklaşım, sadece "kodu ezberlemiş" değil, problemi sistematik çözen aday olduğun izlenimini verir.


12. Sonuç: Bu Sorulara Hakimsen Bir Adım Öndesin

Bu yazıda, iş görüşmelerinde çok sık karşılaşılan SQL sorularını:

  • Temel teori (DDL/DML, key türleri, ACID)
  • Sorgu yazma (SELECT, WHERE, GROUP BY, HAVING)
  • JOIN, subquery, CTE, window fonksiyonları
  • Duplikeler ve performans

başlıkları altında topladık.

Bu sorulara hem "rahatlıkla yazarım" hem de "neden böyle yaptığımı açıklayabilirim" diyorsan, SQL tarafında pek çok mülakatta ciddi avantajın var demektir.

1 Yorumlar

Gülçin SARI

Mon, 13 Apr 2026

Şahane :):):) elinize sağlık.

Yanıtla

Yorum Yaz

Bilgi Bot
Bilgi Akademisi SSS Asistanı
×
Bilgi Bot yazıyor...