0Pricing
SQL Interview Prep · درس

الترتيب حسب عدة أعمدة ووضع NULL

خلط ASC وDESC وكيف يختلف NULLS FIRST وNULLS LAST بين قواعد البيانات

الترتيب حسب عدة أعمدة ووضع NULL درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.

لماذا تظهر عملية الترتيب في المقابلات

يلجأ المحاورون إلى ORDER BY مبكرًا لأنه يكشف مدى فهمك أن مجموعة نتائج SQL غير مرتبة افتراضيًا. فمن دون ترتيب صريح، تكون قاعدة البيانات حرة في إعادة الصفوف بأي ترتيب تريده.

من الأسئلة الافتتاحية الشائعة: «كيف تضمن إعادة الصفوف بترتيب محدد؟» والإجابة الصحيحة الوحيدة هي استخدام جملة ORDER BY صريحة. فالاعتماد على ترتيب الإدراج أو ترتيب المفتاح الأساسي أو ترتيب الفهرس خطأ شائع لدى المبتدئين.

ستتقن في هذا الدرس الترتيب باستخدام عدة أعمدة، والسؤال الدقيق عن موضع قيم NULL.

أساسيات ASC وDESC

تُرتّب ORDER BY تصاعديًا (ASC) افتراضيًا. ولا تحتاج إلى DESC إلا لعكس الاتجاه. وينطبق الاتجاه على كل عمود على حدة، لا على الجملة بأكملها.

نصيحة للمقابلة: اذكر أن ASC هو الإعداد الافتراضي الضمني، ولذلك لا حاجة إلى كتابته. فكثير من المرشحين يعتقدون خطأً أن كتابة DESC واحدة تعكس اتجاه كل الأعمدة.

SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;

الترتيب باستخدام عدة أعمدة

اكتب عدة أعمدة تفصل بينها فواصل. ترتّب SQL حسب العمود الأول، ثم تكسر حالات التعادل باستخدام العمود الثاني، وهكذا. فكّر في ذلك كسلسلة من قواعد كسر التعادل.

يرتّب المثال الأقسام أبجديًا، ثم يرتّب الرواتب داخل كل قسم من الأعلى إلى الأدنى.

  • الترتيب الأساسي: department تصاعديًا
  • كسر التعادل: salary تنازليًا
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;

الجمع بين ASC وDESC

هذا فخ شائع في المقابلات: لكل عمود اتجاهه الخاص. فكتابة ORDER BY a, b DESC ترتّب a تصاعديًا وb تنازليًا، وليس العمودين تنازليًا.

إذا أردت ترتيب العمودين تنازليًا، فعليك كتابة ORDER BY a DESC, b DESC. كن صريحًا عندما يجمع السؤال بين اتجاهات مختلفة.

SELECT region, sales_year, revenue
FROM sales
ORDER BY region ASC, sales_year DESC;

أين تذهب قيم NULL؟

هذه هي النقطة المحورية في الدرس. تعني NULL أن القيمة مجهولة، ولذلك لا يفرض المعيار موضعًا محددًا لها، كما أن قواعد البيانات تختلف في الإعداد الافتراضي:

  • PostgreSQL وOracle: تُرتَّب قيم NULL في ASC أخيرًا، وفي DESC أولًا.
  • MySQL وSQL Server: تُرتَّب قيم NULL في ASC أولًا، وفي DESC أخيرًا، إذ تُعامل على أنها أصغر قيمة.

يحب المحاورون طرح السؤال: «أين ستظهر قيم NULL في هذا الترتيب؟» والإجابة الصادقة هي: يعتمد ذلك على المحرك، ما لم تتحكم فيه صراحةً.

التحكم الصريح في موضع NULL

لجعل الموضع حتميًا بغض النظر عن الإعدادات الافتراضية للمحرك، استخدم NULLS FIRST أو NULLS LAST. تدعم PostgreSQL وOracle وSQLite ذلك مباشرةً.

يفرض الاستعلام التالي وضع تواريخ التعيين المجهولة في الأسفل، رغم أن العمود مرتّب تصاعديًا.

SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC NULLS LAST;

محاكاة NULLS LAST في MySQL

لا تدعم MySQL الكلمة المفتاحية NULLS LAST. والحل البديل القابل للنقل بين الأنظمة هو استخدام مفتاح ترتيب أولي يحدد ما إذا كانت القيمة NULL.

يعيد التعبير hire_date IS NULL القيمة 0 للتواريخ الفعلية والقيمة 1 لقيم NULL. ويؤدي ترتيبه تصاعديًا إلى دفع قيم NULL إلى النهاية، ثم يرتّب المفتاح الثاني التواريخ الفعلية.

