قيمة فارغة (SQL)

في لغة استعلام قواعد البيانات SQL ، يُعدّ null أو NULL علامةً خاصةً تُستخدم للإشارة إلى عدم وجود قيمة بيانات في قاعدة البيانات . وقد قدّمها إي. إف. كود ، مُبتكر نموذج قواعد البيانات العلائقية ، لتلبية شرط دعم جميع أنظمة إدارة قواعد البيانات العلائقية الحقيقية ( RDBMS ) لتمثيل "المعلومات المفقودة والمعلومات غير القابلة للتطبيق". كما قدّم كود استخدام رمز أوميغا اليوناني الصغير (ω) لتمثيل null في نظرية قواعد البيانات . في SQL، تُعدّ كلمة null كلمةً محجوزةً تُستخدم لتحديد هذه العلامة.NULL
لا ينبغي الخلط بين القيمة الفارغة والقيمة صفر . تشير القيمة الفارغة إلى عدم وجود قيمة، وهذا يختلف عن القيمة الصفرية. على سبيل المثال، في السؤال "كم عدد الكتب التي يملكها آدم؟"، قد تكون الإجابة "صفر" (أي أن عدد الكتب معروف بأنه صفر ) أو "فارغة" (أي أن عدد الكتب غير معروف ). في جدول قاعدة البيانات، سيبدأ العمود الذي يعرض هذه الإجابة بدون قيمة (مُعلَّم بالقيمة الفارغة)، ولن يتم تحديثه بالقيمة صفر إلا بعد التأكد من أن آدم لا يملك أي كتب.
في لغة SQL، تُعتبر القيمة الفارغة (null) علامةً وليست قيمةً حقيقية. يختلف هذا الاستخدام عن معظم لغات البرمجة، حيث تعني القيمة الفارغة لمرجع أنه لا يشير إلى أي كائن .
تاريخ
أشار إي. إف. كود إلى القيم الفارغة (null) كطريقة لتمثيل البيانات المفقودة في النموذج العلائقي في ورقة بحثية نُشرت عام 1975 في نشرة FDT التابعة لجمعية ACM - SIGMOD . وتُعدّ ورقة كود الأكثر شيوعًا في الاستشهاد بدلالات القيم الفارغة (كما هو مُعتمد في لغة SQL) هي ورقته البحثية المنشورة عام 1979 في مجلة ACM Transactions on Database Systems ، والتي قدّم فيها أيضًا نموذجه العلائقي/تسمانيا ، على الرغم من أن العديد من المقترحات الأخرى الواردة في هذه الورقة الأخيرة لا تزال غير واضحة. يُفصّل القسم 2.3 من ورقته البحثية لعام 1979 دلالات انتشار القيم الفارغة في العمليات الحسابية، بالإضافة إلى المقارنات التي تستخدم منطقًا ثلاثيًا (ثلاثي القيم) عند المقارنة بالقيم الفارغة؛ كما يُفصّل أيضًا معالجة القيم الفارغة في عمليات المجموعات الأخرى (وهي مسألة لا تزال مثيرة للجدل حتى اليوم). في أوساط نظرية قواعد البيانات ، يُشار الآن إلى اقتراح كود الأصلي (1975، 1979) باسم "جداول كود". [ 1 ] أكد كود لاحقًا على شرطه بأن تدعم جميع أنظمة إدارة قواعد البيانات العلائقية القيمة الفارغة (Null) للإشارة إلى البيانات المفقودة في مقال من جزأين نُشر عام 1985 في مجلة Computerworld . [ 2 ] [ 3 ]
اعتمد معيار SQL لعام 1986 بشكل أساسي اقتراح كود بعد نموذج أولي للتنفيذ في نظام IBM System R. على الرغم من أن دون تشامبرلين أقر بأن القيم الفارغة (إلى جانب الصفوف المكررة) تُعدّ من أكثر ميزات SQL إثارةً للجدل، إلا أنه دافع عن تصميمها في SQL مستندًا إلى حجج عملية مفادها أنها أقل أشكال دعم النظام تكلفةً للمعلومات المفقودة، مما يوفر على المبرمج العديد من عمليات التحقق المتكررة على مستوى التطبيق (انظر مشكلة شبه المسند )، وفي الوقت نفسه يمنح مصمم قاعدة البيانات خيار عدم استخدام القيم الفارغة إذا رغب في ذلك؛ على سبيل المثال، لتجنب حالات الشذوذ المعروفة (المناقشة في قسم الدلالات من هذه المقالة). كما جادل تشامبرلين بأن الخبرة العملية مع القيم الفارغة، إلى جانب توفير بعض وظائف القيم المفقودة، أدت أيضًا إلى ظهور ميزات لغوية أخرى تعتمد عليها، مثل بعض بنيات التجميع والوصلات الخارجية. وأخيراً، جادل بأن القيم الفارغة تُستخدم عملياً أيضاً كوسيلة سريعة لتصحيح مخطط موجود عندما يحتاج إلى التطور بما يتجاوز غرضه الأصلي، حيث لا يُستخدم الترميز لمعلومات مفقودة بل لمعلومات غير قابلة للتطبيق؛ على سبيل المثال، قاعدة بيانات تحتاج بسرعة إلى دعم السيارات الكهربائية مع وجود عمود يوضح عدد الأميال لكل جالون. [ 4 ]
أشار كود في كتابه الصادر عام 1990 بعنوان "النموذج العلائقي لإدارة قواعد البيانات، الإصدار الثاني" إلى أن قيمة Null الوحيدة التي يفرضها معيار SQL غير كافية، ويجب استبدالها بعلامتين منفصلتين من نوع Null للإشارة إلى سبب فقدان البيانات. في كتاب كود، يُشار إلى هاتين العلامتين بـ "قيم A" و"قيم I"، حيث تمثلان "مفقود ولكن قابل للتطبيق" و"مفقود ولكن غير قابل للتطبيق" على التوالي. [ 5 ] كانت توصية كود ستتطلب توسيع النظام المنطقي لـ SQL لاستيعاب نظام منطقي رباعي القيم. وبسبب هذا التعقيد الإضافي، لم تحظَ فكرة وجود قيم Null متعددة بتعريفات مختلفة بقبول واسع النطاق في مجال ممارسي قواعد البيانات. ومع ذلك، لا يزال هذا المجال محل بحث نشط، حيث لا تزال تُنشر فيه العديد من الأوراق البحثية.
التحديات
لطالما كان مفهوم القيمة الفارغة (Null) محور جدل ونقاش بسبب ارتباطه بالمنطق الثلاثي القيم (3VL)، والمتطلبات الخاصة لاستخدامه في عمليات الربط في لغة SQL ، والمعالجة الخاصة التي تتطلبها الدوال التجميعية وعوامل التجميع في SQL. وقد لخص أستاذ علوم الحاسوب، رون فان دير ميدن، مختلف المشكلات بقوله: "إن التناقضات في معيار SQL تعني أنه من غير الممكن إسناد أي دلالات منطقية بديهية لمعالجة القيم الفارغة في SQL." [ 1 ] وعلى الرغم من تقديم مقترحات عديدة لحل هذه المشكلات، إلا أن تعقيد البدائل حال دون اعتمادها على نطاق واسع.
انتشار الصفر
العمليات الحسابية
لأن القيمة الفارغة (Null) ليست قيمة بيانات، بل هي مؤشر على غياب قيمة، فإن استخدام العمليات الحسابية عليها يُعطي نتيجة غير معروفة، والتي تُمثلها القيمة الفارغة. [ 6 ] في المثال التالي، ضرب 10 في القيمة الفارغة ينتج عنه القيمة الفارغة:
10 * NULL -- النتيجة هي NULLقد يؤدي هذا إلى نتائج غير متوقعة. على سبيل المثال، عند محاولة قسمة قيمة فارغة (Null) على صفر، قد تُرجع المنصات قيمة فارغة (Null) بدلاً من إظهار الخطأ المتوقع "استثناء بيانات - القسمة على صفر ". [ 6 ] على الرغم من أن هذا السلوك غير مُحدد في معيار ISO SQL، إلا أن العديد من مُوردي أنظمة إدارة قواعد البيانات (DBMS) يتعاملون مع هذه العملية بشكل مُشابه. على سبيل المثال، تُرجع منصات Oracle وPostgreSQL وMySQL Server وMicrosoft SQL Server جميعها قيمة فارغة (Null) في الحالات التالية:
NULL / 0دمج السلاسل
تؤدي عمليات دمج السلاسل النصية ، الشائعة في لغة SQL، إلى قيمة فارغة (Null) عندما يكون أحد المعاملات فارغًا. [ 7 ] يوضح المثال التالي النتيجة الفارغة (Null) التي يتم إرجاعها عند استخدام Null مع ||عامل دمج السلاسل النصية في SQL.
'سمك' || لا شيء || 'بطاطس مقلية' -- النتيجة لا شيءهذا لا ينطبق على جميع تطبيقات قواعد البيانات. ففي نظام إدارة قواعد البيانات العلائقية أوراكل، على سبيل المثال، يُعتبر كل من NULL والسلسلة الفارغة شيئًا واحدًا، وبالتالي فإن 'Fish' || NULL || 'Chips' ينتج عنه 'Fish Chips'. [ 8 ]
مقارنات مع NULL والمنطق ثلاثي القيم (3VL)
بما أن القيمة الفارغة (Null) ليست عنصرًا في أي نطاق بيانات ، فإنها لا تُعتبر "قيمة"، بل علامة (أو عنصر نائب) تشير إلى القيمة غير المُعرَّفة . ولهذا السبب، لا يمكن أن تُسفر المقارنات مع القيمة الفارغة عن نتيجة صحيحة أو خاطئة، بل دائمًا عن نتيجة منطقية ثالثة، وهي "غير معروف". [ 9 ] والنتيجة المنطقية للتعبير أدناه، الذي يقارن القيمة 10 بالقيمة الفارغة، هي "غير معروف".
SELECT 10 = NULL -- النتيجة: غير معروفمع ذلك، قد تُعيد بعض العمليات على القيم الفارغة (Null) قيمًا إذا لم تكن القيمة الغائبة ذات صلة بنتيجة العملية. انظر المثال التالي:
SELECT NULL OR TRUE -- النتيجة: صحيحفي هذه الحالة، فإن حقيقة أن القيمة الموجودة على يسار OR غير قابلة للمعرفة لا علاقة لها بالموضوع، لأن نتيجة عملية OR ستكون صحيحة بغض النظر عن القيمة الموجودة على اليسار.
تُنفّذ لغة SQL ثلاث نتائج منطقية، لذا يجب أن تُوفّر تطبيقاتها منطقًا ثلاثي القيم مُتخصصًا (3VL) . تُبيّن الجداول أدناه القواعد التي تُحكم منطق SQL ثلاثي القيم (حيث يُمثّل p و q حالتين منطقيتين). [ 10 ] تتوافق جداول الحقيقة التي تستخدمها SQL لعمليات AND وOR وNOT مع جزء مشترك من منطق Kleene وŁukasiewicz ثلاثي القيم (والذي يختلف في تعريف الاستلزام؛ مع ذلك، لا تُعرّف SQL مثل هذه العملية). [ 11 ]
| ص | q | p أو q | p و q | p = q |
|---|---|---|---|---|
| حقيقي | حقيقي | حقيقي | حقيقي | حقيقي |
| حقيقي | خطأ شنيع | حقيقي | خطأ شنيع | خطأ شنيع |
| حقيقي | مجهول | حقيقي | مجهول | مجهول |
| خطأ شنيع | حقيقي | حقيقي | خطأ شنيع | خطأ شنيع |
| خطأ شنيع | خطأ شنيع | خطأ شنيع | خطأ شنيع | حقيقي |
| خطأ شنيع | مجهول | مجهول | خطأ شنيع | مجهول |
| مجهول | حقيقي | حقيقي | مجهول | مجهول |
| مجهول | خطأ شنيع | مجهول | خطأ شنيع | مجهول |
| مجهول | مجهول | مجهول | مجهول | مجهول |
| ص | ليس p |
|---|---|
| حقيقي | خطأ شنيع |
| خطأ شنيع | حقيقي |
| مجهول | مجهول |
تأثير كلمة "غير معروف" في عبارات WHERE
يُستخدم منطق القيم الثلاثية في لغة معالجة البيانات (DML) ضمن عبارات المقارنة في عبارات واستعلامات DML. WHEREتُجبر هذه العبارة عبارة DML على العمل فقط على الصفوف التي تُقيّم فيها العبارة إلى "صحيح". أما الصفوف التي تُقيّم فيها العبارة إلى "خطأ" أو "غير معروف"، فلا تُطبّق عليها INSERTعبارات UPDATEDML DELETE، ويتم تجاهلها في SELECTالاستعلامات. يُعدّ تفسير "غير معروف" و"خطأ" على أنهما نفس النتيجة المنطقية خطأً شائعًا عند التعامل مع القيم الفارغة (Null). [ 10 ] يوضح المثال البسيط التالي هذا الخطأ:
SELECT * FROM t WHERE i = NULL ;من المنطقي أن يُرجع الاستعلام المذكور أعلاه صفرًا من الصفوف دائمًا، لأن مقارنة العمود i مع قيمة فارغة (Null) تُرجع دائمًا قيمة غير معروفة (Unknown)، حتى بالنسبة للصفوف التي تكون فيها قيمة i فارغة. وتؤدي هذه النتيجة غير المعروفة SELECTإلى تجاهل الاستعلام لجميع الصفوف. (مع ذلك، عمليًا، تسترجع بعض أدوات SQL الصفوف باستخدام مقارنة مع قيمة فارغة).
المسندات المقارنة الخاصة بالقيم الصفرية والخاصة بـ 3VL
تُرجع عوامل المقارنة الأساسية في لغة SQL دائمًا القيمة "غير معروف" عند مقارنة أي قيمة مع قيمة فارغة (Null)، لذا يوفر معيار SQL مُسندَي مقارنة خاصين بالقيمة الفارغة. يختبر المُسندان " IS NULLو" IS NOT NULL(اللذان يستخدمان صيغة لاحقة ) ما إذا كانت البيانات فارغة أم لا. [ 12 ]
يتضمن معيار SQL الميزة الاختيارية F571 " اختبارات القيمة المنطقية " التي تُضيف ثلاثة عوامل منطقية أحادية إضافية (ستة في الواقع، إذا احتسبنا نفيها، الذي يُعد جزءًا من تركيبها)، باستخدام تدوين لاحق. ولها جداول الحقيقة التالية: [ 13 ]
| ص | p صحيح | p غير صحيح | p خطأ | p ليس خطأ | p غير معروف | p ليس مجهولاً |
|---|---|---|---|---|---|---|
| حقيقي | حقيقي | خطأ شنيع | خطأ شنيع | حقيقي | خطأ شنيع | حقيقي |
| خطأ شنيع | خطأ شنيع | حقيقي | حقيقي | خطأ شنيع | خطأ شنيع | حقيقي |
| مجهول | خطأ شنيع | حقيقي | خطأ شنيع | حقيقي | حقيقي | خطأ شنيع |
تُعدّ ميزة F571 مستقلة عن وجود نوع البيانات المنطقية في لغة SQL (سيتم تناوله لاحقًا في هذه المقالة)، وعلى الرغم من التشابهات النحوية، فإن F571 لا تُدخل القيم المنطقية أو القيم الثلاثية في اللغة. في الواقع، كانت ميزة F571 موجودة في SQL92 [ 14 ] قبل وقت طويل من إضافة نوع البيانات المنطقية إلى المعيار في عام 1999. مع ذلك، فإنّ عددًا قليلًا من الأنظمة يُطبّق ميزة F571، ومن بينها PostgreSQL.
إن إضافة IS UNKNOWN إلى عوامل التشغيل الأخرى لمنطق SQL ثلاثي القيم يجعل منطق SQL ثلاثي القيم كاملاً وظيفيًا ، [ 15 ] مما يعني أن عوامل التشغيل المنطقية الخاصة به يمكنها التعبير (بالتركيب) عن أي وظيفة منطقية ثلاثية القيم يمكن تصورها.
في الأنظمة التي لا تدعم ميزة F571، من الممكن محاكاة IS UNKNOWN p من خلال المرور على كل وسيط يمكن أن يجعل التعبير p غير معروف واختبار تلك الوسائط باستخدام IS NULL أو وظائف أخرى خاصة بـ NULL، على الرغم من أن هذا قد يكون أكثر تعقيدًا.
قانون الاستبعاد الرابع (في عبارات WHERE)
في منطق SQL ثلاثي القيم، لم يعد قانون الوسط المرفوع ، p OR NOT p ، صحيحًا لجميع قيم p . بتعبير أدق، في منطق SQL ثلاثي القيم، تكون العبارة p OR NOT p غير معروفة تحديدًا عندما تكون p غير معروفة، وصحيحة في غير ذلك. ولأن المقارنات المباشرة مع القيمة الفارغة (Null) تُنتج القيمة المنطقية غير المعروفة، فإن الاستعلام التالي
SELECT * FROM stuff WHERE ( x = 10 ) OR NOT ( x = 10 );لا يُعادل ذلك في لغة SQL مع
SELECT * FROM stuff ;إذا احتوى العمود x على أي قيم فارغة (Null)؛ في هذه الحالة، ستُعيد الاستعلامة الثانية بعض الصفوف التي لا تُعيدها الاستعلامة الأولى، وهي جميع الصفوف التي تكون فيها قيمة x فارغة. في منطق القيمتين الكلاسيكي، يسمح قانون الوسط المرفوع بتبسيط شرط جملة WHERE، بل وإلغائه. إن محاولة تطبيق قانون الوسط المرفوع على منطق القيم الثلاث في SQL هو في الواقع ثنائية زائفة . الاستعلامة الثانية تُكافئ في الواقع ما يلي:
SELECT * FROM stuff ; -- هذا (بسبب 3VL) مكافئ لما يلي: SELECT * FROM stuff WHERE ( x = 10 ) OR NOT ( x = 10 ) OR x IS NULL ;وبالتالي، فإن تبسيط العبارة الأولى في لغة SQL يتطلب منا إرجاع جميع الصفوف التي لا تكون فيها قيمة x فارغة.
SELECT * FROM stuff WHERE x IS NOT NULL ;بالنظر إلى ما سبق، لاحظ أنه بالنسبة لعبارة WHERE في لغة SQL، يمكن كتابة جملة منطقية متكررة مشابهة لقانون الوسط المرفوع. بافتراض وجود عامل IS UNKNOWN، فإن p OR (NOT p ) OR ( p IS UNKNOWN) صحيحة لكل مسند p . يُعرف هذا بين علماء المنطق بقانون الرابع المرفوع .
هناك بعض تعابير SQL التي يكون فيها موضع المعضلة الخاطئة أقل وضوحًا، على سبيل المثال:
حدد 'ok' حيث 1 ليس ضمن ( حدد CAST ( NULL AS INTEGER )) اتحاد حدد 'ok' حيث 1 ضمن ( حدد CAST ( NULL AS INTEGER ));لا ينتج أي صفوف لأن INذلك يُترجم إلى نسخة مُكررة من المساواة على مجموعة الوسائط، و1<>NULL غير معروف، تمامًا كما أن 1=NULL غير معروف. (يُستخدم التحويل CAST في هذا المثال فقط في بعض تطبيقات SQL مثل PostgreSQL، والتي سترفضه بخطأ في التحقق من النوع في غير ذلك. في العديد من الأنظمة، يعمل SELECT NULL العادي في الاستعلام الفرعي.) الحالة المفقودة أعلاه هي بالطبع:
SELECT 'ok' WHERE ( 1 IN ( SELECT CAST ( NULL AS INTEGER ))) IS UNKNOWN ;تأثير القيم الصفرية والمجهولة في البنى الأخرى
ينضم
تُقيّم عمليات الربط باستخدام قواعد المقارنة نفسها المستخدمة في عبارات WHERE. لذلك، يجب توخي الحذر عند استخدام الأعمدة التي تقبل القيم الفارغة في معايير الربط في SQL. على وجه الخصوص، لا يكون الجدول الذي يحتوي على أي قيم فارغة مساويًا لجدول الربط الذاتي الطبيعي الخاص به، مما يعني أنه بينماينطبق هذا على أي علاقة R في الجبر العلائقي ، حيث أن الربط الذاتي في SQL سيستبعد جميع الصفوف التي تحتوي على قيمة فارغة (Null) في أي مكان. [ 16 ] يُقدَّم مثال على هذا السلوك في القسم الذي يحلل دلالات القيم المفقودة للقيم الفارغة (Null).
COALESCEيمكن استخدام دوال أو تعابير SQL CASEلمحاكاة تساوي القيم الفارغة في معايير الربط، كما يمكن استخدام عبارات " IS NULLو " IS NOT NULLفي معايير الربط أيضًا. تختبر العبارة التالية تساوي القيمتين A وB، وتعتبر القيم الفارغة متساوية.
( أ = ب ) أو ( أ فارغ و ب فارغ )تعبيرات CASE
توفر لغة SQL نوعين من التعبيرات الشرطية . أحدهما يُسمى "CASE البسيط" ويعمل مثل عبارة switch . أما الآخر فيُسمى "CASE المُبحث" في المعيار، ويعمل مثل عبارة if...elseif .
تستخدم التعبيرات البسيطة CASEمقارنات ضمنية للمساواة، والتي تعمل وفقًا لنفس WHEREقواعد بنود لغة معالجة البيانات (DML) الخاصة بالقيمة الفارغة (Null). لذا، لا يمكن للتعبير البسيطCASE التحقق من وجود قيمة فارغة (Null) بشكل مباشر. دائمًا ما ينتج عن التحقق من وجود قيمة فارغة (Null) في CASEتعبير بسيط قيمة غير معروفة (Unknown)، كما في المثال التالي:
SELECT CASE i WHEN NULL THEN 'Is Null' -- لن يتم إرجاع هذه القيمة أبدًا WHEN 0 THEN 'Is Zero' -- سيتم إرجاع هذه القيمة عندما i = 0 WHEN 1 THEN 'Is One' -- سيتم إرجاع هذه القيمة عندما i = 1 END FROM t ;لأن التعبير i = NULLيُقيّم إلى غير معروف بغض النظر عن القيمة التي يحتويها العمود i'Is Null' (حتى لو كان يحتوي على قيمة فارغة)، فلن يتم إرجاع السلسلة أبدًا.
من جهة أخرى، CASEيمكن للتعبير "المُبحث عنه" استخدام مُسندات مثل " IS NULLو IS NOT NULL" في شروطه. يوضح المثال التالي كيفية استخدام CASEتعبير مُبحث عنه للتحقق من قيمة Null بشكل صحيح:
SELECT CASE WHEN i IS NULL THEN 'Null Result' -- سيتم إرجاع هذه القيمة عندما تكون i تساوي NULL WHEN i = 0 THEN 'Zero' -- سيتم إرجاع هذه القيمة عندما تكون i = 0 WHEN i = 1 THEN 'One' -- سيتم إرجاع هذه القيمة عندما تكون i = 1 END FROM t ;في CASEالتعبير الذي تم البحث عنه، يتم إرجاع السلسلة 'Null Result'لجميع الصفوف التي يكون فيها i فارغًا.
توفر لغة SQL الخاصة بـ Oracle وظيفة مدمجة DECODEيمكن استخدامها بدلاً من تعبيرات CASE البسيطة وتعتبر قيمتين فارغتين متساويتين.
SELECT DECODE ( i , NULL , 'Null Result' , 0 , 'Zero' , 1 , 'One' ) FROM t ;وأخيرًا، تُرجع جميع هذه البنى قيمة NULL إذا لم يتم العثور على تطابق؛ فهي تحتوي على ELSE NULLشرط افتراضي.
عبارات IF في الامتدادات الإجرائية
تُعرّف SQL/PSM (وحدات SQL المخزنة الدائمة) امتدادات إجرائية للغة SQL، مثل IFعبارة `. مع ذلك، لطالما أضافت كبرى شركات SQL امتداداتها الإجرائية الخاصة. تعمل الامتدادات الإجرائية للحلقات والمقارنات وفقًا لقواعد مقارنة القيم الفارغة (Null) المشابهة لتلك المستخدمة في عبارات DML والاستعلامات. يوضح مقتطف الشفرة التالي، بتنسيق معيار ISO SQL، استخدام Null 3VL في عبارة IF`.
إذا كانت قيمة i تساوي NULL ، فاختر 'النتيجة صحيحة'، وإذا لم تكن قيمة i تساوي NULL ، فاختر 'النتيجة خاطئة'، وإلا فاختر 'النتيجة غير معروفة' .لا يُنفّذ هذا IFالبيان أي إجراءات إلا في المقارنات التي تُقيّم إلى "صحيح". أما في حالة المقارنات التي تُقيّم إلى "خطأ" أو "غير معروف"، IFفيُمرّر البيان التحكم إلى ELSEIFجملة `true`، ثم إلى ELSEجملة `false`. ستكون نتيجة الكود أعلاه دائمًا هي الرسالة `true`، 'Result is Unknown'لأن المقارنات مع `Null` تُقيّم دائمًا إلى "غير معروف".
تحليل دلالات القيم المفقودة في لغة SQL
قدّم العمل الرائد لـ ت. إيميلينسكي و و. ليبسكي الابن (1984) [ 17 ] إطارًا لتقييم الدلالات المقصودة لمختلف المقترحات لتطبيق دلالات القيم المفقودة، وهو ما يُعرف باسم جبر إيميلينسكي-ليبسكي . يتبع هذا القسم تقريبًا الفصل 19 من كتاب "أليس" [ 18 ] . ويظهر عرض مشابه في مراجعة رون فان دير ميدن، §10.4 [ 1 ] .
في عمليات الاختيار والتوقعات: تمثيل ضعيف
تهدف البنى التي تمثل المعلومات المفقودة، مثل جداول كود، في الواقع إلى تمثيل مجموعة من العلاقات، علاقة لكل حالة ممكنة من حالات معاييرها؛ في حالة جداول كود، يعني هذا استبدال القيم الفارغة بقيمة محددة. على سبيل المثال،
| اسم | عمر |
|---|---|
| جورج | 43 |
| هارييت | NULL |
| تشارلز | 56 |
| اسم | عمر |
|---|---|
| جورج | 43 |
| هارييت | 22 |
| تشارلز | 56 |
| اسم | عمر |
|---|---|
| جورج | 43 |
| هارييت | 37 |
| تشارلز | 56 |
يُقال إن بنيةً ما (مثل جدول كود) تُمثل نظام تمثيل قوي (للمعلومات المفقودة) إذا أمكن تخصيص أي إجابة لاستعلام مُوجه إليها للحصول على إجابة لأي استعلام مُقابل على العلاقات التي تُمثلها، والتي تُعتبر نماذج لهذه البنية. بتعبير أدق، إذا كانت q صيغة استعلام في الجبر العلائقي (للعلاقات "الخالصة")، وإذا كانت q هي رفعها إلى بنية مُخصصة لتمثيل المعلومات المفقودة، فإن التمثيل القوي يتميز بالخاصية التالية: لأي استعلام q وبنية (جدول) T ، فإن q ترفع جميع الإجابات إلى تلك البنية، أي:
(ينطبق ما سبق على الاستعلامات التي تأخذ أي عدد من الجداول كوسيطات، ولكن يكفي الاقتصار على جدول واحد لهذه المناقشة). من الواضح أن جداول كود لا تتمتع بهذه الخاصية القوية إذا تم اعتبار عمليات الاختيار والإسقاط جزءًا من لغة الاستعلام. على سبيل المثال، جميع الإجابات على
SELECT * FROM Emp WHERE Age = 22 ;ينبغي أن يشمل ذلك إمكانية وجود علاقة مثل EmpH22. مع ذلك، لا تستطيع جداول كود تمثيل الفصل "نتيجة قد تحتوي على صفر أو صف واحد". لكن هناك أداة، ذات أهمية نظرية في الغالب، تُسمى الجدول الشرطي (أو جدول-ج)، يمكنها تمثيل مثل هذه الإجابة.
| اسم | عمر | حالة |
|---|---|---|
| هارييت | ω 1 | ω 1 = 22 |
حيث يُفسَّر عمود الشرط على أنه لا يوجد صف إذا كان الشرط خاطئًا. واتضح أنه نظرًا لأن الصيغ في عمود الشرط لجدول c يمكن أن تكون صيغًا منطقية افتراضية عشوائية ، فإن خوارزمية لحل مشكلة ما إذا كان جدول c يمثل علاقة محددة ما لها تعقيد NP-كامل مشترك ، وبالتالي فهي ذات قيمة عملية ضئيلة.
لذا، يُفضّل مفهوم أضعف للتمثيل. قدّم إيمييلينسكي وليبسكي مفهوم التمثيل الضعيف ، الذي يسمح أساسًا للاستعلامات (المرفوعة) على بنية ما بإرجاع تمثيل فقط لمعلومات مؤكدة ، أي إذا كان صالحًا لجميع تجسيدات (نماذج) " العالم الممكن " لهذه البنية. وبشكل ملموس، تُعتبر البنية نظام تمثيل ضعيف إذا
يمثل الطرف الأيمن من المعادلة أعلاه المعلومات المؤكدة ، أي المعلومات التي يمكن استخراجها من قاعدة البيانات بغض النظر عن القيم المستخدمة لاستبدال القيم الفارغة. في المثال الذي تناولناه سابقًا، من السهل ملاحظة أن تقاطع جميع النماذج الممكنة (أي المعلومات المؤكدة) للاستعلام المحدد فارغٌ في الواقع، لأن الاستعلام (غير المُحسَّن) لا يُرجع أي صفوف للعلاقة EmpH37. وبشكلٍ أعم، أوضح إيمييلينسكي وليبسكي أن جداول كود تُعدّ نظام تمثيل ضعيفًا إذا اقتصرت لغة الاستعلام على الإسقاطات والاختيارات (وإعادة تسمية الأعمدة). مع ذلك، بمجرد إضافة عمليات الربط أو الاتحاد إلى لغة الاستعلام، تُفقد هذه الخاصية الضعيفة أيضًا، كما سيتضح في القسم التالي.WHEREAge=22
إذا أخذنا في الاعتبار عمليات الربط أو الاتحاد: فلا يوجد حتى تمثيل ضعيف
ضع في اعتبارك الاستعلام التالي على نفس جدول Codd Emp من القسم السابق:
حدد الاسم من جدول الموظفين حيث العمر = 22، ثم قم بدمجه مع تحديد الاسم من جدول الموظفين حيث العمر <> 22 .بغض النظر عن القيمة المحددة التي يختارها المرء لعمر NULLهارييت، فإن الاستعلام أعلاه سيعيد عمود الأسماء الكامل لأي نموذج من نماذج الموظفين ، ولكن عند تشغيل الاستعلام (المرفوع) على الموظف نفسه، ستكون هارييت مفقودة دائمًا، أي لدينا:
| نتيجة الاستعلام عن الموظفين : |
| نتيجة الاستعلام عن أي نموذج من نماذج الموظفين : |
|
وبالتالي، عند إضافة عمليات الاتحاد إلى لغة الاستعلام، لا تُعدّ جداول كود حتى نظام تمثيل ضعيف للمعلومات المفقودة، مما يعني أن الاستعلامات عليها لا تُبلغ حتى عن جميع المعلومات المؤكدة . لم يكن لدلالات عملية الاتحاد على القيم الفارغة أي دور في هذا الاستعلام. كانت طبيعة "النسيان" للاستعلامين الفرعيين كافية لضمان عدم الإبلاغ عن بعض المعلومات المؤكدة عند تشغيل الاستعلام المذكور أعلاه على جدول كود Emp.
بالنسبة لعمليات الربط الطبيعية ، فإن المثال المطلوب لإظهار أن بعض المعلومات قد لا يتم الإبلاغ عنها بواسطة استعلام ما يكون أكثر تعقيدًا بعض الشيء. لنفترض الجدول التالي
| F1 | F2 | F3 |
|---|---|---|
| 11 | NULL | 13 |
| 21 | NULL | 23 |
| 31 | 32 | 33 |
والاستعلام
SELECT F1 , F3 FROM ( SELECT F1 , F2 FROM J ) AS F12 NATURAL JOIN ( SELECT F2 , F3 FROM J ) AS F23 ;| نتيجة الاستعلام عن J: |
| نتيجة الاستعلام عن أي طراز من طرازات J: |
|
يكمن التفسير المنطقي لما حدث أعلاه في أن جداول كود التي تمثل الإسقاطات في الاستعلامات الفرعية تغفل حقيقة أن القيم الفارغة في العمودين F12.F2 وF23.F2 هي في الواقع نسخ من القيم الأصلية في الجدول J. تشير هذه الملاحظة إلى أن تحسينًا بسيطًا نسبيًا لجداول كود (والذي يعمل بشكل صحيح في هذا المثال) يتمثل في استخدام ثوابت سكولم (أي دوال سكولم التي هي أيضًا دوال ثابتة )، مثل ω12 و ω22 بدلًا من رمز فارغ واحد. هذا النهج، المسمى جداول v أو الجداول البسيطة، أقل تكلفة حسابيًا من جداول c المذكورة أعلاه. ومع ذلك، فهو لا يزال غير حل كامل للمعلومات غير الكاملة، بمعنى أن جداول v تمثل تمثيلًا ضعيفًا فقط للاستعلامات التي لا تستخدم أي نفي في الاختيار (ولا تستخدم أي فرق بين المجموعات أيضًا). المثال الأول الذي تم تناوله في هذا القسم يستخدم عبارة اختيار سلبية، لذا فهو أيضًا مثال على الحالات التي لا تُبلغ فيها استعلامات جداول v عن معلومات مؤكدة.WHEREAge<>22
تحقق من القيود والمفاتيح الخارجية
يتقاطع منطق SQL ثلاثي القيم مع لغة تعريف البيانات (DDL) بشكل أساسي في شكل قيود التحقق . يعمل قيد التحقق الموضوع على عمود وفقًا لمجموعة قواعد مختلفة قليلاً عن تلك الخاصة WHEREبعبارة DML. فبينما يجب أن تكون نتيجة عبارة DML WHEREصحيحة (True) للصف، يجب ألا تكون نتيجة قيد التحقق خاطئة (False). (من منظور منطقي، القيم المحددة هي صحيح (True) وغير معروف (Unknown)). هذا يعني أن قيد التحقق سينجح إذا كانت نتيجة التحقق إما صحيحًا (True) أو غير معروف (Unknown). سيمنع جدول المثال التالي، الذي يحتوي على قيد تحقق، إدخال أي قيم عددية صحيحة في العمود i ، ولكنه سيسمح بإدخال قيمة فارغة (Null) لأن نتيجة التحقق ستكون دائمًا غير معروف (Unknown) بالنسبة للقيم الفارغة. [ 19 ]
إنشاء جدول t ( i عدد صحيح ، قيد ck_i التحقق ( i < 0 AND i = 0 AND i > 0 ) );بسبب التغيير في القيم المُحددة بالنسبة لعبارة WHERE ، فإن قانون الوسط المرفوع، من منظور منطقي، يُعد تحصيل حاصل بالنسبة لقيود CHECK ، أي أنه ينجح دائمًا. علاوة على ذلك، بافتراض أن القيم الفارغة تُفسر على أنها قيم موجودة ولكنها غير معروفة، فإن بعض قيود CHECK الشاذة، مثل القيد المذكور أعلاه، تسمح بإدخال قيم فارغة لا يمكن استبدالها بأي قيمة غير فارغة.CHECK (p OR NOT p)
لتقييد عمود بحيث لا يقبل القيم الفارغة، NOT NULLيمكن تطبيق القيد الموضح في المثال أدناه. هذا NOT NULLالقيد مكافئ دلاليًا لقيد التحقق مع IS NOT NULLشرط.
إنشاء جدول t ( i عدد صحيح غير فارغ );بشكل افتراضي، تنجح قيود التحقق من المفاتيح الخارجية إذا كانت أي من الحقول في هذه المفاتيح فارغة (Null). على سبيل المثال، الجدول
إنشاء جدول الكتب ( العنوان VARCHAR ( 100 ), اسم عائلة المؤلف VARCHAR ( 20 ), اسم المؤلف الأول VARCHAR ( 20 ), مفتاح خارجي ( اسم عائلة المؤلف , اسم المؤلف الأول ) يشير إلى جدول المؤلفين ( اسم العائلة , الاسم الأول ));سيسمح هذا بإدراج صفوف حيث يكون اسم المؤلف الأخير أو اسمه الأول NULLفارغًا بغض النظر عن كيفية تعريف جدول المؤلفين أو محتوياته. بتعبير أدق، فإن وجود قيمة فارغة في أي من هذين الحقلين سيسمح بوجود أي قيمة في الحقل الآخر، حتى لو لم تكن موجودة في جدول المؤلفين. على سبيل المثال، إذا كان جدول المؤلفين يحتوي على اسم المؤلف الأخير فقط ('Doe', 'John')، فإن ('Smith', NULL)القيمة الفارغة ستفي بشرط المفتاح الخارجي. أضاف SQL-92 خيارين إضافيين لتضييق نطاق التطابقات في مثل هذه الحالات. إذا MATCH PARTIALتمت إضافة الخيار `--` بعد REFERENCESتعريف المفتاح الخارجي، فإن أي قيمة غير فارغة يجب أن تطابق المفتاح الخارجي، على سبيل المثال، ('Doe', NULL)ستظل القيمة الفارغة مطابقة، بينما ('Smith', NULL)لن تكون القيمة الفارغة مطابقة. أخيرًا، إذا MATCH FULLتمت إضافة الخيار ('Doe', NULL)`--`، فلن تطابق القيمة الفارغة الشرط أيضًا، بينما (NULL, NULL)ستظل القيمة الفارغة مطابقة.
ينضم الخارجي

