محتويات الدورة

PostgreSQL / الأساسي: الأسس العلاقية / الدرس 3

SELECT وترتيب NULL وترقيم الصفحات

حوّل سؤال الطرود إلى نتيجة حتمية واضبط المنطق وحدود الزمن وربط القيم وموضع NULL الافتراضي في PostgreSQL.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • بناء شروط دقيقة وترتيب مستقر.
  • شرح موضع NULL وحدود مؤشر الصفحات.

حدد الصفوف والأعمدة والترتيب

يختار الإسقاط الأعمدة وتحدد WHERE الصفوف ولا يضمنان ترتيب العرض. قد تغير فهرسة أو خطة متوازية أو تخزين ترتيب PostgreSQL. اكتب ORDER BY وأضف كاسر تعادل فريداً قبل LIMIT أو المؤشر. تجنب SELECT * لواجهة مستقرة لأن الأعمدة الجديدة تغير شكلها وقد تكشف بيانات غير لازمة. اربط قيم المستخدم بالموصل وحدد الأسماء والفرز بقائمة مسموحة.

صرح بموضع NULL

تضع PostgreSQL NULL افتراضياً فوق القيم غير الفارغة: تكون أخيرة تصاعدياً وأولى تنازلياً، خلاف افتراضات بعض الأنظمة. تطلب العينة رسوماً تنازلية مع NULLS LAST ثم parcel_id للتعادل. المعرفات المتوقعة 2 و1 و3. الرسم NULL مجهول وليس طرداً غالياً؛ يوضح الترتيب المطلوب معنى التقرير بدلاً من الاتكال على الافتراض.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
SELECT parcel_id, fee FROM (VALUES
 (1, 20::numeric), (2, 30::numeric), (3, NULL::numeric)
) AS p(parcel_id, fee)
ORDER BY fee DESC NULLS LAST, parcel_id;
الناتج المتوقع
parcel_id | fee
2         | 30
1         | 20
3         | NULL

دون NULLS LAST يأتي صف NULL أولاً مع DESC في PostgreSQL.

يغير المنطق المجهول التصفية

تحتفظ WHERE بـ true وتسقط false وunknown. لذلك لا تجد fee = NULL الرسوم الغائبة. استخدم IS NULL وIS NOT DISTINCT FROM لمساواة تعد NULLين متساويتين. تسبق AND العامل OR فاستخدم الأقواس. قد تصبح NOT IN مجهولة عند وجود NULL في المجموعة؛ غالباً توضح NOT EXISTS المرتبطة الاستبعاد. اختبر الوجود والغياب.

استخدم مجالاً زمنياً نصف مفتوح

ليوم من لحظات UTC استخدم بداية شاملة وبداية اليوم التالي غير شاملة، ولا تخمن آخر كسر ثانية. العبارة نمط لجدول shipments تدريبي وليست عينة كاملة للتشغيل. يستخدم المؤشر معرفاً متزايداً ولذلك يرتب به التقرير. إذا رتبت بـ created_at وshipment_id وجب مقارنة الزوج المرتب كاملاً وتحديد التعامل مع الفراغ.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
SELECT shipment_id, created_at FROM quay_lab.shipments
WHERE created_at >= timestamptz '2026-10-01 00:00:00+00'
  AND created_at < timestamptz '2026-10-02 00:00:00+00'
  AND shipment_id > 100
ORDER BY shipment_id LIMIT 20;

تعتمد الصفوف على العينة وتمنع الإزاحات الصريحة تفسير الحدود بمنطقة الجلسة دون قصد.

لمطابقة الأنماط عقدها الخاص

تستخدم LIKE النسبة المئوية والشرطة السفلية للأنماط، فتحتاج الشرطة الحرفية هروباً مقصوداً. توفر ILIKE مطابقة غير حساسة للحالة حسب البيئة وليست سياسة عامة لتوحيد Unicode. يؤثر الترتيب في المقارنة والفرز. لا تصلح الهوية بخفض كل النصوص بصمت؛ حدد المعنى ثم الفهرسة المناسبة. يحد LIMIT النتائج لا الصفوف المفحوصة ولا صلاحية الوصول.

الأخطاء الشائعة وإصلاحها

تظهر الرسوم المجهولة أولاً في التقرير التنازلي

لماذا يحدث؟
افتراض DESC في PostgreSQL هو NULLS FIRST.
كيف تصلحه؟
صرح بـ NULLS LAST أو NULLS FIRST المقصودة.
كيف تتجنب تكراره؟
ضمّن NULL في عينات الفرز والصفحات.

تتكرر الصفوف بين الصفحات

لماذا يحدث؟
يفتقد الترتيب كاسر تعادل أو يهمل المؤشر مكوناً.
كيف تصلحه؟
استخدم ترتيباً كلياً وشرط مؤشر مطابقاً كاملاً.
كيف تتجنب تكراره؟
اختبر التعادل والحدود والتغييرات المتزامنة.

لا يعيد الاستبعاد نتائج خلاف المتوقع

لماذا يحدث؟
جعلت NULL في NOT IN المقارنات مجهولة.
كيف تصلحه؟
حدد سياسة NULL أو استخدم NOT EXISTS مرتبطة.
كيف تتجنب تكراره؟
راجع المنطق ثلاثي القيم ولا تفترض قيمتين فقط.

اختبر فهمك

1. الرسوم NULL و10 و20. ما نتيجة ORDER BY fee DESC الافتراضية وكيف تجعل المجهول أخيراً؟

اعرض الحل المشروح

الترتيب الافتراضي NULL ثم 20 ثم 10. اكتب ORDER BY fee DESC NULLS LAST للحصول على 20 ثم 10 ثم NULL وأضف معرفاً مستقراً للتعادل. يغير ذلك العرض فقط لا معنى NULL ولا صحة المقارنة معها.

2. قد يكون الوقت 23:59:59.750000. أصلح شرط يوم UTC ينتهي بـ <= 23:59:59.

اعرض الحل المشروح

اجعل البداية شاملة والنهاية قبل منتصف الليل التالي مع إزاحة UTC صريحة. يشمل ذلك السجل الكسري دون حد دقة مختلق. تحقق من أن العمود يمثل لحظات لا ساعة محلية. قد يختلف مجال يوم محلي حول التوقيت الصيفي فاشتقه من المنطقة المطلوبة.

أهم ما تعلمته

  • ترتيب NULL دلالة تقرير صريحة في PostgreSQL.
  • يدعم الترتيب المستقر والمعاملات والحدود الكاملة القراءة الموثوقة.

المراجع الرسمية