Ana içeriğe geç
Kesit SQL
Orta · Küme ve Alt Sorgular

Sorgu hata ayıklama: yanlış sonucu adım adım bulmak

Hata vermeyen ama yanlış sonuç döndüren sorguları bulmak için kontrol sorguları: satır sayısı, anahtar benzersizliği, toplam uzlaştırma ve ara adımları görmek.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Sessiz hatayı yakalamanın yolu: kontrol sorguları

Bir sorgu hata vermiyorsa doğru olduğu anlamına gelmez. Deneyimli analistler sonucu raporlamadan önce birkaç küçük kontrol sorgusu çalıştırır. Bu ders, Lezzet Kurye verisi üzerinde bu alışkanlığı kazandırır.

1. Anahtar gerçekten benzersiz mi?

Bir tabloyu “bir” taraf sanarak birleştirmeden önce anahtarın tekrar etmediğini doğrula:

SELECT order_id, COUNT(*) AS adet
FROM lk_ratings
GROUP BY order_id
HAVING COUNT(*) > 1;

Hiç satır dönmüyorsa her siparişin en fazla bir değerlendirmesi var; siparişlerle güvenle birleştirebilirsin.

2. Her JOIN'den sonra satır sayısı

SELECT
  (SELECT COUNT(*) FROM lk_orders) AS siparis,
  (SELECT COUNT(*) FROM lk_orders o JOIN lk_order_lines ol ON ol.order_id = o.order_id) AS siparis_x_satir,
  (SELECT COUNT(*) FROM lk_orders o LEFT JOIN lk_ratings r ON r.order_id = o.order_id) AS siparis_x_puan;

Siparişleri satırlarla birleştirince sayı artar (fan-out); değerlendirmelerle LEFT JOIN ise sayıyı değiştirmez. Beklediğinden farklı bir sayı, yanlış bir varsayımın işaretidir.

3. Toplamları uzlaştır

Bir kırılımın parçalarının toplamı, kırılımsız toplama eşit olmalıdır. Şehir bazında sipariş sayılarının toplamı tüm sipariş sayısını vermiyorsa, bazı satırlar JOIN'de düşmüş ya da iki kez sayılmıştır:

SELECT SUM(siparis) AS kirilim_toplami, (SELECT COUNT(*) FROM lk_orders) AS genel
FROM (SELECT r.city, COUNT(*) AS siparis
      FROM lk_orders o JOIN lk_restaurants r ON r.restaurant_id = o.restaurant_id
      GROUP BY r.city) t;

4. Ara adımı gör

Uzun bir CTE zincirinde son SELECT'i geçici olarak bir ara adıma çevir: SELECT * FROM adim2 LIMIT 20. Ara sonucun grain düzeyi (bir satır neyi temsil ediyor?) beklediğin gibi mi?

5. Uç değerlere bak

MIN, MAX ve NULL sayısı çoğu veri sorununu hemen gösterir: negatif tutar, gelecekte bir tarih, beklenmedik boşluk.

SELECT MIN(placed_at), MAX(placed_at),
       SUM(CASE WHEN delivered_at < placed_at THEN 1 ELSE 0 END) AS ters_zaman,
       COUNT(*) - COUNT(courier_id) AS kuryesiz
FROM lk_orders;
AlışkanlıkRaporladığın her sayının yanında, onu doğrulayan bir kontrol sorgusu olsun. Mülakatlarda da görüşmeciler bunu ayrıca puanlar.
Alıştırmalara geç (7)