الدورات › قرارات مبنية على البيانات: من السؤال إلى الجواب

استعلامكم الحقيقي الأول على طلبات Alpenkorb

الدرس 5 من 8 · 13 دقيقة

شكل كل استعلام

لقد شغّلتم استعلامات صغيرة في التمارين الأربعة الأولى. هذا الدرس يضع القطع في ترتيبها، لأن كل استعلام تحليلي تقريباً له نفس الهيكل.

Text
SELECT   columns or calculations
FROM     table
WHERE    conditions on rows
ORDER BY sort columns
LIMIT    number of rows;

ينفّذ SQL الجُمَل بترتيب مختلف عن الترتيب الذي تكتبونها به. أولاً تختار FROM الجدول، ثم تُزيل WHERE الصفوف، ثم تحسب SELECT الأعمدة، ثم تُرتّب ORDER BY وتقطع LIMIT. لهذا لا يمكن لـWHERE أن تُرشّح باسم تنشئونه في SELECT، بينما يمكن لـORDER BY أن تُرتّب به.

فلاتر تناسب العمل

تريد Lena معرفة ما إذا كانت رموز الخصم تشتري سلالاً أكبر. في جدول orders، يحتوي discount_code على رموز مثل WELCOME10 للطلب الأول أو AFFILIATE15 من مواقع الشركاء، ويكون فارغاً عند عدم استخدام أي رمز. في SQL، القيمة الفارغة هي NULL، وتعني غير معروف، وتحتاج اختباراً خاصاً بها.

SQL
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 لن يُرجع أي صف على الإطلاق. مقارنة أي شيء بغير المعروف تعطي غير معروف، وWHERE تُبقي فقط الصفوف التي يكون فيها الشرط صحيحاً. استخدموا بدلاً من ذلك IS NULL وIS NOT NULL.

  • AND تتطلب كل شرط، وOR تتطلب شرطاً واحداً على الأقل. عندما تمزجونهما، أضيفوا أقواساً: WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').
  • IN صيغة مختصرة لعدة عبارات OR: region IN ('Bern', 'Basel').
  • تحتاج مقارنات النصوص إلى علامات اقتباس مفردة والتهجئة الدقيقة. تُكتب المناطق 'Zurich' و'Geneva' و'St. Gallen'.

ثلاثة أخطاء صغيرة تسبب معظم الاستعلامات الأولى الفاشلة. تستخدم القيم النصية علامات اقتباس مفردة: في DuckDB تعني "delivered" بعلامات اقتباس مزدوجة عموداً اسمه delivered، ويفشل الاستعلام. تُكتب التواريخ كنص بصيغة ISO، '2026-01-01'، والتي يقارنها DuckDB بشكل صحيح مع عمود من نوع تاريخ. وفاصلة مفقودة أو زائدة بين الأعمدة تُنتج خطأً نحوياً بالقرب من الكلمة التالية.

فخ الحالة

يحتوي جدول orders على كل طلب قُدّم على الإطلاق، بما في ذلك 67 طلباً ملغى و80 طلباً مرتجعاً. لا يزال net_amount الخاص بها مُعبأً، لأن المبلغ كان معروفاً عند تقديم الطلب. إذا نسيتم status = 'delivered'، تكون الإيرادات مرتفعة جداً. في الربع الأول من 2026 يحوّل هذا الخطأ CHF 37'107.20 إلى CHF 38'787.67. الخطأ أيضاً غير موزَّع بالتساوي: الإلغاءات والمرتجعات أكثر شيوعاً في بعض المصادر منها في غيرها.

ماذا أظهر سؤال الخصم؟ في الربع الأول من 2026، استخدم 90 من أصل 648 طلباً مُسلَّماً رمزاً. كان متوسط قيمتها CHF 57.16، مقابل CHF 57.28 للطلبات بدون رمز. بناءً على هذا الدليل، لا تشتري الرموز سلالاً أكبر. قد لا تزال تكسب عملاء جدداً، وهذا سؤال مختلف يحتاج استعلاماً مختلفاً. قبل الوثوق بأي نتيجة، قارنوا عدد صفوفها برقم تعرفونه بالفعل: أرجع التمرين في الدرس الثاني 648 طلباً مُسلَّماً لهذا الربع، لذا فلتر لنفس الربع لا يمكن أبداً أن يُرجع أكثر من ذلك.

💡 ابنوا الاستعلام على خطوات. ابدؤوا بـSELECT * FROM orders LIMIT 10، أضيفوا فلتراً واحداً، شغّلوه، تحققوا من عدد الصفوف، ثم أضيفوا التالي. استعلام طويل يُكتب دفعة واحدة ويُشغَّل مرة واحدة يخفي أخطاءه.
فحص المعرفة
لماذا لا يُرجع WHERE discount_code = NULL أي صف؟

سجل الدخول للإجابة ومتابعة تقدمك.

تسجيل الدخول
</>
Babala Software Netzwerk — Apps, Websites & KI-Lösungen aus Füllinsdorf BL
© 2026 Babala Özdemir · UID CHE-322.105.560 babala.ch info@babala.ch 076 792 63 50 Facebook Instagram