NULLالتي تحل محل البيانات في النتائج. النتائج مأخوذة من Microsoft SQL Server ، كما هو موضح في SQL Server Management Studio.تُنتج عمليات الربط الخارجي في SQL ، بما في ذلك الربط الخارجي الأيسر والربط الخارجي الأيمن والربط الخارجي الكامل، قيمًا فارغة (Null) تلقائيًا كعناصر نائبة للقيم المفقودة في الجداول المرتبطة. فعلى سبيل المثال، في الربط الخارجي الأيسر، تُستبدل الصفوف المفقودة من الجدول الموجود على الجانب الأيمن من LEFT OUTER JOINعامل الربط بقيم فارغة. يستخدم المثال البسيط التالي جدولين لتوضيح كيفية إنتاج القيم الفارغة كعناصر نائبة في الربط الخارجي الأيسر.
يحتوي الجدول الأول ( الموظف ) على أرقام هوية الموظفين وأسمائهم، بينما يحتوي الجدول الثاني ( رقم الهاتف ) على أرقام هوية الموظفين وأرقام هواتفهم ذات الصلة ، كما هو موضح أدناه.
|
|
يقوم استعلام SQL النموذجي التالي بإجراء عملية ربط خارجي يساري على هذين الجدولين.
SELECT e.ID , e.LastName , e.FirstName , pn.Number FROM Employee e LEFT OUTER JOIN PhoneNumber pn ON e.ID = pn.ID ;توضح مجموعة النتائج التي تم إنشاؤها بواسطة هذا الاستعلام كيف يستخدم SQL Null كعنصر نائب للقيم المفقودة من الجدول الأيمن ( PhoneNumber )، كما هو موضح أدناه.
| بطاقة تعريف | اسم العائلة | الاسم الأول | رقم |
|---|---|---|---|
| 1 | جونسون | جو | 555-2323 |
| 2 | لويس | لاري | NULL |
| 3 | تومسون | توماس | 555-9876 |
| 4 | باترسون | باتريشيا | NULL |
الدوال التجميعية
تُعرّف لغة SQL دوال التجميع لتبسيط عمليات حساب التجميع على جانب الخادم للبيانات. باستثناء دالة التجميع COUNT(*)، تُجري جميع دوال التجميع خطوة حذف القيم الفارغة، بحيث لا تُدرج هذه القيم في النتيجة النهائية للحساب. [ 20 ]
لاحظ أن حذف القيمة الفارغة لا يُعادل استبدالها بالصفر. على سبيل المثال، في الجدول التالي، سيعطي AVG(i)(متوسط قيم ) نتيجة مختلفة عن نتيجة .iAVG(j)
| أنا | ج |
|---|---|
| 150 | 150 |
| 200 | 200 |
| 250 | 250 |
NULL | 0 |
هنا AVG(i)200 (متوسط 150 و200 و250)، بينما AVG(j)150 (متوسط 150 و200 و250 و0). ومن الآثار الجانبية المعروفة لهذا أن في لغة SQL، AVG(z)لا يُعادل ، SUM(z)/COUNT(*)بل يُعادل SUM(z)/COUNT(z). [ 4 ]
يمكن أن تكون نتيجة دالة التجميع فارغة (Null). إليك مثال:
حدد عدد ( * )، وأدنى ( e.Wage )، وأعلى ( e.Wage ) من جدول الموظفين e حيث يكون اسم العائلة e مشابهًا لـ ' % Jones%' ؛سيُخرج هذا الاستعلام دائمًا صفًا واحدًا فقط، يحسب عدد الموظفين الذين تحتوي ألقابهم على "جونز"، ويُظهر الحد الأدنى والحد الأقصى للأجور المُحددة لهؤلاء الموظفين. ولكن، ماذا لو لم يُطابق أي من الموظفين المعايير المُحددة؟ من المستحيل حساب الحد الأدنى أو الحد الأقصى لمجموعة فارغة ، لذا ستكون النتائج NULL، مما يُشير إلى عدم وجود إجابة. هذه ليست قيمة غير معروفة، بل هي قيمة فارغة تُمثل غياب قيمة. ستكون النتيجة كالتالي:
| عدد(*) | الحد الأدنى (الأجر الإلكتروني) | الحد الأقصى (الأجر الإلكتروني) |
|---|---|---|
| 0 | NULL | NULL |
عندما يتساوى عنصران فارغان: التجميع، والفرز، وبعض عمليات المجموعات
نظرًا لأن SQL:2003 يُعرّف جميع علامات Null على أنها غير متساوية، فقد استلزم الأمر تعريفًا خاصًا لتجميع قيم Null معًا عند تنفيذ عمليات معينة. يُعرّف SQL عبارة "أي قيمتين متساويتين، أو أي قيمتين Null" بأنها "غير مميزة". [ 21 ] يسمح هذا التعريف لـ " غير مميزة" لـ SQL بتجميع وفرز قيم Null عند GROUP BYاستخدام عبارة (أو ميزة أخرى في لغة SQL تُنفّذ التجميع).
تتضمن عمليات SQL الأخرى، والعبارات، والكلمات الرئيسية التي تستخدم تعريف "not distinct" في معالجتها للقيم الفارغة ما يلي:
- بند
PARTITION BYوظائف الترتيب والتقسيم مثلROW_NUMBER - تُعامل المعاملات
UNION،INTERSECTو ، وEXCEPT، القيم الفارغة على أنها متطابقة لأغراض مقارنة الصفوف/حذفها - الكلمة
DISTINCTالمفتاحية المستخدمة فيSELECTالاستعلامات
إن مبدأ عدم تساوي القيم الفارغة (بل كون النتيجة غير معروفة) يُنتهك فعليًا في مواصفات SQL للمعامل UNION، الذي يُعرّف القيم الفارغة ببعضها البعض. [ 1 ] ونتيجةً لذلك، قد تُنتج بعض عمليات المجموعات في SQL، مثل الاتحاد والفرق، نتائج لا تُمثل معلومات مؤكدة، على عكس العمليات التي تتضمن مقارنات صريحة مع القيمة الفارغة (مثل تلك الموجودة في WHEREعبارة a المذكورة أعلاه). في اقتراح كود لعام 1979 (الذي اعتمدته SQL92)، يُبرر هذا التناقض الدلالي بالقول إن إزالة التكرارات في عمليات المجموعات تحدث "بمستوى تفصيل أقل من اختبار المساواة في تقييم عمليات الاسترجاع". [ 11 ]
لا يُحدد معيار SQL ترتيب فرز افتراضيًا للقيم الفارغة (Null). بدلاً من ذلك، في الأنظمة المتوافقة، يمكن فرز القيم الفارغة قبل أو بعد جميع قيم البيانات باستخدام عبارات NULLS FIRST`or` NULLS LASTفي ORDER BYالقائمة، على التوالي. مع ذلك، لا تُفعّل جميع أنظمة إدارة قواعد البيانات هذه الوظيفة. وقد تُحدد الأنظمة التي لا تُفعّل هذه الوظيفة طرقًا مختلفة لفرز القيم الفارغة في نظام إدارة قواعد البيانات. [ 19 ]
التأثير على عملية الفهرسة
بعض منتجات SQL لا تقوم بفهرسة المفاتيح التي تحتوي على قيم NULL. على سبيل المثال، لم تكن إصدارات PostgreSQL السابقة للإصدار 8.3 تفعل ذلك، حيث تنص وثائق فهرس B-tree على ذلك [ 22 ]
تستطيع أشجار B التعامل مع استعلامات المساواة والنطاق على البيانات التي يمكن فرزها وفق ترتيب معين. على وجه الخصوص، سيأخذ مُخطط استعلامات PostgreSQL في الاعتبار استخدام فهرس شجرة B كلما تم استخدام عمود مفهرس في مقارنة باستخدام أحد هذه العوامل: < ≤ = ≥ >
يمكن أيضًا تنفيذ بنيات مكافئة لمجموعات هذه العوامل، مثل BETWEEN و IN، باستخدام بحث فهرس شجرة B. (لكن لاحظ أن IS NULL لا يكافئ = ولا يمكن فهرسته).
في الحالات التي يفرض فيها الفهرس التفرد، تُستبعد القيم الفارغة (NULL) من الفهرس، ولا يُفرض التفرد بين القيم الفارغة. وبالرجوع إلى وثائق PostgreSQL: [ 23 ]
عند تعريف فهرس فريد، لن يُسمح بوجود صفوف متعددة في الجدول ذات قيم مفهرسة متساوية. لا تُعتبر القيم الفارغة متساوية. يرفض الفهرس الفريد متعدد الأعمدة فقط الحالات التي تتساوى فيها جميع الأعمدة المفهرسة في صفين.
يتوافق هذا مع السلوك المحدد في SQL:2003 للمقارنات العددية الفارغة.
تتضمن طريقة أخرى لفهرسة القيم الفارغة التعامل معها على أنها غير مميزة وفقًا للسلوك المحدد في SQL:2003. على سبيل المثال، تنص وثائق Microsoft SQL Server على ما يلي: [ 24 ]
لأغراض الفهرسة، تُعتبر القيم الفارغة (NULL) متساوية. لذا، لا يمكن إنشاء فهرس فريد، أو قيد فريد، إذا كانت المفاتيح فارغة في أكثر من صف. حدد الأعمدة المُعرّفة على أنها غير فارغة (NOT NULL) عند اختيار أعمدة الفهرس الفريد أو القيد الفريد.
تتوافق كلتا استراتيجيتي الفهرسة هاتين مع سلوك القيم الفارغة (Nulls) المحدد في معيار SQL:2003. ولأن معيار SQL:2003 لا يُحدد منهجيات الفهرسة بشكل صريح، فإن تصميم استراتيجيات فهرسة القيم الفارغة وتنفيذها متروك بالكامل للموردين.
وظائف معالجة القيم الفارغة
تُعرّف لغة SQL دالتين للتعامل مع القيم الفارغة (Null) بشكل صريح: NULLIFو COALESCE. كلتا الدالتين اختصاران للتعبيرات التي يتم البحث عنهاCASE . [ 25 ]
NULLIF
تقبل الدالة NULLIFوسيطين. إذا كان الوسيط الأول مساوياً للوسيط الثاني، NULLIFفإنها تُرجع قيمة فارغة (Null). وإلا، فإنها تُرجع قيمة الوسيط الأول.
NULLIF ( value1 , value2 )وبالتالي، NULLIFفإن هذا اختصار للتعبير التالي CASE:
CASE WHEN value1 = value2 THEN NULL ELSE value1 ENDاندماج
تقبل الدالة COALESCEقائمة من المعاملات، وتعيد أول قيمة غير فارغة من القائمة:
COALESCE ( value1 , value2 , value3 , ...)COALESCEيُعرَّف هذا التعبير بأنه اختصار للتعبير التالي في لغة SQL CASE:
CASE WHEN value1 IS NOT NULL THEN value1 WHEN value2 IS NOT NULL THEN value2 WHEN value3 IS NOT NULL THEN value3 ... ENDتُطبّق بعض أنظمة إدارة قواعد البيانات SQL وظائف خاصة بالبائعين مشابهة لـ COALESCE. تُطبّق بعض الأنظمة (مثل Transact-SQL ) ISNULLوظيفة ، أو وظائف أخرى مشابهة وظيفيًا لـ COALESCE. (راجع Isقسم الوظائف لمزيد من المعلومات حول ISالوظائف في Transact-SQL).
NVL
تقبل دالة أوراكل NVLوسيطين. وتعيد الوسيط الأول غير الفارغ أو قيمة فارغة إذا كانت جميع الوسائط فارغة.
COALESCEيمكن تحويل التعبير إلى تعبير مكافئ على NVLالنحو التالي:
COALESCE ( val1 , ... , val { n } )يتحول إلى:
NVL ( val1 , NVL ( val2 , NVL ( val3 , … , NVL ( val { n - 1 } , val { n } ) … )))تتمثل إحدى حالات استخدام هذه الوظيفة في استبدال قيمة NULL في تعبير ما بقيمة مثل NVL(SALARY, 0)التي تقول، "إذا SALARYكانت NULL، فاستبدلها بالقيمة 0".
مع ذلك، ثمة استثناء ملحوظ. في معظم التطبيقات، COALESCEتُقيّم الدالة الأولى مُعاملاتها حتى تصل إلى أول مُعامل غير فارغ، بينما NVLتُقيّم الدالة الثانية جميع مُعاملاتها. وهذا مهم لعدة أسباب. فالمُعامل الذي يلي أول مُعامل غير فارغ قد يكون دالة، وهو ما قد يكون مُكلفًا حسابيًا، أو غير صالح، أو قد يُسبب آثارًا جانبية غير متوقعة.
تحديد نوع البيانات Null و Unknown
القيمة NULLالحرفية غير مُحددة النوع في لغة SQL، أي أنها لا تُصنف كعدد صحيح أو حرف أو أي نوع بيانات آخر . [ 26 ] ولهذا السبب، يكون من الضروري (أو المُستحسن) أحيانًا تحويل القيم الفارغة (Null) صراحةً إلى نوع بيانات مُحدد. على سبيل المثال، إذا كان نظام إدارة قواعد البيانات العلائقية (RDBMS) يدعم الدوال المُحمّلة بشكل زائد ، فقد لا تتمكن لغة SQL من تحديد الدالة الصحيحة تلقائيًا دون معرفة أنواع بيانات جميع المُعاملات، بما في ذلك تلك التي تُمرر لها قيمة فارغة (Null).
NULLيمكن تحويل القيمة الحرفية إلى قيمة فارغة (Null) من نوع محدد باستخدام الطريقة CASTالمُقدمة في SQL-92 . على سبيل المثال:
CAST ( NULL AS INTEGER )يمثل قيمة غائبة من النوع INTEGER.
يختلف نوع قيمة Unknown (سواء كانت مختلفة عن NULL أم لا) بين تطبيقات SQL المختلفة. على سبيل المثال، ما يلي
حدد 'ok' حيث ( NULL <> 1 ) IS NULL ;يُحلل هذا الكود ويُنفذ بنجاح في بعض البيئات (مثل SQLite أو PostgreSQL ) التي تُوحد قيمة NULL المنطقية مع Unknown، ولكنه يفشل في التحليل في بيئات أخرى (مثل SQL Server Compact ). يتصرف MySQL بشكل مشابه لـ PostgreSQL في هذا الصدد (مع استثناء بسيط يتمثل في أن MySQL لا يُفرق بين TRUE وFALSE وبين العددين الصحيحين 1 و0). بالإضافة إلى ذلك، يُنفذ PostgreSQL IS UNKNOWNدالة منطقية، يُمكن استخدامها لاختبار ما إذا كانت نتيجة منطقية ثلاثية القيم هي Unknown، على الرغم من أن هذا مجرد تحسين برمجي .
نوع البيانات المنطقية (BOOLEAN)
أدخل معيار ISO SQL:1999 نوع البيانات BOOLEAN إلى SQL؛ ومع ذلك، لا يزال مجرد ميزة اختيارية وغير أساسية، ومُرمز لها بـ T031. [ 27 ]
عند تقييد نوع NOT NULLالبيانات BOOLEAN في لغة SQL بقيد معين، فإنه يعمل تمامًا مثل نوع البيانات المنطقية في اللغات الأخرى. أما في حال عدم تقييده، فيمكن لنوع البيانات BOOLEAN، على الرغم من اسمه، أن يحمل القيم المنطقية TRUE وFALSE وUNKNOWN، والتي تُعرَّف جميعها كقيم منطقية حرفية وفقًا للمعيار. ويؤكد المعيار أيضًا أنه يمكن استخدام NULL وUNKNOWN بشكل تبادلي للدلالة على الشيء نفسه تمامًا. [ 28 ] [ 29 ]
لقد تعرض النوع المنطقي للنقد، لا سيما بسبب السلوك المفروض للحرف UNKNOWN، الذي لا يساوي نفسه أبدًا بسبب تعريفه مع NULL. [ 30 ]
كما ذُكر سابقًا، في تطبيق PostgreSQL للغة SQL ، يُستخدم Null لتمثيل جميع النتائج غير المعروفة (UNKNOWN)، بما في ذلك القيمة المنطقية غير المعروفة (UNKNOWN BOOLEAN). لا يدعم PostgreSQL القيمة الحرفية غير المعروفة (مع أنه يدعم عامل التشغيل IS UNKNOWN، وهي ميزة مستقلة). لا تدعم معظم الشركات الكبرى الأخرى النوع المنطقي (كما هو مُعرّف في T031) حتى عام 2012. [ 31 ] مع ذلك، يدعم الجزء الإجرائي من PL/SQL الخاص بـ Oracle المتغيرات المنطقية؛ ويمكن أيضًا إسناد القيمة NULL إليها، وتُعتبر القيمة مُماثلة للقيمة غير المعروفة. [ 32 ]
الجدل
الأخطاء الشائعة
يُعدّ سوء فهم آلية عمل القيمة الفارغة (Null) سببًا رئيسيًا للعديد من الأخطاء في أكواد SQL، سواءً في عبارات SQL القياسية (ISO) أو في لهجات SQL الخاصة التي تدعمها أنظمة إدارة قواعد البيانات. عادةً ما تنتج هذه الأخطاء عن الخلط بين القيمة الفارغة (Null) والصفر (0) أو السلسلة النصية الفارغة (قيمة نصية طولها صفر، تُمثل في SQL بالرمز 0 ''). مع ذلك، يُعرّف معيار SQL القيمة الفارغة (Null) بأنها تختلف عن كلٍّ من السلسلة النصية الفارغة والقيمة العددية 00. فبينما تُشير القيمة الفارغة (Null) إلى غياب أي قيمة، تُمثل كلٌّ من السلسلة النصية الفارغة والصفر قيمًا فعلية.
من الأخطاء الشائعة محاولة استخدام عامل المساواة (equals) =مع الكلمة المفتاحية NULLللبحث عن صفوف تحتوي على قيم فارغة (Null). وفقًا لمعيار SQL، يُعدّ هذا تركيبًا غير صالح، ويؤدي إلى ظهور رسالة خطأ أو استثناء. مع ذلك، تقبل معظم التطبيقات هذا التركيب وتُقيّم هذه التعبيرات على أنها UNKNOWNفارغة. والنتيجة هي عدم العثور على أي صفوف، بغض النظر عن وجود صفوف تحتوي على قيم فارغة أم لا. الطريقة المُقترحة لاسترجاع الصفوف التي تحتوي على قيم فارغة هي استخدام الشرط IS NULLبدلاً من ذلك = NULL.
SELECT * FROM sometable WHERE num = NULL ; -- يجب أن يكون "WHERE num IS NULL"في مثال ذي صلة، ولكنه أكثر دقة، WHEREقد تقارن عبارة شرطية قيمة عمود ما بقيمة ثابتة. يُفترض خطأً في كثير من الأحيان أن القيمة المفقودة ستكون "أقل من" أو "لا تساوي" قيمة ثابتة إذا كان الحقل يحتوي على قيمة فارغة (Null)، ولكن في الواقع، تُرجع هذه التعبيرات قيمة غير معروفة (Unknown). مثال على ذلك موضح أدناه:
SELECT * FROM sometable WHERE num <> 1 ; -- لن يتم إرجاع الصفوف التي يكون فيها num فارغًا، -- على عكس توقعات العديد من المستخدمين.تنشأ هذه الالتباسات لأن قانون الهوية مقيد في منطق لغة SQL. فعند التعامل مع مقارنات المساواة باستخدام القيمة NULLالحرفية أو UNKNOWNقيمة الصواب، ستُرجع SQL دائمًا قيمة معينة UNKNOWNكنتيجة للتعبير. هذه علاقة تكافؤ جزئي ، مما يجعل SQL مثالًا على المنطق غير الانعكاسي . [ 33 ]
وبالمثل، غالبًا ما يُخلط بين القيم الفارغة (Null) والسلاسل النصية الفارغة. لنأخذ مثالًا على ذلك LENGTHالدالة التي تُعيد عدد الأحرف في سلسلة نصية. عند تمرير قيمة فارغة (Null) إلى هذه الدالة، فإنها تُعيد قيمة فارغة (Null). قد يؤدي هذا إلى نتائج غير متوقعة إذا لم يكن المستخدمون على دراية كافية بمنطق القيم الثلاثية. مثال على ذلك موضح أدناه:
SELECT * FROM sometable WHERE LENGTH ( string ) < 20 ; -- لن يتم إرجاع الصفوف التي تكون فيها قيمة السلسلة فارغة (NULL).ويزداد الأمر تعقيداً بسبب حقيقة أنه في بعض برامج واجهة قواعد البيانات (أو حتى تطبيقات قواعد البيانات مثل Oracle)، يتم الإبلاغ عن NULL كسلسلة فارغة، وقد يتم تخزين السلاسل الفارغة بشكل غير صحيح على أنها NULL.
الانتقادات
يُعدّ تطبيق معيار ISO SQL لقيمة Null موضع انتقاد ونقاش ودعوات للتغيير. في كتابه "النموذج العلائقي لإدارة قواعد البيانات: الإصدار 2" ، اقترح كود أن تطبيق SQL لقيمة Null معيب ويجب استبداله بعلامتين مختلفتين من نوع Null. تمثلت العلامتان اللتان اقترحهما في "مفقود ولكن قابل للتطبيق" و "مفقود ولكن غير قابل للتطبيق" ، والمعروفتان بقيم A وقيم I على التوالي. لو قُبل اقتراح كود، لكان سيتطلب تطبيق منطق رباعي القيم في SQL. [ 5 ] واقترح آخرون إضافة علامات Null إضافية إلى اقتراح كود للإشارة إلى المزيد من الأسباب التي قد تجعل قيمة البيانات "مفقودة"، مما يزيد من تعقيد نظام منطق SQL. كما طُرحت في أوقات مختلفة مقترحات لتطبيق علامات Null متعددة مُعرّفة من قِبل المستخدم في SQL. ونظرًا لتعقيد أنظمة معالجة Null والمنطق اللازمة لدعم علامات Null متعددة، لم يحظَ أي من هذه المقترحات بقبول واسع النطاق.
اقترح كريس ديت وهيو داروين ، مؤلفا البيان الثالث ، أن تطبيق SQL Null معيبٌ بطبيعته ويجب إلغاؤه تمامًا، [ 34 ] مشيرين إلى التناقضات والعيوب في تطبيق معالجة القيم الفارغة في SQL (خاصةً في الدوال التجميعية) كدليل على أن مفهوم القيمة الفارغة برمته معيب ويجب إزالته من النموذج العلائقي. [ 35 ] بينما صرّح آخرون، مثل الكاتب فابيان باسكال ، بأنهم يعتقدون أن "كيفية تعامل حساب الدالة مع القيم المفقودة لا يخضع للنموذج العلائقي".
افتراض العالم المغلق
من نقاط الخلاف الأخرى المتعلقة بالقيم الفارغة (Nulls) أنها تُخالف نموذج افتراض العالم المغلق لقواعد البيانات العلائقية، وذلك بإدخالها افتراض العالم المفتوح . [ 36 ] ينص افتراض العالم المغلق، فيما يتعلق بقواعد البيانات، على أن "كل ما تُشير إليه قاعدة البيانات، صراحةً أو ضمنًا، صحيح؛ وكل ما عدا ذلك خاطئ". [ 37 ] يفترض هذا الرأي أن معرفة العالم المخزنة داخل قاعدة البيانات كاملة. أما القيم الفارغة، فتُعامل وفقًا لافتراض العالم المفتوح، حيث تُعتبر بعض العناصر المخزنة في قاعدة البيانات غير معروفة، مما يجعل معرفة العالم المخزنة في قاعدة البيانات غير كاملة.
انظر أيضاً
مراجع
- 1 2 3 4 رون فان دير ميدن، " المناهج المنطقية للمعلومات غير الكاملة: دراسة استقصائية " في تشوميكي، يان؛ ساكه، غونتر (محرران) منطق قواعد البيانات ونظم المعلومات ، دار نشر كلوير الأكاديمية ، رقم ISBN 978-0-7923-8129-7، ص 344؛ نسخة ما قبل النشر (ملاحظة: يختلف ترقيم الصفحات في نسخة ما قبل النشر عن النسخة المنشورة)
- ↑ كود، إي إف (14 أكتوبر 1985). "هل قاعدة بياناتك علائقية حقًا؟". كمبيوتر وورلد .
- ↑ كود، إي إف (21 أكتوبر 1985). "هل يعمل نظام إدارة قواعد البيانات الخاص بك وفقًا للقواعد؟". كمبيوتر وورلد .
- 1 2 تشامبرلين، دون (1998). دليل شامل لقاعدة بيانات DB2 العالمية . مورغان كوفمان. الصفحات 28-32 . ISBN 978-1-55860-482-7.
- 1 2 كود، إي إف (1990). النموذج العلائقي لإدارة قواعد البيانات (الطبعة الثانية ). شركة أديسون ويسلي للنشر . ISBN 978-0-201-14192-4.
- 1 2 ISO/IEC (2003). ISO/IEC 9075-2:2003، "SQL/Foundation" . ISO/IEC. القسم 6.2.6: تعابير القيم العددية ..
- ↑ ISO/IEC (2003). ISO/IEC 9075-2:2003، "SQL/Foundation" . ISO/IEC. القسم 6.2.8: تعبير قيمة السلسلة النصية .
- ↑ "التعامل مع السلاسل النصية الفارغة عند الترحيل من أوراكل إلى بوستجريس كيو إل | مدونة قواعد بيانات AWS" . aws.amazon.com . 2022-05-23 . تاريخ الاسترجاع: 2023-12-30 .
- ↑ ISO/IEC (2003). ISO/IEC 9075-1:2003، "SQL/Framework" . ISO/IEC. القسم 4.4.2: القيمة الفارغة .
- 1 2 كولز، مايكل (27 يونيو 2005). "أربع قواعد للقيم الفارغة" . مركز خادم SQL . شركة ريد جيت للبرمجيات.
- 1 2 هانز-يواكيم، ك. (2003). "القيم الفارغة في قواعد البيانات العلائقية وإجابات المعلومات المؤكدة" . دلالات قواعد البيانات. ورشة العمل الدولية الثانية، قلعة داغشتول، ألمانيا، 7-12 يناير 2001. أوراق منقحة . سلسلة محاضرات في علوم الحاسوب. المجلد 2582. الصفحات 119-138 . doi : 10.1007/3-540-36596-6_7 . ISBN 978-3-540-00957-3أُرشف من المصدر الأصلي بتاريخ 7 يوليو 2018. تم الاطلاع عليه بتاريخ 28 أغسطس 2015 .
- ↑ ISO/IEC (2003). ISO/IEC 9075-2:2003، "SQL/Foundation" . ISO/IEC. القسم 8.7: المسند الفارغ .
- ↑ سي جيه ديت (2004)، مقدمة في أنظمة قواعد البيانات ، الطبعة الثامنة، بيرسون للتعليم، ص 594
- ↑ ميلتون، جيم؛ سيمون، آلان ر. (1993). فهم لغة SQL الجديدة: دليل شامل . مورغان كوفمان. الصفحات 145-147 . ISBN 978-1-55860-245-8.
- ↑ سي جيه ديت، كتابات قواعد البيانات العلائقية، 1991-1994 ، أديسون-ويسلي، 1995، ص 371
- ↑ سي جيه ديت (2004)، مقدمة في أنظمة قواعد البيانات ، الطبعة الثامنة، بيرسون للتعليم، ص 584
- ↑ إيميلينسكي، ت .؛ ليبسكي، و. الابن (1984). "المعلومات غير الكاملة في قواعد البيانات العلائقية" . مجلة ACM . 31 (4): 761-791 . doi : 10.1145/1634.1886 . S2CID 288040 .
- ↑ أبيتبول، سيرج ؛ هول، ريتشارد ب .؛ فيانو، فيكتور (1995). أسس قواعد البيانات . أديسون-ويسلي. ISBN 978-0-201-53771-0.
- 1 2 كولز، مايكل (26 فبراير 2007). "Null مقابل Null؟" . مركز خادم SQL . شركة Red Gate Software.
- ↑ ISO/IEC (2003). ISO/IEC 9075-2:2003، "SQL/Foundation" . ISO/IEC. القسم 4.15.4: الدوال التجميعية .
- ↑ ISO/IEC (2003). ISO/IEC 9075-2:2003، "SQL/Foundation" . ISO/IEC. القسم 3.1.6.8: التعريفات: مميز .
- ↑ "وثائق PostgreSQL 8.0.14: أنواع الفهارس" . PostgreSQL . تم الاطلاع عليه بتاريخ 6 نوفمبر 2008 .
- ↑ "وثائق PostgreSQL 8.0.14: الفهارس الفريدة" . PostgreSQL . تم الاطلاع عليه في 6 نوفمبر 2008 .
- ↑ "إنشاء فهارس فريدة" . PostfreSQL. سبتمبر 2007. تم الاطلاع عليه في 6 نوفمبر 2008 .
- ↑ ISO/IEC (2003). ISO/IEC 9075-2:2003، "SQL/Foundation" . ISO/IEC. القسم 6.11: تعبير الحالة .
- ↑ ميلتون ، جيم؛ سيمون، آلان ر. (2002). SQL:1999: فهم مكونات لغة العلاقات . مورغان كوفمان. ص 53. ISBN 978-1-55860-456-8.
- ↑ "معيار SQL ISO/IEC 9075-1:1999". المنظمة الدولية للمقاييس. 1999.
{{cite web}}: مفقود أو فارغ|url=( مساعدة ) - ↑ ديت، سي. (2011). لغة SQL ونظرية العلاقات: كيفية كتابة كود SQL دقيق . دار نشر أورايلي ميديا، ص 83. ISBN 978-1-4493-1640-2.
- ↑ ISO/IEC 9075-2:2011 §4.5
- ↑ بريغمور، مارتن (2007). مقدمة في قواعد البيانات مع تطبيقات الويب . بيرسون للتعليم كندا. ص 197. ISBN 978-0-321-26359-9.
- ↑ ترولز أرفين، مسح لتنفيذ نوع البيانات المنطقية
- ↑ فويرشتاين، ستيفن؛ بريبيل، بيل (2009). برمجة أوراكل PL/SQL . دار نشر أورايلي ميديا، ص 74، 91. ISBN 978-0-596-51446-4.
- ^ أرنهارت ، كراوس (2012) ، “المنطق الكلاسيكي أو المنطق غير الانعكاسي؟ حالة من النقص الدلالي”، Revista Portuguesa de Filosofia ، 68 (1/2): 73–86 ، دوى : 10.17990/RPF/2012_68_1_0073 ، JSTOR 41955624 .
- ↑ داروين، هيو ؛ ديت، كريس . "البيان الثالث" . thethirdmanifesto.com . تم الاطلاع عليه بتاريخ 29 مايو 2007 .
- ↑ داروين، هيو . "الجدار المائل" (ملف PDF) . dcs.warwick.ac.uk . تم الاطلاع عليه بتاريخ 29 مايو 2007 .
- ↑ ديت، كريس (مايو 2005). قواعد البيانات المتعمقة: النظرية العلائقية للممارسين . دار نشر أورايلي ميديا، ص 73. ISBN 978-0-596-10012-4.
- ↑ ديت، كريس . "ملخص: فرضية العالم المغلق" . جمعية إدارة البيانات ، فرع منطقة خليج سان فرانسيسكو. مؤرشف من الأصل بتاريخ 19 مايو 2007. تم الاطلاع عليه بتاريخ 29 مايو 2007 .
للمزيد من القراءة
- إي إف كود. فهم العلاقات (الجزء السابع). نشرة FDT التابعة لـ ACM-SIGMOD، 7(3-4):23–28، 1975.
- كود، إي إف (1979). "توسيع نموذج قواعد البيانات العلائقية لاستيعاب المزيد من المعاني". معاملات ACM لأنظمة قواعد البيانات . 4 (4): 397-434 . CiteSeerX 10.1.1.508.5701 . doi : 10.1145/320107.320109 . S2CID 17517212 . وخاصة الفقرة 2.3.
- ديت، سي جيه (2000). نموذج قواعد البيانات العلائقية: مراجعة وتحليل استعاديان: سرد تاريخي وتقييم لمساهمة إي إف كود في مجال تكنولوجيا قواعد البيانات . أديسون ويسلي لونجمان . ISBN 978-0-201-61294-3.
- كلاين، هانز-يواكيم (1994). "كيفية تعديل استعلامات SQL لضمان الحصول على إجابات مؤكدة" . سجل ACM SIGMOD . 23 (3): 14-20 . doi : 10.1145/187436.187445 . S2CID 17354724 .
- كلود روبنسون، القيم الفارغة، والمنطق ثلاثي القيم، والغموض في لغة SQL: نقد نقد التاريخ، مؤرشف في 2016-03-05 على Wayback Machine ، سجل SIGMOD، ديسمبر 2007 (المجلد 36، العدد 4)
- جون جرانت، القيم الفارغة في لغة SQL . سجل SIGMOD، سبتمبر 2008 (المجلد 37، العدد 3)
- وارابورن، نارونغريت، وكريينغكراي بوركايو. " دلالات القيم الفارغة للاستعلامات الفرعية والمسندات الذرية ". المجلة الدولية لعلوم الحاسوب التابعة للجمعية الدولية لمهندسي الهندسة 35.3 (2008): 305-313.
- تالهايم، برنارد؛ شيف، كلاوس-ديتر (2011). "جبر ومنطق القيم الصفرية" . آفاق في الذكاء الاصطناعي وتطبيقاته . 225 (نمذجة المعلومات وقواعد المعرفة XXII). doi : 10.3233/978-1-60750-690-4-354 .
- إنريكو فرانكوني وسيرجيو تيساريس، حول منطق القيم الفارغة في لغة SQL ، وقائع ورشة عمل ألبرتو مندلسون الدولية السادسة حول أسس إدارة البيانات، أورو بريتو، البرازيل، 27-30 يونيو 2012، الصفحات 114-128
روابط خارجية
- تم أرشفة بيانات Oracle NULL بتاريخ 12 أبريل 2013 على موقع Wayback Machine .
- البيان الثالث
- آثار القيم الفارغة في تسلسل البيانات
- تقرير خطأ في جافا يتعلق بعدم تمييز jdbc بين القيم الفارغة والسلاسل النصية الفارغة، والذي أغلقته شركة Sun باعتباره "ليس خطأً".
- كلمات SQL الرئيسية
- محتوى غير معروف
