ترتيب النتائج باستخدام ORDER BY في SQL

حتى الآن، تعلمنا كيفية استرجاع وتصفية البيانات من قاعدة البيانات. لكن في كثير من الأحيان، نحتاج إلى عرض النتائج بترتيب معين - من الأصغر إلى الأكبر، أو من الأحدث إلى الأقدم. في هذا الدرس الشامل من سلسلة تعلم لغة SQL باللغة العربية، سنتعلم كيفية استخدام ORDER BY لترتيب النتائج بالطريقة التي نريدها.

1. ما هو ORDER BY في SQL؟

ORDER BY هو جملة تُستخدم لترتيب نتائج الاستعلام بناءً على عمود واحد أو أكثر. يمكنك الترتيب تصاعدياً (من الأصغر إلى الأكبر) أو تنازلياً (من الأكبر إلى الأصغر).

البنية الأساسية
SELECT column1, column2
FROM table_name
ORDER BY column_name [ASC|DESC];
ملاحظة:
  • ASC = Ascending (تصاعدي) - من الأصغر إلى الأكبر
  • DESC = Descending (تنازلي) - من الأكبر إلى الأصغر
  • إذا لم تحدد، الترتيب الافتراضي هو ASC

2. الترتيب التصاعدي (ASC)

لنفترض أن لدينا جدول المنتجات:

جدول products (بدون ترتيب)
+----+------------------+--------+-------+
| id | name             | price  | stock |
+----+------------------+--------+-------+
| 1  | لابتوب Dell      | 3500   | 15    |
| 2  | ماوس لاسلكي      | 50     | 100   |
| 3  | لوحة مفاتيح      | 120    | 50    |
| 4  | شاشة Samsung     | 800    | 25    |
| 5  | سماعات           | 150    | 60    |
+----+------------------+--------+-------+
مثال 1: ترتيب حسب السعر (تصاعدي)
من الأرخص إلى الأغلى
SELECT name, price FROM products
ORDER BY price ASC;
النتيجة (مرتبة)
+------------------+--------+
| name             | price  |
+------------------+--------+
| ماوس لاسلكي      | 50     | ← الأرخص
| لوحة مفاتيح      | 120    |
| سماعات           | 150    |
| شاشة Samsung     | 800    |
| لابتوب Dell      | 3500   | ← الأغلى
+------------------+--------+
5 rows in set
مثال 2: بدون كتابة ASC (نفس النتيجة)
ASC افتراضي
-- هذان الاستعلامان متطابقان
SELECT name, price FROM products ORDER BY price ASC;
SELECT name, price FROM products ORDER BY price;

3. الترتيب التنازلي (DESC)

مثال 1: ترتيب حسب السعر (تنازلي)
من الأغلى إلى الأرخص
SELECT name, price FROM products
ORDER BY price DESC;
النتيجة (مرتبة تنازلياً)
+------------------+--------+
| name             | price  |
+------------------+--------+
| لابتوب Dell      | 3500   | ← الأغلى
| شاشة Samsung     | 800    |
| سماعات           | 150    |
| لوحة مفاتيح      | 120    |
| ماوس لاسلكي      | 50     | ← الأرخص
+------------------+--------+
5 rows in set
مثال 2: ترتيب حسب المخزون
الأكثر مخزوناً أولاً
SELECT name, stock FROM products
ORDER BY stock DESC;
النتيجة
+------------------+-------+
| name             | stock |
+------------------+-------+
| ماوس لاسلكي      | 100   | ← الأكثر
| سماعات           | 60    |
| لوحة مفاتيح      | 50    |
| شاشة Samsung     | 25    |
| لابتوب Dell      | 15    | ← الأقل
+------------------+-------+
5 rows in set

4. الترتيب على أعمدة متعددة

يمكنك الترتيب على أكثر من عمود. سيتم الترتيب حسب العمود الأول، ثم إذا كانت هناك قيم متساوية، سيتم الترتيب حسب العمود الثاني، وهكذا.

جدول students
+----+-----------+-----+--------+--------+
| id | name      | age | city   | grade  |
+----+-----------+-----+--------+--------+
| 1  | أحمد      | 20  | الرياض | A      |
| 2  | فاطمة     | 19  | جدة    | B      |
| 3  | محمد      | 20  | الرياض | B      |
| 4  | سارة      | 19  | مكة    | A      |
| 5  | علي       | 20  | جدة    | A      |
| 6  | نورة      | 19  | الدمام | B      |
+----+-----------+-----+--------+--------+
مثال: ترتيب حسب العمر ثم الاسم
ترتيب متعدد
SELECT name, age, grade FROM students
ORDER BY age ASC, name ASC;
النتيجة
+-----------+-----+--------+
| name      | age | grade  |
+-----------+-----+--------+
| سارة      | 19  | A      | ← عمر 19 (مرتب أبجدياً)
| فاطمة     | 19  | B      | ← عمر 19 (مرتب أبجدياً)
| نورة      | 19  | B      | ← عمر 19 (مرتب أبجدياً)
| أحمد      | 20  | A      | ← عمر 20 (مرتب أبجدياً)
| علي       | 20  | A      | ← عمر 20 (مرتب أبجدياً)
| محمد      | 20  | B      | ← عمر 20 (مرتب أبجدياً)
+-----------+-----+--------+
6 rows in set
مثال: ترتيب مختلط (ASC و DESC)
الدرجة تنازلياً، ثم الاسم تصاعدياً
SELECT name, grade FROM students
ORDER BY grade DESC, name ASC;
النتيجة
+-----------+--------+
| name      | grade  |
+-----------+--------+
| فاطمة     | B      | ← B أولاً (مرتب أبجدياً)
| محمد      | B      | ← B أولاً (مرتب أبجدياً)
| نورة      | B      | ← B أولاً (مرتب أبجدياً)
| أحمد      | A      | ← A ثانياً (مرتب أبجدياً)
| سارة      | A      | ← A ثانياً (مرتب أبجدياً)
| علي       | A      | ← A ثانياً (مرتب أبجدياً)
+-----------+--------+
6 rows in set

