طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 121 · مبادئ قواعد البيانات
الدرس 16 · الوحدة 7: استرجاع وتحليل البيانات

الترتيب والتصفية المتقدمة

نرتب النتائج، ونبحث بجزء من النص، ونتعامل مع الفراغ. ⏱ نحو 30 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • ترتب النتيجة بعمود أو أكثر تصاعديًّا وتنازليًّا.
  • تحدد عدد الصفوف بـ LIMIT و OFFSET، وتحذف التكرار بـ DISTINCT.
  • تصفّي بـ IN و BETWEEN و LIKE.
  • تتعامل مع NULL بـ IS NULL و COALESCE.

١الترتيب: ORDER BY

بلا ORDER BY لا يضمن النظام أي ترتيب للنتيجة. نرتب تصاعديًّا ASC (الافتراضي) أو تنازليًّا DESC:

query.sql
SELECT name, priceFROM productsORDER BY price DESC;
النتيجة · 12 صفًّا
nameprice
عسل سدر 500غ150
مبخرة120
تمر عجوة 1كغ90
دلة قهوة75
عسل زهور 500غ60
زعفران 5غ55
تمر سكري 1كغ45
فناجين (6 قطع)40
قهوة عربية 250غ35
هيل 100غ28
شاي أخضر18
ماء زمزم 5لتر12

وبأكثر من عمود: يُرتَّب بالأول، وعند التساوي بالثاني:

query.sql
SELECT name, category, priceFROM productsORDER BY category, price DESC;
النتيجة · 12 صفًّا
namecategoryprice
مبخرةأدوات120
دلة قهوةأدوات75
فناجين (6 قطع)أدوات40
زعفران 5غبهارات55
هيل 100غبهارات28
تمر عجوة 1كغتمور90
تمر سكري 1كغتمور45
عسل سدر 500غعسل150
عسل زهور 500غعسل60
قهوة عربية 250غمشروبات35
شاي أخضرمشروبات18
ماء زمزم 5لترمشروبات12

ORDER BY تأتي في آخر الاستعلام، وتُنفَّذ بعد SELECT، فيمكن أن ترتب بالاسم المستعار.

٢أول N صفوف: LIMIT

query.sql
-- أغلى 3 منتجاتSELECT name, priceFROM productsORDER BY price DESCLIMIT 3;
النتيجة · 3 صفوف
nameprice
عسل سدر 500غ150
مبخرة120
تمر عجوة 1كغ90

و OFFSET تتخطى صفوفًا، وهي أساس «الصفحات» في المواقع (الصفحة الثانية = تخطَّ 5، وخذ 5):

query.sql
SELECT id, name FROM productsORDER BY idLIMIT 5 OFFSET 5;
النتيجة · 5 صفوف
idname
6عسل زهور 500غ
7دلة قهوة
8فناجين (6 قطع)
9هيل 100غ
10زعفران 5غ

٣حذف التكرار: DISTINCT

query.sql
SELECT DISTINCT city FROM customers;
النتيجة · 6 صفوف
city
المدينة المنورة
الرياض
جدة
الدمام
تبوك
NULL

كل مدينة مرة واحدة. ولاحظ أن NULL (لمى بلا مدينة) ظهرت قيمةً مستقلة.

٤قائمة ونطاق: IN و BETWEEN

IN تختصر سلسلة OR على العمود نفسه:

query.sql
SELECT name, city FROM customersWHERE city IN ('جدة', 'الدمام', 'تبوك');
النتيجة · 4 صفوف
namecity
ريم الشهريجدة
سارة المطيريالدمام
عبدالله الزهرانيجدة
ماجد الغامديتبوك

و BETWEEN لنطاق يشمل الطرفين:

query.sql
SELECT name, price FROM productsWHERE price BETWEEN 40 AND 75;
النتيجة · 5 صفوف
nameprice
تمر سكري 1كغ45
عسل زهور 500غ60
دلة قهوة75
فناجين (6 قطع)40
زعفران 5غ55

يشمل 40 و 75 نفسيهما. ويساوي: price >= 40 AND price <= 75.

