मुख्य सामग्री पर जाएं
मॉड्यूल 4 · पाठ 2 का 4पाठ्यक्रम में 14/57~10 min
मॉड्यूल पाठ (2/4)

शून्य को संभालना: शून्य और ठोस है

employees डेटासेट में, एंड्रिया कोस्टा विशेष है: उसके पास है department_id = NULL. आप पहले ही NULL के विरुद्ध (के साथ) ब्रश कर चुके हैं LEFT JOIN), लेकिन इसे गंभीरता से लेने का समय आ गया है: SQL में NULLs किसी भी अन्य मूल्य से अलग व्यवहार करना और उन्हें अनदेखा करना इनमें से एक है उत्पादन कोड में बग के प्रमुख कारण।

NULL शून्य नहीं है, खाली स्ट्रिंग नहीं है

NULL का अर्थ है अज्ञात/अनुपलब्ध मान। यह 0 नहीं है, '' नहीं है, नहीं false. यह "मुझे नहीं पता" है। इससे एक आश्चर्यजनक गुण निकलता है: NULL किसी भी चीज़ के बराबर नहीं है, स्वयं के भी नहीं।

SQL
-- All these expressions return NULL (not true!):
SELECT NULL = NULL;       -- NULL
SELECT NULL = 0;          -- NULL
SELECT NULL <> 'qualcosa'; -- NULL

ठोस परिणाम: WHERE column = NULL कभी काम नहीं करता। आपको अवश्य प्रयोग करना चाहिए समर्पित ऑपरेटर IS NULL / IS NOT NULL:

SQL
-- Employees without a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NULL;

-- Employees WITH a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NOT NULL;

COALESCE - शून्य फ़ॉलबैक

अक्सर आप डेटा होने पर NULL के बजाय कुछ प्रदर्शित करना चाहते हैं अनुपलब्ध: स्ट्रिंग '(none)', शून्य, एक डिफ़ॉल्ट तिथि। वह कार्य बिल्कुल यही करता है COALESCE(a, b, c, ...): यह पहला लौटाता है सूची में गैर-शून्य तर्क।

SQL
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM   employees;

LEFT JOIN के साथ मिलकर यह रिपोर्ट के लिए अविश्वसनीय रूप से शक्तिशाली हो जाता है:

SQL
SELECT e.first_name,
       e.last_name,
       COALESCE(d.name, '(nessun dipartimento)') AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

परिणाम: सभी कर्मचारी विभाग के नाम या स्पष्ट विवरण के साथ लौट आए उन लोगों के लिए लेबल जिनके पास कोई नहीं है।

शून्य और समुच्चय

समग्र कार्य अनदेखा करें NULLs (COUNT(*) को छोड़कर):

  • COUNT(department_id) केवल मान वाली पंक्तियों की गणना करता है;
  • AVG(salary) औसत NULLs को अनदेखा कर रहा है - यह उन्हें 0 के रूप में नहीं मानता है;
  • SUM(...) केवल गैर-शून्य मानों का योग करता है।

यह लगभग हमेशा वही होता है जो आप चाहते हैं। लेकिन यह जानना अच्छा है: यदि आप हैं "कर्मचारियों की कुल संख्या" की तलाश में COUNT(*) का उपयोग करें, नहीं COUNT(department_id).

इसे अजमाएं

व्यायाम#sql.m4.l2.e1
प्रयास: 0लोड हो रहा है...

प्रत्येक कर्मचारी के लिए, पहला नाम (पहला_नाम), अंतिम नाम (अंतिम_नाम) और एक कॉलम 'डिपार्टिमेंटो_आईडी' दिखाएं जो उनके विभाग_आईडी के बराबर हो या यदि असाइन नहीं किया गया है तो -1। तीन कॉलम, प्रति कर्मचारी एक पंक्ति।

संपादक लोड हो रहा है...
संकेत दिखाएँ

NULL को -1 से बदलने के लिए COALESCE(department_id, -1) का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#sql.m4.l2.e2
प्रयास: 0लोड हो रहा है...

सभी कर्मचारियों का पहला नाम (पहला_नाम), अंतिम नाम (अंतिम_नाम) और विभाग का नाम (विभाग का नाम) लौटाएं, जब विभाग गायब हो तो '(नेसुनो)' दिखाएं। लेफ्ट जॉइन + कोलेसे का उपयोग करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

COALESCE(d.name, '(nessuno)') लेफ्ट जॉइन द्वारा शुरू किए गए NULL को संभालता है।

3 प्रयासों के बाद समाधान उपलब्ध है