यहाँ मैं अपनी स्थिति स्पष्ट रूप से स्पष्ट करूँगा।
वह NULL = NULL
मूल्यांकन FALSE
गलत है। हैकर और मिस्टर ने सही उत्तर दिया NULL
। यहाँ क्यों है। ड्वेन क्रिस्टेन्सन ने स्कॉट इवे को एक टिप्पणी में मुझे लिखा :
चूंकि यह दिसंबर है, चलो एक मौसमी उदाहरण का उपयोग करें। मेरे पास पेड़ के नीचे दो पर्चे हैं। अब, आप मुझे बताएं कि मुझे एक ही चीज़ के दो या नहीं मिले।
वे अलग हो सकते हैं या वे समान हो सकते हैं, आप तब तक नहीं जानते जब तक कि दोनों प्रस्तुत नहीं करते। कौन जानता है? दुर्लभ है, लेकिन असंभव नहीं - आप दो लोगों को है कि एक दूसरे को जानते नहीं है और दोनों आप के लिए एक ही उपहार किया है आमंत्रित § ।
तो सवाल: क्या ये दोनों UNKNOWN समान (बराबर, =) प्रस्तुत करते हैं? सही उत्तर है: UNKNOWN (यानी NULL
)।
इस उदाहरण को प्रदर्शित करने का इरादा था कि ".. ( false
या null
, आपके सिस्टम पर निर्भर करता है) .." एक सही उत्तर है - यह नहीं है, केवल NULL
3VL में सही है (या आपके लिए एक सिस्टम स्वीकार करना ठीक है जो गलत उत्तर देता है? )
इस सवाल का एक सही जवाब इस दो बिंदुओं पर जोर देना चाहिए:
- तीन-मूल्यवान तर्क (3VL) प्रतिसंतुलित है (देखें कि इस विषय पर अनगिनत अन्य प्रश्न स्टैकओवरफ़्लो और अन्य फोरम में सुनिश्चित करने के लिए);
- SQL- आधारित DBMSes अक्सर 3VL का भी सम्मान नहीं करते हैं, वे कभी-कभी गलत उत्तर देते हैं (जैसे, मूल पोस्टर मुखर, SQL सर्वर इस मामले में करते हैं)।
इसलिए मैं दोहराता हूं: एसक्यूएल समानता के प्रतिवर्तित संपत्ति की व्याख्या करने के लिए किसी को मजबूर नहीं करता है, जो यह बताता है:
for any x, x = x
§§ (सादा अंग्रेजी में: जो कुछ भी प्रवचन के ब्रह्मांड, एक "बात" हमेशा खुद के बराबर है )।
.. एक 3VL में ( TRUE
, FALSE
, NULL
)। लोगों की उम्मीद 2VL ( TRUE
, FALSE
जो कि SQL में भी अन्य सभी मूल्यों के लिए मान्य है) के अनुरूप होगी , अर्थात x = x
हमेशा TRUE
x के किसी भी संभावित मूल्य के लिए मूल्यांकन करें - कोई अपवाद नहीं।
यह भी ध्यान दें कि NULLs " गैर-मूल्य " मान्य हैं (जैसा कि उनके अपोलॉजिस्ट उन्हें होने का दिखावा करते हैं) जो कि रिलेशन चर के हिस्से के रूप में विशेषता मान (??) के रूप में असाइन कर सकते हैं। इसलिए वे हर प्रकार (डोमेन) के स्वीकार्य मूल्य हैं, न केवल तार्किक अभिव्यक्तियों के प्रकार के।
और यह मेरी बात थी : NULL
मूल्य के रूप में, एक "अजीब जानवर" है। व्यंजना के बिना, मैं कहना पसंद करता हूं: बकवास ।
मुझे लगता है कि यह सूत्रीकरण अधिक स्पष्ट और कम बहस योग्य है - मेरी खराब अंग्रेजी दक्षता के लिए खेद है।
यह केवल है एक NULLs की समस्याओं में से। जब संभव हो, पूरी तरह से उनसे बचने के लिए बेहतर है।
§ हम यहां मूल्यों के बारे में चिंतित हैं, इसलिए यह तथ्य कि दो प्रस्तुतियां हमेशा दो अलग-अलग भौतिक वस्तुएं हैं, एक वैध आपत्ति नहीं हैं; यदि आप आश्वस्त नहीं हैं कि मैं माफी चाहता हूँ, तो यह मूल्य और "ऑब्जेक्ट" शब्दार्थ के बीच के अंतर को समझाने का स्थान नहीं है (संबंधपरक बीजगणित में शुरू से ही मूल्य शब्दार्थ है - कोड के सूचना सिद्धांत को देखें; मुझे लगता है कि कुछ SQL DBST कार्यान्वयनकर्ता डॉन हैं; 'एक सामान्य शब्दार्थ के बारे में भी परवाह नहीं है)।
§§ मेरी जानकारी के लिए, इस एक स्वयंसिद्ध को स्वीकार कर लिया है (एक या किसी अन्य रूप में, लेकिन हमेशा एक 2VL में व्याख्या) प्राचीन काल से और कहा कि वास्तव में इतना सहज है, क्योंकि। 3VLs (वास्तव में लॉजिक्स का एक परिवार है) एक बहुत अधिक हालिया विकास है (लेकिन मुझे यकीन नहीं है कि जब पहली बार विकसित किया गया था)।
साइड नोट: यदि कोई SQL NULLs को सही ठहराने के प्रयासों के रूप में बॉटम , यूनिट और ऑप्शन टाइप्स को पेश करेगा , तो मैं काफी विस्तृत परीक्षा के बाद ही आश्वस्त हो जाऊंगा कि कैसे NULLs के साथ SQL कार्यान्वयन में ध्वनि प्रकार की व्यवस्था होगी और अंत में स्पष्ट करेंगे। क्या NULLs (ये "मूल्य-नहीं-काफी-मूल्य") वास्तव में हैं।
किस अनुसरण में मैं कुछ लेखकों को उद्धृत करूंगा। कोई त्रुटि या चूक शायद मेरी है और मूल लेखकों की नहीं।
SQL NULLs पर जो सेल्को
मैं देखता हूं कि जो सेल्को अक्सर इस मंच पर उद्धृत किया जाता है। जाहिर तौर पर वह यहां बहुत सम्मानित लेखक हैं। इसलिए, मैंने अपने आप से कहा: "उसने SQL NULLs के बारे में क्या लिखा है? वह NULLs को कई समस्याओं के बारे में कैसे समझाता है?"। मेरे एक मित्र के पास स्मार्टियों के लिए जो सेल्को एसक्यूएल का ईबुक संस्करण है : उन्नत एसक्यूएल प्रोग्रामिंग, तीसरा संस्करण । चलो देखते हैं।
सबसे पहले, सामग्री की तालिका। जो चीज मुझे सबसे ज्यादा चौंकाती है, वह है NULL का उल्लेख और सबसे विविध संदर्भों में कई बार:
3.4 अंकगणित और NULLs 109
3.5 परिवर्तित मानों से और NULL 110
3.5.1 NULLIF () फ़ंक्शन 110
6 NULLs: SQL 185 में तुलनात्मक डेटा अनुपलब्ध है।
NULLs 190
6.5 NULLs और तर्क
190.1 उपकुंजी उपकुंजी में NULLS 191
6.5.2 मानक एसक्यूएल सॉल्यूशंस 193
6.6 मैथ एंड नेल्स 193
6.7 फंक्शन्स और नेल्स 193
6.8 नेल्स और होस्ट लैंग्वेजेज 194
6.9 नेल्स के लिए डिजाइन 1956
6.9.1 मेज़बान प्रोग्राम्स 197
6.10 से NULLs से बचना मल्टीपल फुल वैल्यूज़ 198
10.1 ए नोट पर NULL प्रेडेट 241
10.1 होस्ट करें । NULLs 242 के 1 स्रोत
...
और इसी तरह। यह मेरे लिए "गंदा विशेष मामला" है।
मैं इस पुस्तक के कुछ अंशों के साथ इस पुस्तक के अंशों में जाऊँगा, जो अपने आप को कॉपीराइट कारणों से, आवश्यक तक सीमित रखने की कोशिश कर रहे हैं। मुझे लगता है कि ये उद्धरण "उचित उपयोग" सिद्धांत के भीतर आते हैं और वे पुस्तक खरीदने के लिए उत्तेजित भी कर सकते हैं - इसलिए मुझे उम्मीद है कि कोई भी शिकायत नहीं करेगा (अन्यथा मुझे सबसे अधिक इसे हटाने की आवश्यकता होगी, यदि सभी नहीं)। इसके अलावा, मैं उसी कारण से कोड स्निपेट की रिपोर्टिंग से बचना चाहूंगा। उसके लिए माफ़ करना। डेटॉल किए गए तर्क के बारे में पढ़ने के लिए किताब खरीदें।
कोष्ठक के बीच पृष्ठ संख्याएँ क्या अनुसरण करती हैं।
पूर्ण बाधा नहीं (11)
सबसे महत्वपूर्ण स्तंभ बाधा नहीं है NULL, जो किसी स्तंभ में NULL के उपयोग को मना करता है। इस बाधा का नियमित उपयोग करें, और इसे तभी हटाएं जब आपके पास अच्छा कारण हो। जब आप डेटा के विरुद्ध प्रश्न करते हैं तो यह आपको NULL मान की जटिलताओं से बचने में मदद करेगा ।
यह एक मूल्य नहीं है ; यह एक ऐसा मार्कर है जो एक ऐसी जगह रखता है जहां एक मान जा सकता है।
फिर इस "मूल्य लेकिन काफी मूल्य नहीं" बकवास। बाकी मुझे काफी समझदार लगता है।
(12)
संक्षेप में, NULLs SQL में कई अनियमित सुविधाओं का कारण बनता है, जिसकी चर्चा हम बाद में करेंगे। जब आप उनसे बच नहीं सकते तो आपकी सबसे अच्छी शर्त केवल स्थितियों और NULLs के नियमों को याद रखना है।
SQL, NULLs और अनंत के Apropos:
(१०४) अध्याय ३: SQL में NUMERIC DATA
एसक्यूएल ने कई कारणों से गणित के लिए IEEE मॉडल को स्वीकार नहीं किया है।
...
यदि SQL में गणित के लिए IEEE नियमों की अनुमति थी, तो हमें रूपांतरण के बाद टाइप रूपांतरण नियमों की आवश्यकता होगी और रूपांतरण के बाद एक अनंत सटीक संख्यात्मक मान का प्रतिनिधित्व करने का एक तरीका होगा। लोगों को NULLs से काफी परेशानी है, तो चलो वहाँ नहीं जाते हैं।
SQL क्रियान्वयन इस बात पर अनिर्णीत है कि NULL वास्तव में विशेष संदर्भों में क्या मायने रखता है:
3.6.2 घातीय कार्य (116)
समस्या यह है कि लघुगणक अपरिभाषित होते हैं जब (x <= 0)। कुछ SQL कार्यान्वयन एक त्रुटि संदेश लौटाते हैं, कुछ NULL और DB2 / 400 लौटाते हैं ; इसके परिणाम के रूप में संस्करण 3 रिलीज़ 1 लौटा * NEGINF ("नकारात्मक अनंत" के लिए छोटा)।
डेविड सेगवरन और CJ दिनांक के हवाले से जो सेल्को:
6 NULLs: SQL में लापता डेटा (185)
अपनी पुस्तक ए गाइड टू साइबेस एंड एसक्यूएल सर्वर , डेविड मैकगवरन और सीजे डेट ने कहा: "यह इस लेखक की राय है कि NULLs की तुलना में कम से कम वर्तमान में एसक्यूएल में परिभाषित और कार्यान्वित किया जाता है, इससे कहीं अधिक परेशानी होती है कि वे लायक हैं और इससे बचा जाना चाहिए; वे बहुत अजीब और असंगत व्यवहार प्रदर्शित करते हैं और त्रुटि और भ्रम का एक समृद्ध स्रोत हो सकते हैं। (कृपया ध्यान दें कि ये टिप्पणियां और आलोचनाएँ किसी भी प्रणाली पर लागू होती हैं जो SQL- शैली NULLs का समर्थन करती हैं, विशेष रूप से SQL सर्वर के लिए नहीं।)
नशा एक नशा के रूप में :
(186/187)
इस पुस्तक के बाकी हिस्सों में, मैं आपसे उनका उपयोग न करने का आग्रह करूंगा , जो विरोधाभासी लग सकता है, लेकिन ऐसा नहीं है। एक नाल के रूप में एक दवा के बारे में सोचो; इसे ठीक से उपयोग करें और यह आपके लिए काम करता है, लेकिन इसका दुरुपयोग करें और यह सब कुछ बर्बाद कर सकता है। आपकी सबसे अच्छी नीति यह है कि जब आप कर सकते हैं तो NULL से बचें और जब आप उन्हें ठीक से उपयोग करें।
यहां मेरी अनूठी आपत्ति "उन्हें ठीक से उपयोग करना" है, जो विशिष्ट कार्यान्वयन व्यवहारों के साथ बुरी तरह से बातचीत करता है।
५.५.१ उप-क्षेत्र में उपनिवेश (१ ९ १ / १ ९ २)
लोग भूल जाते हैं कि एक उपश्रेणी अक्सर NULL के साथ तुलना छिपाती है। इन दो तालिकाओं पर विचार करें:
...
रिजल्ट खाली होगा। यह प्रतिवाद है , लेकिन सही है।
(विभाजक)
6.5.2 मानक SQL समाधान (193)
SQL-92 ने 3VL (थ्री-वैल्यूड लॉजिक) की कुछ समस्याओं को फॉर्म के एक नए विधेय को जोड़कर हल किया:
<खोज स्थिति> IS [NOT] TRUE | FALSE | अनजान
लेकिन UNKNOWN अपने आप में समस्याओं का एक स्रोत है, इसलिए कि CJ दिनांक, नीचे दी गई अपनी पुस्तक में अध्याय 4.5 में दी गई है। SQL में नल से बचना :
- किसी भी संदर्भ में कीवर्ड का उपयोग न करें।
UNKNOWN पर "ASIDE" पढ़ें , नीचे भी लिंक किया गया है।
6.8 NULLs और होस्ट भाषा (194)
हालाँकि, आपको पता होना चाहिए कि जब उन्हें होस्ट प्रोग्राम में पास करना होता है तो NULL को कैसे हैंडल किया जाता है। कोई मानक होस्ट भाषा जिसके लिए एक एम्बेडिंग परिभाषित है, NULLs का समर्थन करती है, जो आपके डेटाबेस स्कीमा में उनके उपयोग से बचने का एक और अच्छा कारण है।
(विभाजक)
6.9 NULLs के लिए डिज़ाइन सलाह (195)
जब भी संभव हो, सभी स्तंभों पर NOT NULL बाधाओं के साथ अपने सभी बेस टेबल को घोषित करना एक अच्छा विचार है। NULLs उन लोगों को भ्रमित करते हैं जो SQL नहीं जानते हैं, और NULLs महंगे हैं।
आपत्ति: NULLs ऐसे लोगों को भी भ्रमित करता है जो SQL को अच्छी तरह से जानते हैं, नीचे देखें।
(195)
NULLs को FOREIGN KEY में टाला जाना चाहिए। एसक्यूएल इसे "संदेह का लाभ" रिश्ते की अनुमति देता है, लेकिन इससे उन प्रश्नों में जानकारी का नुकसान हो सकता है जो इसमें शामिल होते हैं। उदाहरण के लिए, इन्वेंट्री में एक भाग संख्या कोड दिया गया है जिसे एक आदेश तालिका द्वारा एक अग्रणी कुंजी के रूप में संदर्भित किया गया है, आपको उन भागों की सूची प्राप्त करने में समस्या होगी जिनके पास NULL है। यह एक अनिवार्य रिश्ता है; आप उस हिस्से को ऑर्डर नहीं कर सकते जो मौजूद नहीं है।
(विभाजक)
6.9.1 मेजबान कार्यक्रमों (197) से NULLs से बचना
आप कुछ प्रोग्रामिंग अनुशासन के साथ NULL को होस्ट प्रोग्राम से डेटाबेस में डालने से बच सकते हैं।
...
- प्रोग्रामिंग और रिपोर्टिंग पर लापता डेटा के प्रभाव को निर्धारित करें:
NULLs के साथ संख्यात्मक कॉलम एक समस्या है, क्योंकि कुल कार्यों का उपयोग करने वाले प्रश्न भ्रामक परिणाम प्रदान कर सकते हैं।
(विभाजक)
(227)
खाली सेट का SUM () हमेशा NULL होता है। इस ट्रिक का उपयोग करते समय किए गए सबसे आम प्रोग्रामिंग त्रुटियों में से एक क्वेरी लिखना है जो एक से अधिक पंक्ति में लौट सके। यदि आपने इसके बारे में नहीं सोचा, तो आपने अंतिम उदाहरण के रूप में लिखा होगा: ...
(विभाजक)
10.1.1 NULLs के स्रोत (242)
यह याद रखना महत्वपूर्ण है कि NULLs कहां हो सकता है। वे एक स्तंभ में सिर्फ एक संभावित मूल्य से अधिक हैं । खाली सेटों पर एकत्र कार्य, OUTER JOINs, NULLs के साथ अंकगणितीय अभिव्यक्तियाँ, और OLAP ऑपरेटर सभी पूर्ण रिटर्न लौटाते हैं। ये निर्माण अक्सर VIEWs में कॉलम के रूप में दिखाई देते हैं।
(विभाजक)
(301)
NULLs के साथ एक और समस्या तब देखने को मिलती है जब आप IN विधेयकों को EXCSTS में बदलने की कोशिश करते हैं।
(विभाजक)
16.3 सभी विधेय और एक्स्ट्रेमा फंक्शंस (313)
यह पहली बार में स्पष्ट है कि ये दो विधेय SQL में समान नहीं हैं:
...
लेकिन आपको एक्स्ट्रेमा फ़ंक्शन के नियमों को याद रखना होगा - वे अधिक या कम मानों को वापस करने से पहले सभी NULL को छोड़ देते हैं। सभी विधेय NULLs को नहीं छोड़ते हैं, इसलिए आप उन्हें परिणामों में प्राप्त कर सकते हैं।
(विभाजक)
(315)
हालांकि, मानक में परिभाषा को नकारात्मक में लिखा गया है, ताकि NULL को संदेह का लाभ मिले। ...
जैसा कि आप देख सकते हैं, UNIQUE बाधाओं में NULL से बचने के लिए यह एक अच्छा विचार है।
चर्चा ग्रुप द्वारा:
NULLs के साथ ऐसा व्यवहार किया जाता है जैसे कि वे सभी एक दूसरे के बराबर थे , और अपना समूह बनाते हैं। प्रत्येक समूह को फिर एक नई परिणाम तालिका में एकल पंक्ति में घटा दिया जाता है जो पुराने को बदल देता है।
इसका मतलब यह है कि ग्रुप बाय क्लॉज के लिए NULL = NULL 3VL की तरह NULL का मूल्यांकन नहीं करता है, लेकिन यह TRUE का मूल्यांकन करता है।
SQL मानक भ्रामक है:
ORDER BY और NULLs (329)
क्या NULL मान को सॉर्ट कुंजी मान को गैर-NULL मान से अधिक या कम माना जाता है, लेकिन कार्यान्वयन-परिभाषित है, लेकिन ...
... SQL उत्पाद हैं जो इसे किसी भी तरह से करते हैं।
मार्च 1999 में, क्रिस फर्रार ने अपने एक डेवलपर्स से एक सवाल उठाया, जिसके कारण उसने SQL मानक के एक हिस्से की जांच की, जो मुझे लगा कि मैं उसे समझता था । क्रिस ने सामान्य समझ और विनिर्देशन के वास्तविक शब्दों के बीच कुछ अंतर पाया ।
और इसी तरह। मुझे लगता है कि सेल्को द्वारा पर्याप्त है।
SQL NULLs पर CJ दिनांक
CJ दिनांक NULLs के बारे में अधिक कट्टरपंथी है: SQL, अवधि में NULLs से बचें। वास्तव में, उनकी एसक्यूएल और रिलेशनल थ्योरी के अध्याय 4 : सटीक एसक्यूएल कोड को कैसे लिखें "शीर्षक, कोई नल नहीं है", सबचैपर्स के साथ
"4.4 क्या गलत है?" और "4.5 एसक्यूएल में नल से बचना" (लिंक का पालन करें: Google पुस्तकों के लिए धन्यवाद, आप कुछ पृष्ठों को ऑन-लाइन पढ़ सकते हैं)।
SQL NULLs पर फैबियन पास्कल
डेटाबेस प्रबंधन में इसके व्यावहारिक मुद्दों से - थिंकिंग प्रैक्टिशनर के लिए एक संदर्भ (कोई अंश ऑन-लाइन, क्षमा करें):
10.3 प्रथागत प्रभाव
10.3.1 SQL NULLs
... एसक्यूएल 3 वीएल में निहित समस्याओं के साथ-साथ कई क्विरक्स, जटिलताओं, प्रतिवाद और एकमुश्त त्रुटियों से ग्रस्त है [10, 11]; उनमें से निम्नलिखित हैं:
- एकत्रित कार्य (जैसे, SUM (), AVG ()) NULLs (COUNT को छोड़कर) को अनदेखा करते हैं।
- पंक्तियों के बिना एक तालिका पर एक अदिश अभिव्यक्ति 0 के बजाय गलत तरीके से NULL का मूल्यांकन करती है।
- "NULL = NULL" अभिव्यक्ति NULL का मूल्यांकन करती है, लेकिन वास्तव में SQL में अमान्य है; अभी तक आदेश द्वारा NULLs को समान माना जाता है (जो भी वे "नियमित" मूल्यों का पालन करते हैं या DBMS विक्रेता के लिए छोड़ दिया जाता है)।
- "X IS NOT NULL" की अभिव्यक्ति "NOT (x IS NULL)" के बराबर नहीं है, जैसा कि 2VL में है।
...
सभी व्यावसायिक रूप से कार्यान्वित SQL बोलियाँ इस 3VL दृष्टिकोण का पालन करती हैं, और, इस प्रकार, न केवल वे इन समस्याओं को हटाते हैं , बल्कि उनके पास spefic कार्यान्वयन समस्याएं भी होती हैं, जो उत्पादों में भिन्न होती हैं ।