query.sql
SELECT id, order_date FROM ordersWHERE order_date BETWEEN '2025-04-01' AND '2025-04-30';
النتيجة · 3 صفوف
idorder_date
72025-04-01
82025-04-09
92025-04-20

٥البحث بجزء من النص: LIKE

LIKE تبحث بنمط فيه رمزان: % = أي عدد من الأحرف (حتى صفر)، و _ = حرف واحد بالضبط:

النمطيطابق
'قهوة%'يبدأ بـ «قهوة»
'%عسل%'فيه «عسل» في أي مكان
'%غ'ينتهي بـ «غ»
'055_______1'يبدأ بـ 055، ثم 7 أحرف، ثم 1
query.sql
SELECT name FROM productsWHERE name LIKE '%قهوة%';
النتيجة · صفّان
name
قهوة عربية 250غ
دلة قهوة
query.sql
SELECT name, phone FROM customersWHERE name LIKE '%الحربي';
النتيجة · صف واحد
namephone
خالد الحربي0551000003

٦الفراغ: IS NULL

NULL «لا قيمة»، فلا تساوي شيئًا، ولا حتى NULL أخرى! لذلك = NULL لا تجد شيئًا أبدًا. نستخدم IS NULL و IS NOT NULL:

✗ خطأ
query.sql
SELECT name FROM customers WHERE phone = NULL;
النتيجة · لا صفوف
name
(لا توجد صفوف تحقق الشرط)
✓ صواب
query.sql
SELECT name FROM customers WHERE phone IS NULL;
النتيجة · صف واحد
name
عبدالله الزهراني

الأولى لا تعطي خطأ، بل نتيجة فارغة، وهذا أخطر لأنك قد لا تنتبه.

ولعرض قيمة بديلة مكان NULL: COALESCE (تعمل في كل الأنظمة)، أو IFNULL في MySQL و SQLite:

query.sql
SELECT name, COALESCE(city, 'غير محددة') AS cityFROM customersWHERE id >= 8;
النتيجة · 3 صفوف
namecity
هند السبيعيالمدينة المنورة
ماجد الغامديتبوك
لمى العنزيغير محددة

٧ترتيب أجزاء الاستعلام

الأجزاء تُكتب دائمًا بهذا الترتيب، وأي تبديل خطأ:

query.sql
SELECT   الأعمدةFROM     الجدولWHERE    الشرطORDER BY الترتيبLIMIT    العدد;
🧪 ملعب SQLجرّب: العملاء الذين انضموا في 2025 مرتبين بالأحدث. والمنتجات التي تنتهي بـ «غ».

توقّع وتحقّق

الترتيب التنازلي:

من الأكبر.

LIKE 'ع%' تطابق:

% بعدها.

للبحث عن الفراغ:

NULL لا تساوي شيئًا.

BETWEEN 10 AND 20 يشمل 20؟

يشمل الطرفين.

الخلاصة

تحدٍّ برمجي: أغلى المنتجات المتوفرة

متوسط

صفحة «الأكثر فخامة» في المتجر تعرض أغلى أربعة منتجات متوفرة في المخزون، ما عدا الأدوات.

المطلوب:
  • الأعمدة: name ثم category ثم price.
  • المنتجات المتوفرة فقط (المخزون أكبر من صفر)، وليست من تصنيف «أدوات».
  • مرتبة من الأغلى، وأربعة فقط.
👀 اعرض النتيجة المطلوبة
النتيجة المطلوبة
namecategoryprice
عسل سدر 500غعسل150
تمر عجوة 1كغتمور90
عسل زهور 500غعسل60
زعفران 5غبهارات55
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء
  • المنتجات الأربعة الصحيحة بالترتيب الصحيح
  • تستخدم ORDER BY … DESC
  • تستخدم LIMIT

💡 تلميح 1
الترتيب: SELECT ← FROM ← WHERE ← ORDER BY ← LIMIT
💡 تلميح 2
category <> 'أدوات'

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

solution.sql
SELECT name, category, priceFROM productsWHERE stock > 0 AND category <> 'أدوات'ORDER BY price DESCLIMIT 4;
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس