انتقل إلى محتوى الدرس
الدرس 29
دورة MySQL

فحص القيم الفارغة والترتيب بـ ORDER BY وتقسيم الصفحات بـ LIMITMySQL NULL Handling ORDER BY and LIMIT Pagination

تعلّم فحص القيم الفارغة والترتيب بـ ORDER BY وتقسيم الصفحات بـ LIMIT بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع
اختبر غياب القيمة أو وجودها في الأعمدة بالطريقة القياسية الصحيحة عبر IS NULL و IS NOT NULL.

تمثّل القيمة NULL في قواعد البيانات غياب البيان أو عدم معرفته، وهي تختلف كلياً عن الرقم صفر 0 أو النص الفارغ ''. ولأن معامل التساوي العادي يفشل مع NULL، يوفر SQL معاملين مخصصين لفحصها.

  • المعامل IS NULL: يُعيد 1 عندما يكون العمود خالياً من أي قيمة NULL.
  • المعامل IS NOT NULL: يُعيد 1 عندما يحتوي العمود على قيمة فعلية مسجلة (بما في ذلك الصفر أو السلسلة النصية الفارغة).

يدرج محرك InnoDB مفاتيح NULL داخل فهارس B-Tree، مما يسمح للشرط WHERE col IS NULL باستخدام الفهرس بسرعة عالية.

فحص القيم الفارغة بـ IS NULL والترتيب بـ ORDER BY وتقسيم الصفحات

مسار التنفيذ: FROM ثم التصفية بـ WHERE ثم SELECT ثم الفرز بـ ORDER BY وأخيراً LIMIT و OFFSET
مخطط توضيحي لدرس فحص القيم الفارغة والترتيب بـ ORDER BY وتقسيم الصفحات بـ LIMIT
مخطط توضيحي لدرس فحص القيم الفارغة والترتيب بـ ORDER BY وتقسيم الصفحات بـ LIMIT
SQL
-- Find unshipped orders vs completed shipments
SELECT order_id, customer_id, shipped_at
FROM orders
WHERE shipped_at IS NULL;

SELECT order_id, tracking_no, shipped_at
FROM orders
WHERE shipped_at IS NOT NULL;
اضمن ترتيب الصفوف المسترجعة بشكل حاسم ومنظم باستخدام جملة ORDER BY مع ASC و DESC.

بدون كتابة جملة ORDER BY صريحة، لا يضمن محرك قاعدة البيانات أي ترتيب ثابت للصفوف المسترجعة؛ فقد يتغير ترتيب ظهورها تبعاً للفهرس المستخدم أو تحديثات الصفحات.

  • الترتيب التصاعدي ASC (الافتراضي): يرتّب القيم من الأصغر إلى الأكبر رقمياً وأبجدياً ومن الأقدم إلى الأحدث زمنياً، ويُطبَّق تلقائياً عند عدم ذكر اتجاه الترتيب.
  • الترتيب التنازلي DESC: يرتّب القيم من الأكبر إلى الأصغر ومن التاريخ الأحدث إلى الأقدم.

نظراً لأن جملة ORDER BY تُنفَّذ منطقياً بعد مرحلة SELECT، يمكنك استخدام الأسماء المستعارة المعرّفة بـ AS داخل ORDER BY مباشرة.

SQL
-- Sort products by net price alias from highest to lowest
SELECT product_id,
       title,
       (unit_price - discount_usd) AS net_price
FROM products
WHERE is_active = 1
ORDER BY net_price DESC;
رتّب النتائج حسب عمود رئيسي واحسم التعادل بأعمدة فرعية لكل منها اتجاه ASC أو DESC مستقل.

يمكنك تمرير عدة أعمدة مفصولة بفواصل إلى جملة ORDER BY؛ حيث يرتّب MySQL الصفوف وفق العمود الأول أولاً، ولا يلجأ إلى العمود الثاني إلا لكسر التعادل بين الصفوف المتساوية في العمود الأول.

  • استقلالية اتجاه كل عمود: يخص اتجاه ASC أو DESC العمود الذي يسبقه مباشرة فقط! فكتابة ORDER BY dept_id, salary DESC تعني ترتيب رقم القسم تصاعدياً ASC وترتيب الراتب تنازلياً DESC داخل كل قسم.
  • كسر التعادل بالمفتاح الأساسي: أضف دائماً عموداً فريداً مثل المفتاح الأساسي id ASC كآخر عمود في الترتيب لضمان ثبات مواقع الصفوف المتساوية عند تقسيم الصفحات.

يدعم MySQL 8 الفهارس التنازلية المختلطة Descending Indexes لتسريع الترتيب المتعدد دون الحاجة لعملية فرز إضافية filesort.

SQL
-- Sort by department ascending, then highest salary, then id
SELECT emp_id, full_name, dept_id, salary
FROM employees
WHERE is_active = 1
ORDER BY dept_id ASC, salary DESC, emp_id ASC;
تعرّف على موقع ظهور القيم الفارغة NULL في الترتيب التصاعدي والتنازلي وكيفية دفعها لنهاية النتائج.

