انتقل إلى المحتوى الرئيسي

الوحدة 7 · SQL لمهندسي الجودة

SELECT والتصفية وقيم NULL

استعلم من جدول، وصفِّ الصفوف، وتعامل مع القيم المفقودة بشكل صحيح.

نحو 10 دقيقة قراءة و15 دقيقة تطبيق (تقديرات)

جارٍ تحميل التقدم…

اقرأ

أهداف التعلّم

  • كتابة استعلامات SELECT مع WHERE وORDER BY وLIMIT.
  • شرح سبب عدم تطابق = NULL أبداً، واستخدام IS NULL.
  • عدّ الصفوف بشكل صحيح.

الشرح

يستخدم المختبرون SQL للتحقق مما حفظه التطبيق فعلاً — لا مما تعرضه الشاشة فقط. ويحدد الاستعلام الأعمدة والجدول، وتصفية اختيارية، وترتيباً، وحداً لعدد الصفوف.

-- Fictional Dar Al Souq data, for practice only
CREATE TABLE customers (
  id      integer PRIMARY KEY,
  name    text NOT NULL,
  wilayat text            -- may be NULL
);
CREATE TABLE orders (
  id           integer PRIMARY KEY,
  customer_id  integer NOT NULL REFERENCES customers(id),
  status       text NOT NULL,          -- 'paid', 'cancelled', ...
  total        numeric(10,3) NOT NULL, -- OMR
  delivered_at timestamptz             -- NULL until delivered
);
CREATE TABLE order_items (
  order_id   integer NOT NULL REFERENCES orders(id),
  product_id text NOT NULL,
  qty        integer NOT NULL,
  unit_price numeric(10,3) NOT NULL
);

INSERT INTO customers VALUES
  (1, 'Test Customer A', 'Muscat'),
  (2, 'Test Customer B', NULL),
  (3, 'Test Customer C', 'Sohar');
INSERT INTO orders VALUES
  (101, 1, 'paid',      16.500, '2026-10-01 10:00+04'),
  (102, 1, 'paid',      23.000, NULL),
  (103, 2, 'cancelled',  6.500, NULL),
  (104, 2, 'paid',      12.000, '2026-10-03 15:30+04');
INSERT INTO order_items VALUES
  (101, 'coffee-cups',     2,  8.250),
  (102, 'serving-bowl',    1, 12.000),
  (102, 'woven-tote',      1,  9.500),
  (103, 'incense-burner',  1,  6.500),
  (104, 'serving-bowl',    1, 12.000);
شغّل هذا في قاعدة بيانات PostgreSQL محلية تملكها لتجربة الاستعلامات.
SELECT id, status, total
FROM orders
WHERE status = 'paid' AND total >= 15
ORDER BY total DESC
LIMIT 10;
-- 102 | paid | 23.000
-- 101 | paid | 16.500

تعني NULL «غير معروف» أو «مفقود». وأي مقارنة مع NULL — حتى NULL = NULL — لا تكون صحيحة، لذا فإن WHERE delivered_at = NULL لا يعيد أي صف. استخدم IS NULL أو IS NOT NULL. ويعدّ COUNT(*) الصفوف، بينما يعدّ COUNT(column) الصفوف التي لا تكون فيها قيمة ذلك العمود NULL فقط.

SELECT count(*)            AS orders,
       count(delivered_at) AS delivered
FROM orders;
-- orders = 4, delivered = 2

مثال: التحقق من إلغاء طلب

بعد إلغاء الطلب 103 في التطبيق، تأكّد من أنه حُفظ بشكل صحيح وأنه لم يُوسم بأنه سُلّم:

SELECT id, status, delivered_at
FROM orders
WHERE id = 103;
-- 103 | cancelled | NULL

أخطاء شائعة

  • كتابة = NULL بدلاً من IS NULL.
  • تشغيل استعلام دون WHERE أو LIMIT على جدول كبير.
  • الثقة بواجهة المستخدم بدلاً من فحص القيم المخزنة.

جرّب

تدرّب على ما قرأته للتو. تُفحص الإجابات هنا، ولا يُقيَّم شيء علناً ولا يُحتسب في ساحة الأخطاء.

تمرين

أي استعلام يسرد الطلبات المدفوعة التي لم تُسلَّم بعد؟

اختر إجابة واحدة.

راجع

اختبر نفسك — يجب أن تكون الآن قادراً على:

  • كتابة استعلامات SELECT مع WHERE وORDER BY وLIMIT.
  • شرح سبب عدم تطابق = NULL أبداً، واستخدام IS NULL.
  • عدّ الصفوف بشكل صحيح.

مراجع

تابع

عندما تكون مستعداً، ضع علامة الإكمال على الدرس في خطوة «جرّب» ثم انتقل إلى التالي.

يُوسم بأنه مقروء عندما تصل إلى نهاية الدرس.