Kurslar › Veriye Dayalı Kararlar: Sorudan Cevaba
Alpenkorb Siparişleri Üzerine İlk Gerçek Sorgunuz
Ders 5 / 8 · 13 dk
Her sorgunun şekli
İlk dört laboratuvarda küçük sorgular çalıştırdınız. Bu ders parçaları sıraya koyar, çünkü neredeyse her analiz sorgusu aynı iskelete sahiptir.
SELECT columns or calculations FROM table WHERE conditions on rows ORDER BY sort columns LIMIT number of rows;
SQL, ifadeleri yazdığınız sıradan farklı bir sırada çalıştırır. Önce FROM tabloyu seçer, sonra WHERE satırları kaldırır, sonra SELECT sütunları hesaplar, sonra ORDER BY sıralar ve LIMIT keser. Bu yüzden WHERE, SELECT'te oluşturduğunuz bir isimle filtreleme yapamazken, ORDER BY ona göre sıralayabilir.
İşe uyan filtreler
Lena, indirim kodlarının daha büyük sepetler satın alıp almadığını bilmek istiyor. orders tablosunda, discount_code ilk sipariş için WELCOME10 veya partner sitelerden AFFILIATE15 gibi kodlar tutar ve hiç kod kullanılmadığında boştur. SQL'de boş bir değer NULL'dur, ki bu bilinmiyor anlamına gelir ve kendi testine ihtiyaç duyar.
SELECT order_id, order_date, source, discount_code, net_amount FROM orders WHERE status = 'delivered' AND discount_code IS NOT NULL AND order_date >= '2026-01-01' ORDER BY net_amount DESC LIMIT 3;
discount_code = NULL hiçbir satır döndürmezdi. Herhangi bir şeyi bilinmiyor ile karşılaştırmak bilinmiyor sonucunu verir ve WHERE yalnızca koşulun true olduğu satırları tutar. Bunun yerine IS NULL ve IS NOT NULL kullanın.
ANDher koşulu gerektirir,ORise en az birini. Bunları karıştırdığınızda parantez ekleyin:WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').IN, birkaçORiçin kısa bir biçimdir:region IN ('Bern', 'Basel').- Metin karşılaştırmaları tek tırnak ve tam yazım gerektirir. Bölgeler
'Zurich','Geneva've'St. Gallen'şeklinde yazılır.
Çoğu başarısız ilk sorguya üç küçük hata neden olur. Metin değerleri tek tırnak kullanır: DuckDB'de çift tırnak içindeki "delivered", delivered adında bir sütun anlamına gelir ve sorgu başarısız olur. Tarihler ISO biçiminde metin olarak yazılır, '2026-01-01', ki DuckDB bunu bir tarih sütunuyla doğru şekilde karşılaştırır. Sütunlar arasında eksik veya fazladan bir virgül, bir sonraki kelimenin yanında bir sözdizimi hatası üretir.
Status tuzağı
orders tablosu, 67 iptal edilmiş ve 80 iade edilmiş olan dahil, şimdiye kadar verilmiş her siparişi içerir. Sipariş verildiğinde tutar bilindiği için net_amount'ları hâlâ doldurulmuştur. status = 'delivered''ı unutursanız, gelir çok yüksek çıkar. 2026'nın ilk çeyreğinde bu hata CHF 37'107.20'yi CHF 38'787.67'ye dönüştürür. Hata eşit şekilde dağılmaz da: iptaller ve iadeler bazı kaynaklarda diğerlerinden daha sıktır.
İndirim sorusu ne gösterdi? 2026'nın ilk çeyreğinde, 648 teslim edilmiş siparişten 90'ı bir kod kullandı. Ortalama değerleri, kodu olmayan siparişler için CHF 57.28'e karşılık CHF 57.16 idi. Bu kanıta göre kodlar daha büyük sepetler satın almaz. Yine de yeni müşteriler kazanıyor olabilirler, ki bu farklı bir soru ve farklı bir sorgu gerektirir. Herhangi bir sonuca güvenmeden önce, satır sayısını zaten bildiğiniz bir sayıyla karşılaştırın: 2. dersteki laboratuvar bu çeyrek için 648 teslim edilmiş sipariş döndürdü, bu yüzden aynı çeyrekteki bir filtre asla daha fazlasını döndüremez.
SELECT * FROM orders LIMIT 10 ile başlayın, bir filtre ekleyin, çalıştırın, satır sayısını kontrol edin, sonra bir sonrakini ekleyin. Tek seferde yazılıp bir kez çalıştırılan uzun bir sorgu, hatalarını gizler.WHERE discount_code = NULL neden hiçbir satır döndürmez?Cevaplamak ve ilerlemeyi izlemek için giriş yap.
Giriş Yap