عند ترتيب عمود يقبل القيم الفارغة في MySQL، يعامل المحرك القيمة NULL على أنها أصغر من أي قيمة غير فارغة أخرى عند الفرز.

  • مع الترتيب التصاعدي ASC: تظهر الصفوف التي تحتوي على NULL في بداية النتائج أولاً.
  • مع الترتيب التنازلي DESC: تظهر الصفوف التي تحتوي على NULL في نهاية النتائج أخيراً.
  • دفع قيم NULL للنهاية مع الترتيب التصاعدي: نظراً لعدم وجود كلمة NULLS LAST في MySQL، نستخدم الحيلة المنطقية الأنيقة ORDER BY (col IS NULL) ASC, col ASC؛ حيث يُعيد التعبير col IS NULL القيمة 0 للصفوف المكتملة فتظهر أولاً، ويُعيد 1 للصفوف الفارغة فتُدفع إلى آخر القائمة!

تعمل هذه الطريقة القياسية بكفاءة مع الأرقام والنصوص والتواريخ على حد سواء.

SQL
-- Push NULL delivery dates to the bottom while sorting ASC
SELECT task_id, title, due_date
FROM project_tasks
ORDER BY (due_date IS NULL) ASC,
         due_date ASC,
         task_id ASC;
حدّد العدد الأقصى للصفوف المسترجعة ونفّذ تقسيم الصفحات Pagination باستخدام LIMIT و OFFSET.

تُنفَّذ جملة LIMIT في المرحلة الأخيرة من الاستعلام بعد اكتمال الفرز بـ ORDER BY لتقييد عدد الصفوف المرسلة إلى التطبيق.

  • جلب أعلى N سجلات LIMIT count: كتابة LIMIT 5 تكتفي بإرجاع أول 5 صفوف فقط.
  • تقسيم الصفحات LIMIT count OFFSET skip: لعرض الصفحة رقم P بحجم N صفاً في كل صفحة، نحسب الإزاحة بالمعادلة skip = (P - 1) * N؛ فعند عرض 10 عناصر بالصفحة، تستخدم الصفحة الأولى LIMIT 10 OFFSET 0، والثانية LIMIT 10 OFFSET 10، والثالثة LIMIT 10 OFFSET 20.

استخدم دائماً الصيغة الصريحة LIMIT count OFFSET skip بدلاً من صيغة الفاصلة القديمة LIMIT skip, count لتفادي عكس الرقمين بالخطأ.

SQL
-- Page 3 of active products (10 per page -> skip first 20)
SELECT product_id, title, unit_price
FROM products
WHERE is_active = 1
ORDER BY unit_price DESC, product_id ASC
LIMIT 10 OFFSET 20;
جدول مرجعي شامل يلخّص قواعد فحص NULL والترتيب بـ ORDER BY وتقسيم الصفحات بـ LIMIT في MySQL 8.

يلخّص الجدول التالي الأنماط القياسية لفحص القيم الفارغة وترتيب النتائج وتقسيم الصفحات في MySQL 8:

النمط / الجملةمثال الصياغةالسلوك التنفيذي
فحص غياب القيمةWHERE col IS NULLيطابق الصفوف التي تكون فيها قيمة العمود فارغة
فحص وجود القيمةWHERE col IS NOT NULLيطابق الصفوف التي تحتوي على قيمة مسجلة
الترتيب المتعددORDER BY dept ASC, pay DESCيرتّب بالقسم تصاعدياً ويكسر التعادل بالراتب تنازلياً
وضع NULL أخيراًORDER BY (col IS NULL), col ASCيعرض القيم الفعلية أولاً ثم يدفع NULL للنهاية
تقسيم الصفحات القياسيLIMIT 20 OFFSET 40يتخطى 40 صفاً ويعرض 20 صفاً (الصفحة الثالثة)
التقسيم بالمؤشر KeysetWHERE id > 500 ORDER BY id LIMIT 20يقفز عبر الفهرس مباشرة دون مسح الصفوف المتخطاة

ملخص الدرس: أتقنت في هذا الدرس فحص القيم الفارغة عبر IS NULL و IS NOT NULL، والترتيب المفرد والمتعدد بجملة ORDER BY، والتحكم في موقع ظهور NULL، وتقسيم الصفحات عبر LIMIT و OFFSET.
الخطوة التالية والدرس القادم: نبدأ في الدرس القادم وحدة تجميع البيانات Data Aggregation بتعلّم الدوال التجميعية الخمس COUNT و SUM و AVG و MIN و MAX.

SQL
-- Complete filter, NULL-last sort, and page-1 query
SELECT order_id, customer_id, shipped_at, total_usd
FROM orders
WHERE order_status = 'paid'
ORDER BY (shipped_at IS NULL) ASC, shipped_at ASC, order_id ASC
LIMIT 15 OFFSET 0;
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنّا في هذا الدرس فحص القيم الفارغة والترتيب بـ ORDER BY وتقسيم الصفحات بـ LIMIT في MySQL 8 مع أمثلة عملية.

