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;