ترتيب النتائج في SQL: ORDER BY
قائمة الطلاب الأوائل، والمنتجات من الأرخص للأغلى، وأحدث الأخبار أولاً: كلها بيانات مرتبة. وفي SQL، الترتيب ليس مضموناً أبداً إلا إذا طلبته صراحة. في هذا الدرس ستتعلم ORDER BY، وكيف تجمعه مع WHERE و LIMIT لتجيب عن أسئلة مثل «من هم أعلى 3 طلاب؟».
سنعمل على نفس جدول الطلاب: سارة (14، 92)، وعمر (15، 78)، ومنى (13، 85)، ويوسف (15، 64)، وليلى (14، بلا درجة)، وأحمد (13، 71).
الترتيب التصاعدي
Section titled “الترتيب التصاعدي”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 فتضعها في الآخر.
الترتيب التنازلي: DESC
Section titled “الترتيب التنازلي: DESC”SELECT name, score FROM students ORDER BY score DESC;الناتج:
| name | score |
|---|---|
| سارة | 92 |
| منى | 85 |
| عمر | 78 |
| أحمد | 71 |
| يوسف | 64 |
| ليلى | NULL |
DESC (من Descending) يرتب من الأكبر إلى الأصغر.
أعلى N: ORDER BY مع LIMIT
Section titled “أعلى N: ORDER BY مع LIMIT”من هم الثلاثة الأوائل؟
SELECT name, score FROM students ORDER BY score DESC LIMIT 3;الناتج:
| name | score |
|---|---|
| سارة | 92 |
| منى | 85 |
| عمر | 78 |
هذا النمط من أكثر الاستعلامات استخداماً: «أحدث 10 رسائل»، و«أرخص 5 منتجات»، و«أكثر 20 فيديو مشاهدة». رتّب أولاً، ثم خذ العدد الذي تحتاجه.
تخيّل ORDER BY مع LIMIT مثل منصة التتويج: ترتّب المتسابقين حسب النتيجة، ثم تصعد بالثلاثة الأوائل فقط.
الترتيب بأكثر من عمود
Section titled “الترتيب بأكثر من عمود”ماذا لو تساوت القيم؟ أضف عموداً ثانياً للترتيب:
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.
مثل ترتيب قاموس: أولاً بالحرف الأول، وعند تساويه بالحرف الثاني، وهكذا.
ترتيب النصوص
Section titled “ترتيب النصوص”SELECT name FROM students ORDER BY name;الناتج: أحمد، سارة، عمر، ليلى، منى، يوسف.
النصوص تُرتب أبجدياً. لكن انتبه: الترتيب الأبجدي الدقيق للعربية، مثل التعامل مع الهمزات (أ، إ، ا) والتاء المربوطة، يعتمد على إعدادات الترتيب اللغوي (Collation) في نظام قاعدة البيانات، وقد يختلف قليلاً بين الأنظمة.
الترتيب الكامل للاستعلام
Section titled “الترتيب الكامل للاستعلام”عند دمج كل ما تعلمته، الترتيب إجباري:
SELECT name, scoreFROM studentsWHERE city = 'الإسكندرية'ORDER BY score DESC;الناتج:
| name | score |
|---|---|
| عمر | 78 |
| أحمد | 71 |
الترتيب الصحيح للأجزاء: SELECT ← FROM ← WHERE ← ORDER BY ← LIMIT. وقاعدة البيانات تنفّذها منطقياً هكذا: تأخذ الجدول (FROM)، وتصفّيه (WHERE)، ثم ترتب ما تبقى (ORDER BY)، ثم تأخذ العدد المطلوب (LIMIT).
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب استعلامات تعرض:
- كل الطلاب مرتبين من الأصغر عمراً إلى الأكبر.
- أقل طالبين في الدرجات (تجاهل من ليس لديه درجة باستخدام
WHERE score IS NOT NULL). - طلاب القاهرة مرتبين أبجدياً بالاسم.
- كل الطلاب مرتبين بالمدينة، ثم بالدرجة تنازلياً داخل كل مدينة.
أخطاء شائعة
Section titled “أخطاء شائعة”- وضع ORDER BY قبل WHERE: خطأ صياغة. الترتيب الصحيح:
WHEREثمORDER BY. - LIMIT بدون ORDER BY للحصول على «الأعلى»: ستحصل على صفوف عشوائية لا الأعلى.
- نسيان أين تظهر NULL: قد تظهر في أول نتيجة «الأقل»، فاستبعدها بـ
IS NOT NULLعند الحاجة.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي استعلام يجلب أحدث 5 أخبار من جدول news فيه عمود created_at؟
الأحدث يعني أكبر تاريخ، فنرتب تنازلياً بـ DESC ثم نأخذ أول 5.
سؤال
في ORDER BY city, score DESC متى يُستخدم عمود score؟
العمود الثاني يحسم الترتيب بين الصفوف التي تتساوى في العمود الأول.
الخلاصة
Section titled “الخلاصة”ORDER BYيرتب النتائج، وهو تصاعديASCافتراضياً، وDESCللتنازلي.ORDER BY ... LIMIT nيجلب أعلى أو أقل n نتائج.- الترتيب بعدة أعمدة: العمود التالي يحسم عند التساوي، ولكل عمود اتجاهه.
- ترتيب الأجزاء:
SELECTثمFROMثمWHEREثمORDER BYثمLIMIT. - لا ترتيب مضمون بدون
ORDER BY، وموقعNULLيختلف بين الأنظمة.