5. دمج ORDER BY مع WHERE

يمكنك دمج ORDER BY مع WHERE لتصفية البيانات ثم ترتيبها.

ترتيب الجمل مهم: WHERE يجب أن يأتي قبل ORDER BY
مثال 1: المنتجات الأقل من 500 ريال، مرتبة حسب السعر
WHERE + ORDER BY
SELECT name, price FROM products
WHERE price < 500
ORDER BY price DESC;
النتيجة
+------------------+--------+
| name             | price  |
+------------------+--------+
| سماعات           | 150    | ← الأغلى من المصفاة
| لوحة مفاتيح      | 120    |
| ماوس لاسلكي      | 50     | ← الأرخص من المصفاة
+------------------+--------+
3 rows in set

-- لاحظ: لابتوب (3500) وشاشة (800) لم يظهرا لأنهما >= 500
مثال 2: طلاب من الرياض، مرتبون حسب الدرجة
تصفية + ترتيب
SELECT name, city, grade FROM students
WHERE city = 'الرياض'
ORDER BY grade DESC;
النتيجة
+-----------+--------+--------+
| name      | city   | grade  |
+-----------+--------+--------+
| محمد      | الرياض | B      |
| أحمد      | الرياض | A      |
+-----------+--------+--------+
2 rows in set

6. الترتيب باستخدام رقم العمود

يمكنك استخدام رقم موضع العمود في SELECT بدلاً من اسمه.

استخدام الأرقام
-- هذان الاستعلامان متطابقان
SELECT name, price FROM products ORDER BY price DESC;
SELECT name, price FROM products ORDER BY 2 DESC;
--                                           ↑
--                                  العمود الثاني (price)
نصيحة: استخدام أسماء الأعمدة أفضل من الأرقام لأنه أوضح وأسهل في الصيانة.

7. ترتيب القيم NULL

عند وجود قيم NULL في العمود المُرتب، سلوك الترتيب يختلف حسب نظام قاعدة البيانات:

نظام SQL ASC (تصاعدي) DESC (تنازلي)
MySQL NULL في البداية NULL في النهاية
PostgreSQL NULL في النهاية NULL في البداية
SQL Server NULL في البداية NULL في النهاية
التحكم في موضع NULL
PostgreSQL: NULLS FIRST / NULLS LAST
-- NULL في البداية
SELECT name, discount FROM products
ORDER BY discount ASC NULLS FIRST;

-- NULL في النهاية
SELECT name, discount FROM products
ORDER BY discount ASC NULLS LAST;

8. أمثلة عملية متقدمة

مثال 1: تقرير المبيعات (الأعلى أولاً)
أفضل 5 منتجات مبيعاً
SELECT 
    product_name,
    SUM(quantity) AS total_sold,
    SUM(total_price) AS revenue
FROM sales
GROUP BY product_name
ORDER BY revenue DESC
LIMIT 5;
مثال 2: قائمة الطلاب (الأفضل أولاً)
ترتيب حسب الدرجة ثم الاسم
SELECT name, grade, score FROM students
WHERE score >= 50
ORDER BY grade DESC, score DESC, name ASC;
مثال 3: المنتجات الأقل مخزوناً (تنبيه)
تنبيه نفاد المخزون
SELECT name, stock FROM products
WHERE stock < 30
ORDER BY stock ASC;
مثال 4: أحدث الطلبات
الأحدث أولاً
SELECT order_id, customer_name, order_date, total FROM orders
ORDER BY order_date DESC
LIMIT 10;

9. نصائح وأفضل الممارسات

1. ترتيب الجمل في الاستعلام
الترتيب الصحيح
SELECT column1, column2
FROM table_name
WHERE condition
ORDER BY column_name
LIMIT number;

-- ✓ الترتيب: SELECT → FROM → WHERE → ORDER BY → LIMIT
2. الأداء (Performance)

الترتيب على أعمدة مفهرسة (indexed) أسرع بكثير من الأعمدة غير المفهرسة.

3. استخدم أسماء واضحة
مقارنة
-- سيء: غير واضح
SELECT name, price FROM products ORDER BY 2;

-- جيد: واضح
SELECT name, price FROM products ORDER BY price;
4. حدد ASC أو DESC بوضوح

حتى لو كان ASC هو الافتراضي، من الأفضل كتابته لجعل الكود أكثر وضوحاً.

ملخص الدرس
  • ORDER BY: لترتيب نتائج الاستعلام
  • ASC: ترتيب تصاعدي (من الأصغر إلى الأكبر) - افتراضي
  • DESC: ترتيب تنازلي (من الأكبر إلى الأصغر)
  • أعمدة متعددة: يمكن الترتيب على أكثر من عمود
  • مع WHERE: WHERE يأتي قبل ORDER BY
  • Best Practice: استخدم أسماء الأعمدة بدلاً من الأرقام

الخطوة التالية: تحديد عدد النتائج LIMIT و OFFSET

أكمل رحلتك التعليمية وانتقل إلى الدرس التالي لتعلم تحديد عدد النتائج LIMIT و OFFSET وتطوير مهاراتك في قواعد البيانات.

الانتقال إلى الدرس التالي
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن