0Pricing
SQL Academy · درس

ما الذي يعنيه NULL فعليًا

قيمة غير معروفة، وليست صفرًا ولا فارغة

ما الذي يعنيه NULL فعليًا درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

تعرّف إلى NULL

تستخدم SQL القيمة NULL للتعبير عن «لا أعرف». وهي ليست صفرًا، ولا سلسلة فارغة، وليست false — بل تمثّل غياب قيمة.

عندما لا تكون قيمة العمود معروفة، تخزّن قاعدة البيانات NULL فيه. ويُعدّ فهم سلوك NULL من أهم الخطوات لكتابة استعلامات صحيحة.

-- A customers table where some phone numbers are unknown
SELECT id, name, phone
FROM customers;

-- id | name    | phone
-- ---+---------+------------
--  1 | Alice   | 555-0101
--  2 | Bob     | NULL        <- phone unknown
--  3 | Carol   | NULL

NULL ليست صفرًا

من الأخطاء الشائعة التعامل مع NULL مثل الرقم 0. فهما مختلفان تمامًا.

  • 0 قيمة معروفة: صفر.
  • تعني NULL أن القيمة مفقودة أو غير معروفة.

إذا كان رصيد الحساب 0، فهذا يعني أن العميل لا يملك مالًا. أما إذا كان NULL، فنحن ببساطة لا نعرف الرصيد بعد.

SELECT id, balance
FROM accounts;

-- id | balance
-- ---+--------
--  1 | 0        <- known: empty wallet
--  2 | NULL     <- unknown: not recorded yet

NULL ليست سلسلة فارغة

تختلف NULL أيضًا عن السلسلة الفارغة '' في أعمدة النصوص.

  • '' سلسلة طولها صفر — وهي قيمة معروفة وموجودة.
  • تعني NULL أنه لم تُقدَّم أي سلسلة أصلًا.

يمكنك تخزين ملاحظة فارغة عن قصد، أو ترك الملاحظة غائبة تمامًا. وتميّز SQL بين الحالتين.

SELECT id, note, length(note) AS note_len
FROM tickets;

-- id | note | note_len
-- ---+------+----------
--  1 | ''   |        0   <- empty but present
--  2 | NULL |     NULL   <- absent; length is also unknown

المنطق ثلاثي القيم

للمنطق المعتاد نتيجتان: true وfalse. وتضيف SQL نتيجة ثالثة: unknown.

تُنتج أي مقارنة تتضمن NULL القيمة unknown، لأنك لا تستطيع المقارنة مع قيمة لا تملكها. ويُسمّى هذا المنطق ثلاثي القيم.

-- Each comparison with NULL returns UNKNOWN, not true/false
SELECT
  NULL = 5      AS eq,      -- unknown
  NULL <> 5     AS neq,     -- unknown
  NULL = NULL   AS self_eq, -- unknown (!)
  NULL > 0      AS gt;      -- unknown

‏NULL = NULL ليست True

القاعدة الأكثر إثارة للدهشة هي أن NULL = NULL ليست true، بل تُقيَّم إلى unknown.

لماذا؟ إذا كانت القيمتان غير معروفتين، فلا يمكنك القول إنهما متساويتان — فقد تكونان أي شيء. وللتحقق مما إذا كانت قيمة ما هي NULL، يجب استخدام IS NULL بدلًا من =.

-- Wrong: never returns rows, because NULL = NULL is unknown
SELECT * FROM customers WHERE phone = NULL;

-- Right: use IS NULL
SELECT * FROM customers WHERE phone IS NULL;

‏WHERE تُبقي الصفوف TRUE فقط

تُبقي عبارة WHERE الصف فقط عندما يكون شرطها true. أما الصفوف التي يكون شرطها false أو unknown فتُستبعد.

ولهذا تؤدي التصفية على عمود NULL باستخدام = إلى إزالة صفوف قد تتوقع رؤيتها من دون تنبيه.

-- Bob and Carol have NULL phones, so phone = '555-0101'
-- is UNKNOWN for them and they are excluded.
SELECT name
FROM customers
WHERE phone = '555-0101';

-- Returns only Alice

ينتشر NULL عبر العمليات الحسابية

إن NULL مُعدٍ في التعبيرات. فتكاد أي عملية حسابية أو نصية تتضمن NULL أن تنتج NULL.

