تخطَّ إلى المحتوى

ترتيب النتائج في SQL: ORDER BY

الدرس 5 من 12 · SQL

قائمة الطلاب الأوائل، والمنتجات من الأرخص للأغلى، وأحدث الأخبار أولاً: كلها بيانات مرتبة. وفي SQL، الترتيب ليس مضموناً أبداً إلا إذا طلبته صراحة. في هذا الدرس ستتعلم ORDER BY، وكيف تجمعه مع WHERE و LIMIT لتجيب عن أسئلة مثل «من هم أعلى 3 طلاب؟».

سنعمل على نفس جدول الطلاب: سارة (14، 92)، وعمر (15، 78)، ومنى (13، 85)، ويوسف (15، 64)، وليلى (14، بلا درجة)، وأحمد (13، 71).

SELECT name, score FROM students ORDER BY score;

الناتج:

name score
ليلى NULL
يوسف 64
أحمد 71
عمر 78
منى 85
سارة 92

ORDER BY يرتب تصاعدياً افتراضياً: من الأصغر إلى الأكبر. ويمكنك كتابة ASC صراحة (من Ascending) والنتيجة واحدة.

لاحظ أين ظهرت ليلى: في SQLite تأتي NULL أولاً في الترتيب التصاعدي، أي تُعامل كأصغر قيمة. هذا يختلف بين الأنظمة: MySQL مثل SQLite، أما PostgreSQL فتضعها في الآخر.

SELECT name, score FROM students ORDER BY score DESC;

الناتج:

name score
سارة 92
منى 85
عمر 78
أحمد 71
يوسف 64
ليلى NULL

DESC (من Descending) يرتب من الأكبر إلى الأصغر.

من هم الثلاثة الأوائل؟

SELECT name, score FROM students ORDER BY score DESC LIMIT 3;

الناتج:

name score
سارة 92
منى 85
عمر 78

هذا النمط من أكثر الاستعلامات استخداماً: «أحدث 10 رسائل»، و«أرخص 5 منتجات»، و«أكثر 20 فيديو مشاهدة». رتّب أولاً، ثم خذ العدد الذي تحتاجه.

تخيّل ORDER BY مع LIMIT مثل منصة التتويج: ترتّب المتسابقين حسب النتيجة، ثم تصعد بالثلاثة الأوائل فقط.

ماذا لو تساوت القيم؟ أضف عموداً ثانياً للترتيب:

SELECT name, age, score FROM students ORDER BY age DESC, score DESC;

الناتج:

name age score
عمر 15 78
يوسف 15 64
سارة 14 92
ليلى 14 NULL
منى 13 85
أحمد 13 71

الترتيب يتم أولاً بالعمر تنازلياً. وعند تساوي العمر، يُستخدم العمود الثاني: الدرجة تنازلياً. فعمر ويوسف كلاهما 15، لكن عمر جاء أولاً لأن درجته أعلى. ولكل عمود اتجاهه الخاص: يمكنك كتابة ORDER BY age DESC, name ASC.

مثل ترتيب قاموس: أولاً بالحرف الأول، وعند تساويه بالحرف الثاني، وهكذا.

SELECT name FROM students ORDER BY name;

الناتج: أحمد، سارة، عمر، ليلى، منى، يوسف.

النصوص تُرتب أبجدياً. لكن انتبه: الترتيب الأبجدي الدقيق للعربية، مثل التعامل مع الهمزات (أ، إ، ا) والتاء المربوطة، يعتمد على إعدادات الترتيب اللغوي (Collation) في نظام قاعدة البيانات، وقد يختلف قليلاً بين الأنظمة.

الترتيب الكامل للاستعلام

Section titled “الترتيب الكامل للاستعلام”

عند دمج كل ما تعلمته، الترتيب إجباري:

SELECT name, score
FROM students
WHERE city = 'الإسكندرية'
ORDER BY score DESC;

الناتج:

name score
عمر 78
أحمد 71

الترتيب الصحيح للأجزاء: SELECT ← FROM ← WHERE ← ORDER BY ← LIMIT. وقاعدة البيانات تنفّذها منطقياً هكذا: تأخذ الجدول (FROM)، وتصفّيه (WHERE)، ثم ترتب ما تبقى (ORDER BY)، ثم تأخذ العدد المطلوب (LIMIT).

اكتب استعلامات تعرض:

  1. كل الطلاب مرتبين من الأصغر عمراً إلى الأكبر.
  2. أقل طالبين في الدرجات (تجاهل من ليس لديه درجة باستخدام WHERE score IS NOT NULL).
  3. طلاب القاهرة مرتبين أبجدياً بالاسم.
  4. كل الطلاب مرتبين بالمدينة، ثم بالدرجة تنازلياً داخل كل مدينة.
  • وضع ORDER BY قبل WHERE: خطأ صياغة. الترتيب الصحيح: WHERE ثم ORDER BY.
  • LIMIT بدون ORDER BY للحصول على «الأعلى»: ستحصل على صفوف عشوائية لا الأعلى.
  • نسيان أين تظهر NULL: قد تظهر في أول نتيجة «الأقل»، فاستبعدها بـ IS NOT NULL عند الحاجة.

سؤال

أي استعلام يجلب أحدث 5 أخبار من جدول news فيه عمود created_at؟

سؤال

في ORDER BY city, score DESC متى يُستخدم عمود score؟

  • ORDER BY يرتب النتائج، وهو تصاعدي ASC افتراضياً، و DESC للتنازلي.
  • ORDER BY ... LIMIT n يجلب أعلى أو أقل n نتائج.
  • الترتيب بعدة أعمدة: العمود التالي يحسم عند التساوي، ولكل عمود اتجاهه.
  • ترتيب الأجزاء: SELECT ثم FROM ثم WHERE ثم ORDER BY ثم LIMIT.
  • لا ترتيب مضمون بدون ORDER BY، وموقع NULL يختلف بين الأنظمة.