الخطوة التالية والدرس القادم

أكمل التدريبات والاختبار التفاعلي أدناه قبل الانتقال إلى الدرس التالي في مسار MySQL.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 IS NULL / IS NOT NULL فحص القيمة الفارغة IS NULL
معاملان مخصصان في SQL لاختبار ما إذا كان العمود فارغاً NULL أو يحتوي على قيمة فعلية.
للمراجعة
02 ORDER BY Clause جملة الترتيب ORDER BY
جملة في SQL تُنفَّذ بعد SELECT لفرز الصفوف المسترجعة تصاعدياً ASC أو تنازلياً DESC.
للمراجعة
03 LIMIT and OFFSET تحديد النتائج والإزاحة LIMIT / OFFSET
جملتان في نهاية الاستعلام لتحديد أقصى عدد للصفوف المسترجعة LIMIT بعد تخطي عدد محدد من الصفوف OFFSET.
للمراجعة
04 Filesort فرز الذاكرة أو القرص (Filesort)
عملية الفرز الداخلية التي ينفذها MySQL عندما لا يتوفر فهرس مرتّب يطابق جملة ORDER BY مباشرة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 ASC ASC
Ascending Order
الترتيب التصاعدي من الأصغر إلى الأكبر (وهو الاتجاه الافتراضي في ORDER BY)
للمراجعة
02 DESC DESC
Descending Order
الترتيب التنازلي من الأكبر إلى الأصغر أو من الأحدث إلى الأقدم
للمراجعة
03 UI UI
User Interface
واجهة المستخدم التي تعرض جداول البيانات المقسمة إلى صفحات عبر LIMIT و OFFSET
للمراجعة
04 API API
Application Programming Interface
واجهة برمجة التطبيقات التي تعتمد على الترتيب الحاسم والتقسيم الصفحي للبيانات
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. اكتب استعلام SELECT على جدول users يعرض user_id و username للمستخدمين الذين تكون قيمة phone_number لديهم فارغة NULL.

  2. اكتب استعلام SELECT على جدول orders يعرض order_id و created_at مرتبةً تنازلياً حسب created_at DESC ثم order_id DESC، مع إرجاع 10 صفوف للصفحة الثانية (تخطي أول 10 صفوف).

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

أي شرط داخل WHERE يطابق بشكل صحيح الصفوف التي يكون فيها العمود deleted_at فارغاً NULL؟

المقارنة بعلامة = مع NULL تُعيد دائماً UNKNOWN؛ لذا يجب استخدام IS NULL.

02

ما اتجاه الترتيب الافتراضي في جملة ORDER BY عند عدم كتابة ASC أو DESC؟

يطبق محرك MySQL الترتيب التصاعدي ASC افتراضياً على كل عمود في ORDER BY ما لم يُذكر DESC صراحةً بعده.

03

كيف يرتّب محرك MySQL الاستعلام عند كتابة ORDER BY category, price DESC؟

تنطبق كلمة DESC على العمود الذي يسبقها مباشرة (price)، بينما يأخذ العمود الأول category الاتجاه الافتراضي ASC.

04

أين تظهر الصفوف التي تحتوي على NULL عند الفرز التصاعدي ORDER BY score ASC في MySQL؟

يعامل MySQL القيمة NULL كأصغر قيمة عند الفرز فتظهر أولاً في الترتيب التصاعدي ASC وأخيراً في التنازلي DESC.

05

أي صياغة لـ ORDER BY تعرض القيم غير الفارغة مرتبةً تصاعدياً أولاً وتدفع قيم NULL إلى نهاية النتائج؟

يُعيد التعبير (score IS NULL) القيمة 0 للصفوف الممتلئة و 1 للصفوف الفارغة فتظهر القيم الممتلئة أولاً.

06

عند عرض 25 صفاً في كل صفحة، أي جملة تسترجع بيانات الصفحة الرابعة (Page 4)؟

تُحسب الإزاحة بالمعادلة (4 - 1) * 25 = 75، لذا نتخطى أول 75 صفاً ونجلب 25 صفاً.

07

هل يمكن استخدام الاسم المستعار المعرّف في جملة SELECT داخل جملة ORDER BY؟

بما أن مرحلة الفرز ORDER BY تأتي بعد استخراج أعمدة SELECT، فإن الأسماء المستعارة تكون متاحة للاستخدام المباشر.

08

ماذا تعني صيغة الفاصلة القديمة LIMIT 20, 10 في MySQL؟

في صيغة الفاصلة القديمة يمثّل الرقم الأول الإزاحة (20) والثاني عدد الصفوف (10)، ولذلك يُفضّل كتابة LIMIT 10 OFFSET 20 لوضوحها.