إذا كنت لا تعرف أحد المدخلات، فلا يمكنك معرفة النتيجة أيضًا.

SELECT
  10 + NULL    AS sum,    -- NULL
  100 * NULL   AS prod,   -- NULL
  NULL / 2     AS div,    -- NULL
  'Hi ' || NULL AS greet; -- NULL (string concat)

من أين تأتي قيم NULL

تظهر قيم NULL في عدة حالات شائعة:

  • عملية INSERT تحذف عمودًا يقبل NULL.
  • عملية ضم خارجي لا تجد صفًا مطابقًا في أحد الجانبين.
  • تجميع على صفر من الصفوف، مثل أن تُعيد SUM لمجموعة فارغة القيمة NULL.

يساعدك معرفة المصدر على تحديد طريقة التعامل معها.

-- Omitting phone inserts NULL automatically
INSERT INTO customers (id, name) VALUES (4, 'Dan');

SELECT id, name, phone FROM customers WHERE id = 4;
-- 4 | Dan | NULL

منع NULL باستخدام NOT NULL

إذا كان ينبغي أن يحتوي العمود على قيمة دائمًا، فصرّح عنه باستخدام NOT NULL. عندها ترفض قاعدة البيانات أي صف يحاول تركه فارغًا.

تُعدّ هذه طريقة قوية للحفاظ على نظافة بياناتك وتجنب المفاجآت المرتبطة بـ NULL لاحقًا.

CREATE TABLE users (
  id    integer PRIMARY KEY,
  email text NOT NULL,   -- must always be provided
  bio   text             -- nullable: optional
);

-- This fails: email cannot be NULL
INSERT INTO users (id, bio) VALUES (1, 'hi');

‏NULL مع DISTINCT وGROUP BY

هناك موضع واحد تتعامل فيه SQL مع قيم NULL على أنها متساوية: التجميع وإزالة التكرارات.

في DISTINCT وGROUP BY، تُجمع جميع قيم NULL في مجموعة واحدة، رغم أن NULL = NULL تكون unknown في المواضع الأخرى. وتحافظ هذه الحالة الخاصة على فائدة التجميع.

SELECT phone, count(*)
FROM customers
GROUP BY phone;

-- phone    | count
-- ---------+------
-- 555-0101 |     1
-- NULL     |     2   <- all NULLs grouped together

مراجعة النموذج الذهني

احتفظ بهذه القواعد في ذهنك كلما رأيت NULL:

  • تعني NULL قيمة غير معروفة، وليست صفرًا أو قيمة فارغة.
  • تُنتج المقارنات مع NULL القيمة unknown — استخدم IS NULL / IS NOT NULL.
  • تُبقي WHERE الصفوف true فقط.
  • تنتج العمليات الحسابية مع NULL القيمة NULL.
  • يتعامل التجميع مع قيم NULL كمجموعة واحدة.
-- The two correct NULL tests
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

تحقق سريع

إلى ماذا يُقيَّم التعبير NULL = NULL في SQL القياسية؟

مراجعة

أصبحت تفهم الآن ماهية NULL حقًا: فهي علامة تشير إلى قيمة مفقودة أو غير معروفة، وتختلف عن 0 و''.

رأيت المنطق ثلاثي القيم في SQL، ولماذا لا تنجح = NULL مطلقًا، وكيف ينتشر NULL عبر العمليات الحسابية، وكيف تستبعد WHERE الصفوف غير المعروفة. بعد ذلك، ستتعلم الطريقة الصحيحة لاختبار قيم NULL باستخدام IS NULL وIS NOT NULL.

-- Remember the golden rule
SELECT * FROM customers WHERE phone IS NULL;     -- correct
-- SELECT * FROM customers WHERE phone = NULL;   -- always empty!

الأسئلة الشائعة

هل درس «ما الذي يعنيه NULL فعليًا» مجاني؟

نعم — نص درس «ما الذي يعنيه NULL فعليًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «ما الذي يعنيه NULL فعليًا»؟

قيمة غير معروفة، وليست صفرًا ولا فارغة تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «ما الذي يعنيه NULL فعليًا»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما الذي يعنيه NULL فعليًا
  2. IS NULL وIS NOT NULL
  3. COALESCE وNULLIF
  4. قيم NULL في التجميعات والضم
← العودة إلى SQL Academy