ترتيب النتائج باستخدام 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)
لنفترض أن لدينا جدول المنتجات:
+----+------------------+--------+-------+
| 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 (نفس النتيجة)
-- هذان الاستعلامان متطابقان
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. الترتيب على أعمدة متعددة
يمكنك الترتيب على أكثر من عمود. سيتم الترتيب حسب العمود الأول، ثم إذا كانت هناك قيم متساوية، سيتم الترتيب حسب العمود الثاني، وهكذا.
+----+-----------+-----+--------+--------+
| 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 ريال، مرتبة حسب السعر
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
-- 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: تقرير المبيعات (الأعلى أولاً)
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 وتطوير مهاراتك في قواعد البيانات.
الانتقال إلى الدرس التالي