MariaDB / الأساسي: الأسس العلاقية / الدرس 4
التصفية والنتائج الحتمية
حوّل سؤال المستودع إلى SELECT دقيق، واضبط القيم المفقودة وأولوية المنطق والترتيب قبل ترقيم الصفحات.
في هذه الصفحة
أهداف الدرس
- تركيب شروط وأعمدة نتائج قابلة للتوقع.
- شرح الترتيب الحتمي والمعاملات الآمنة.
حدد الصفوف والأعمدة المقصودة
يجيب SELECT عن سؤال محدد: ما الشحنات المعلقة التي تكلف عشرين وحدة فأكثر، وما الحقول المطلوبة؟ يختار الإسقاط الأعمدة ويختار WHERE الصفوف. تجنب SELECT * في واجهة التطبيق لأن تغير المخطط يغير شكل النتيجة وقد يكشف بيانات غير لازمة. لا تضمن SQL ترتيب الإدخال أو المفتاح دون ORDER BY؛ لذلك قد يتغير الجزء المعاد بـ LIMIT بعد تغير الخطة.
صفِّ علاقة اصطناعية صغيرة
لا تحتاج عينة الجدول المشتق إلى جدول دائم، وفيها ثلاث حالات ورسوم مختلفة. يختار الاستعلام الخارجي الصفوف المعلقة التي تحقق الحد. توضح الأقواس الاقتران، ويكسر المعرف تعادل الرسوم. تتقدم الشحنة 3 على 1 لأن الفرز تنازلي حسب الرسم. استُنتجت النتيجة من القيم الحرفية ولم تُعرض كسجل تنفيذ على قاعدة معدة.
SELECT shipment_id, fee FROM (
SELECT 1 AS shipment_id, 'pending' AS state, 20 AS fee
UNION ALL SELECT 2, 'sent', 50
UNION ALL SELECT 3, 'pending', 30
) AS s
WHERE state = 'pending' AND (fee >= 20)
ORDER BY fee DESC, shipment_id ASC;
shipment_id | fee
3 | 30
1 | 20
تبقى الصفوف التي تحقق الشرطين فقط، ويحدد ORDER BY ترتيب العرض.
المنطق ثلاثي القيم يحتاج عناية
تسبق AND العامل OR، ولذلك يختلف pending OR urgent AND paid عن (pending OR urgent) AND paid. استخدم الأقواس لإظهار القصد. تعطي المقارنة مع NULL نتيجة مجهولة لا يحتفظ بها WHERE. وقد تضلل NOT IN إذا احتوت قائمتها أو استعلامها NULL فتختفي قيم تبدو غير موجودة. غالباً تعبر NOT EXISTS المرتبطة بعناية عن الاستبعاد بصورة أوضح مع البيانات القابلة للفراغ.
استخدم حدوداً تحافظ على معناها
استخدم مجالاً نصف مفتوح لليوم مع الطوابع التي قد تحتوي كسور الثواني: منذ بدايته وحتى ما قبل اليوم التالي. تتجنب بذلك افتراض أن آخر وقت هو 23:59:59. يستخدم ترقيم الصفحات بالمفتاح آخر مفتاح مرتب بدلاً من تخطي OFFSET متزايد. يفترض المثال معرفات متزايدة ويطلب الصفحة بعد 100؛ تعتمد المعرفات المعادة على بيانات التدريب ولا نختلقها.
SELECT shipment_id, created_at FROM shipments
WHERE created_at >= '2026-10-01 00:00:00'
AND created_at < '2026-10-02 00:00:00'
AND shipment_id > 100
ORDER BY shipment_id LIMIT 20;
هذا نمط استعلام يحتاج عينة shipments ولا يحدد خادماً حقيقياً.
المعاملات تحمل قيماً لا بنية SQL
ينبغي للتطبيق ربط الحالة والحد عبر الموصل بدلاً من لصق إدخال المستخدم في SQL. تمثل المعاملات قيماً، وليست أسماء أعمدة عشوائية أو أجزاء ORDER BY؛ اختر تعبيرات الفرز من قائمة يحددها التطبيق. يحد LIMIT حجم النتيجة ولا يحد بالضرورة العمل الذي يفحصه المحرك. بعد إثبات الصحة، افحص الخطة والفهارس. لا تسرع الاستعلام بإزالة شرط يحدد صلاحية الوصول أو نطاق العمل.
الأخطاء الشائعة وإصلاحها
تكرر الصفحة صفوفاً متعادلة أو تتخطاها
- لماذا يحدث؟
- يفتقر الفرز إلى مفتاح فريد لكسر التعادل.
- كيف تصلحه؟
- أضف مفتاحاً فريداً مستقراً وضمّن مكونات الفرز في المؤشر.
- كيف تتجنب تكراره؟
- اختبر الترقيم مع قيم فرز متكررة وإضافات متزامنة.
لا تعيد NOT IN صفوفاً خلاف المتوقع
- لماذا يحدث؟
- جعلت NULL في مجموعة المقارنة النتيجة مجهولة.
- كيف تصلحه؟
- استبعد NULL بوعي أو استخدم NOT EXISTS مرتبطة بمساواة صحيحة.
- كيف تتجنب تكراره؟
- ضمّن حالات NULL عند مراجعة منطق الاستبعاد.
يقبل البحث SQL محقونة
- لماذا يحدث؟
- لُصق نص غير موثوق باعتباره صياغة للعبارة.
- كيف تصلحه؟
- اربط القيم عبر الموصل وحدد الخيارات البنيوية بقائمة مسموحة.
- كيف تتجنب تكراره؟
- مركز بناء الاستعلام وراجع ORDER BY الديناميكي.
اختبر فهمك
1. لثلاث شحنات معلقة رسوم 30 و30 و20 ومعرفات 4 و7 و8. ما أول صفين مع ORDER BY fee DESC, shipment_id ASC؟
اعرض الحل المشروح
المعرفان 4 ثم 7. يحسم المعرف التصاعدي تعادل الرسم، فتستقر النتيجة ما دامت البيانات ثابتة. لا يضمن الفرز بالرسم وحده أيهما أولاً. وفي مؤشر هذا الفرز المختلط يجب مقارنة الرسم والمعرف معاً لا المعرف وحده.
2. فسر كيف يفقد شرط يوم ينتهي بـ <= 23:59:59 سجلات، ثم أصلحه.
اعرض الحل المشروح
تقع قيمة DATETIME(6) مثل 23:59:59.500000 بعد الحد المذكور. اجعل البداية شاملة والنهاية منتصف الليل التالي غير شامل. يشمل ذلك دقة الكسور المدعومة دون تصنيع آخر ثانية، ويمكن أن يسمح بمجال فهرس مباشر على عمود الوقت.
أهم ما تعلمته
- حدد نطاق الصفوف وترتيباً كاملاً قبل ترقيم الصفحات.
- NULL وأولوية المنطق مسائل صحة وليستا تفاصيل تنسيق.