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

NOT EXISTS vs NOT IN تفوق NOT EXISTS مع الفارغ

تعلّم الاستعلامات الفرعية المترابطة ومعامل EXISTS في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
1 صفوف تعليمية
MySQL
8 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

عند البحث عن السجلات غير المرتبطة، يُعد الاختيار بين NOT EXISTS وNOT IN قراراً حاسماً لسلامة النتائج متى كان العمود الداخلي يقبل القيمة الفارغة NULL:

  • تعطل NOT IN بوجود NULL: إذا كان العمود orders.user_id يقبل NULL (للطلبات كضيف) ووجد صف واحد فارغ، فإن NOT IN (SELECT user_id FROM orders) يرجع صفراً من الصفوف دائماً.
  • أمان NOT EXISTS التام مع الفارغ: لأن EXISTS يفحص فقط هل أرجع الشرط o.user_id = u.user_id صفاً فعلياً أم لا، فإن NOT EXISTS لا يتأثر أبداً بوجود قيم NULL في الجدول الداخلي.
SQL
-- Null-safe check for customers without orders even if guest NULLs exist
SELECT
  u.user_id,
  u.full_name
FROM users AS u
WHERE NOT EXISTS (
  SELECT 1
  FROM orders AS o
  WHERE o.user_id = u.user_id
);