AzLearn

IN و EXISTS

IN and EXISTS

مفهوم ~18 دقيقة

IN و EXISTS

IN يفحص أن القيمة ضمن قائمة أو نتيجة استعلام. EXISTS يسأل: هل يوجد صف يطابق الشرط؟ كلاهما مفيد للعلاقات. مثلاً: العملاء الذين لديهم طلبات مدفوعة.

EXISTS يقرأ غالباً كجملة طبيعية: اختر العملاء حيث يوجد طلب لهذا العميل. في كثير من الحالات يكون واضحاً وفعالاً.

مثال عملي

query.sql

الاستعلام يعرض العملاء الذين يوجد لهم طلب مدفوع.

مزلق NOT IN مع NULL — The NULL Gotcha

NOT IN لها خاصية خطيرة عندما تحتوي نتيجة الاستعلام الفرعي على NULL. ثلاثية المنطق (three-valued logic) في SQL تقول إن مقارنة أي قيمة بـNULL ليست TRUE ولا FALSE، بل NULL (مجهول). هذا يجعل NOT IN ترجع صفر صفوف كاملاً عوضاً عن القائمة المتوقعة.

query.sql

لماذا يحدث هذا؟ NOT IN تقيّم: “هل id غير موجود في {1, NULL}؟” — السؤال عن NULL يرجع NULL لا FALSE، فتفشل الفلترة لكل الصفوف.

query.sql

EXISTS وNOT EXISTS يتجنبان المشكلة لأنهما لا يقارنان القيم مباشرة — يسألان فقط هل يوجد صف مطابق أم لا. القاعدة: إذا احتمل الاستعلام الفرعي NULL، استخدم NOT EXISTS بدلاً من NOT IN.

تحدي — Challenge