SELECT name, hire_date
FROM employees
ORDER BY (hire_date IS NULL) ASC, hire_date ASC;

محاكاة NULLS FIRST في SQL Server

لا تدعم SQL Server أيضًا NULLS FIRST/LAST. استخدم تعبير CASE كمفتاح ترتيب أولي. هنا تحصل قيم NULL على الرتبة 0، ولذلك تظهر أولًا.

يستحق هذا النمط الحفظ: فوضع عمود علامة محسوب قبل عمود الترتيب الفعلي يمنحك تحكمًا كاملًا في موضع NULL في أي لهجة.

SELECT name, hire_date
FROM employees
ORDER BY CASE WHEN hire_date IS NULL THEN 0 ELSE 1 END,
         hire_date ASC;

مثال تطبيقي: لوحة المتصدرين

لنفترض أنك تنشئ لوحة متصدرين: تظهر أعلى نتيجة أولًا، وعند تعادل النتائج يحتل اللاعب الذي سجّل أولًا ترتيبًا أعلى. أما اللاعبون الذين لم يسجلوا أي نتيجة، أي أصحاب النتيجة NULL، فينتمون إلى أسفل القائمة.

يحتاج الترتيب إلى ثلاثة مفاتيح: علامة NULL، والنتيجة تنازليًا، وتاريخ التسجيل تصاعديًا لكسر التعادل.

SELECT player, score, signup_date
FROM players
ORDER BY (score IS NULL) ASC,
         score DESC,
         signup_date ASC;

تنبيه بشأن استقرار الترتيب

من الأسئلة المفضلة أيضًا: «إذا تساوى صفّان في كل مفاتيح ORDER BY، فبأي ترتيب ستتم إعادتهما؟»

الإجابة: غير محدد. فلا يُضمن أن تكون عمليات الترتيب في SQL مستقرة، ولذلك قد تظهر الصفوف المتساوية بأي ترتيب نسبي، وقد يتغير ذلك الترتيب بين تشغيل وآخر أو بعد تغيير أحد الفهارس.

الحل هو إضافة قاعدة كسر تعادل فريدة تمامًا، وعادةً ما تكون المفتاح الأساسي، بحيث تصبح النتيجة قابلة لإعادة الإنتاج.

SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;

ملاحظة أداء حول الترتيب

قد تكون عملية الترتيب مكلفة. فإذا تطابقت ORDER BY مع فهرس موجود مسبقًا من حيث ترتيب الأعمدة واتجاهاتها، يستطيع المحرك قراءة الصفوف مرتبة مسبقًا وتجاوز خطوة الترتيب المنفصلة.

أما اختلاف الاتجاهات، مثل أن يكون الفهرس كله تصاعديًا بينما ترتّب أحد الأعمدة تنازليًا، فعادةً ما يمنع الاستفادة من ذلك، ويفرض ترتيبًا في الذاكرة أو على القرص. وذكر هذه الصلة بين ترتيب الفهرس وتكلفة الترتيب يدل على نضجك المهني أمام المحاور.

اختبار سريع

اختبر فهمك لقواعد الاتجاه عند الترتيب باستخدام عدة أعمدة.

خلاصة

أهم النقاط حول الترتيب باستخدام عدة أعمدة وموضع NULL:

  • مجموعات النتائج غير مرتبة ما لم تضف ORDER BY.
  • يُحدَّد الاتجاه لكل عمود على حدة؛ وASC هو الإعداد الافتراضي.
  • يختلف موضع NULL حسب المحرك: أخيرًا في ASC لدى Postgres/Oracle، وأولًا في ASC لدى MySQL/SQL Server.
  • استخدم NULLS FIRST/LAST حيثما كان مدعومًا، أو استخدم علامة IS NULL / CASE أولية في الأنظمة الأخرى.
  • أضف قاعدة كسر تعادل فريدة، مثل المفتاح الأساسي، للحصول على ترتيب قابل لإعادة الإنتاج.

الأسئلة الشائعة

هل درس «الترتيب حسب عدة أعمدة ووضع NULL» مجاني؟

نعم — نص درس «الترتيب حسب عدة أعمدة ووضع NULL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «الترتيب حسب عدة أعمدة ووضع NULL»؟

خلط ASC وDESC وكيف يختلف NULLS FIRST وNULLS LAST بين قواعد البيانات تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟

لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «الترتيب حسب عدة أعمدة ووضع NULL»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟

نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الترتيب حسب عدة أعمدة ووضع NULL
  2. LIMIT وOFFSET وFETCH FIRST
  3. إرجاع صفوف Top-N بشكل موثوق
  4. الترتيب حسب التعبيرات والأسماء المستعارة
← العودة إلى SQL Interview Prep