IS NULL وIS NOT NULL
اختبر القيم المفقودة بشكل صحيح
IS NULL وIS NOT NULL درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
اختبار القيم المفقودة
بما أن المقارنات مع NULL تعيد دائمًا القيمة unknown، توفر SQL عاملَي تشغيل مخصصين لاختبار القيم المفقودة: IS NULL وIS NOT NULL.
وهما الطريقتان الوحيدتان الموثوقتان للعثور على قيم NULL أو استبعادها. في هذا الدرس، ستتعلم استخدامهما بطريقة صحيحة.
-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;
-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;لماذا تفشل = NULL
قد يبدو من الطبيعي كتابة WHERE phone = NULL، لكنها لا تطابق أي شيء أبدًا. إذ يُقيَّم الشرط إلى unknown لكل صف، بينما تُبقي WHERE الصفوف true فقط.
والنتيجة مجموعة فارغة — وهو خطأ صامت، إذ لا يُصدَر أي خطأ.
-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;
-- The fix
SELECT * FROM customers WHERE phone IS NULL;استخدام IS NULL عمليًا
تعيد IS NULL القيمة true تحديدًا عندما تكون القيمة مفقودة، وfalse في الحالات الأخرى. ولا تعيد أبدًا القيمة unknown.
وهذا يجعلها آمنة للاستخدام في أي موضع تحتاج فيه إلى نتيجة واضحة من نوع true/false.
SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;
-- id | name | missing_phone
-- ---+-------+--------------
-- 1 | Alice | f
-- 2 | Bob | t
-- 3 | Carol | tاستخدام IS NOT NULL عمليًا
إن IS NOT NULL هو النقيض التام: يعيد true عندما تكون القيمة موجودة، وfalse عندما تكون مفقودة.
استخدمه لتصفية الصفوف التي تحتوي فعلًا على بيانات، مثل العملاء الذين يمكنكم الاتصال بهم.
SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;
-- name | phone
-- ------+----------
-- Alice | 555-0101الدمج باستخدام AND وOR
يمكنك دمج اختبارات NULL مع شروط أخرى باستخدام AND وOR.
على سبيل المثال، يمكنك العثور على العملاء النشطين الذين لا يزالون بحاجة إلى رقم هاتف مسجّل — وهو استعلام شائع لجودة البيانات.
SELECT id, name
FROM customers
WHERE is_active = true
AND phone IS NULL;
-- Active customers missing a phone numberNULL في NOT IN: فخ
يتصرف NOT IN بطريقة غير متوقعة عندما تحتوي القائمة على قيمة NULL. فإذا احتوت المجموعة على أي قيمة NULL، فقد يعيد NOT IN القيمة unknown لكل صف، مستبعدًا النتائج التي توقعت ظهورها.
فضّل استخدام NOT EXISTS أو صفِّ قيم NULL من الاستعلام الفرعي أولًا.
-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);
-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);IS DISTINCT FROM
يوفر PostgreSQL العاملين IS DISTINCT FROM وIS NOT DISTINCT FROM للمقارنة الآمنة مع NULL.
وعلى خلاف =، يتعامل العاملان مع قيمتي NULL على أنهما متساويتان، ومع NULL والقيمة على أنهما مختلفتان، ويعيدان دائمًا true أو false، ولا يعيدان unknown مطلقًا.
SELECT
NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
NULL IS DISTINCT FROM 5 AS b, -- true: NULL differs from 5
5 IS DISTINCT FROM 5 AS c; -- false: same valueمقارنة عمودين يقبلان NULL
عند مقارنة عمودين قد يحتوي كلاهما على NULL، لا يلتقط = العادي الحالة التي تكون فيها القيمتان NULL. ويتعامل IS NOT DISTINCT FROM معها بطريقة سليمة.
وهذا مفيد جدًا للعثور على الصفوف التي لم تتغير، حتى عندما تكون القيمة غير معروفة.
-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;عدّ قيم NULL
من الاستخدامات العملية لـ IS NULL تدقيق جودة البيانات — أي عدّ عدد الصفوف التي تفتقد قيمة.
ادمجه مع FILTER في PostgreSQL أو مع CASE داخل COUNT لعدّ قيم NULL والقيم غير NULL جنبًا إلى جنب.
SELECT
count(*) AS total,
count(*) FILTER (WHERE phone IS NULL) AS missing,
count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;اختبارات NULL في قيود CHECK
يمكنك استخدام اختبارات NULL داخل قيود CHECK لفرض قواعد مثل: «إذا كان الصف قد شُحن، فيجب أن يحتوي على تاريخ الشحن».
ملاحظة: ينجح قيد CHECK عندما يكون شرطه true أو unknown، لذا فكّر بعناية في حالات NULL.
CREATE TABLE orders (
id integer PRIMARY KEY,
status text NOT NULL,
ship_date date,
CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);أفضل الممارسات
التزم بالعادات التالية لتتعامل بأمان مع قيم NULL:
- اختبر دائمًا باستخدام
IS NULL/IS NOT NULL، ولا تستخدم= NULLمطلقًا. - انتبه إلى استخدام
NOT INمع الاستعلامات الفرعية التي تقبل NULL. - استخدم
IS DISTINCT FROMللمساواة الآمنة مع NULL. - راجِع البيانات المفقودة باستخدام
count(*) FILTER (...).
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM bتحقق سريع
تريد جميع العملاء الذين لا يحتوي عمود phone لديهم على قيمة. أي عبارة WHERE صحيحة؟
مراجعة
تعلّمت الطريقة الصحيحة لاختبار القيم المفقودة باستخدام IS NULL وIS NOT NULL، ولماذا لا تنجح = NULL أبدًا.
وتعرّفت أيضًا إلى مشكلة NOT IN، والعامل IS DISTINCT FROM الآمن مع NULL، وكيفية تدقيق قيم NULL باستخدام FILTER. ستتعلّم بعد ذلك استبدال قيم NULL بقيم افتراضية مناسبة باستخدام COALESCE وNULLIF.
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;الأسئلة الشائعة
هل درس «IS NULL وIS NOT NULL» مجاني؟
نعم — نص درس «IS NULL وIS NOT NULL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «IS NULL وIS NOT NULL»؟
اختبر القيم المفقودة بشكل صحيح تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «IS NULL وIS NOT NULL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما الذي يعنيه NULL فعليًا
- IS NULL وIS NOT NULL
- COALESCE وNULLIF
- قيم NULL في التجميعات والضم