ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 4 · 4లో పాఠం 2కోర్సులో 14/57~10 min
మాడ్యూల్ పాఠాలు (2/4)

NULLలను నిర్వహించడం: NULL మరియు COALESCE

employees డేటాసెట్‌లో, ఆండ్రియా కోస్టా ప్రత్యేకమైనది: అతను department_id = NULL. మీరు ఇప్పటికే NULL (తో LEFT JOIN), అయితే దీన్ని తీవ్రంగా పరిగణించాల్సిన సమయం ఆసన్నమైంది: NULLs in SQL ఏదైనా ఇతర విలువ నుండి భిన్నంగా ప్రవర్తించండి మరియు వాటిని విస్మరించడం వాటిలో ఒకటి ఉత్పత్తి కోడ్‌లో బగ్‌లకు ప్రధాన కారణాలు.

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 ఫాల్‌బ్యాక్

డేటా ఉన్నప్పుడు మీరు తరచుగా NULLకి బదులుగా ఏదైనా డిస్ప్లే చేయాలనుకుంటున్నారు లేదు: స్ట్రింగ్ '(none)', సున్నా, డిఫాల్ట్ తేదీ. ఆ ఫంక్షన్ సరిగ్గా ఇదే COALESCE(a, b, c, ...): ఇది మొదటిది అందిస్తుంది జాబితాలో NULL కాని వాదన.

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;

ఫలితం: డిపార్ట్‌మెంట్ పేరు లేదా స్పష్టంగా ఉన్న ఉద్యోగులందరూ తిరిగి వచ్చారు లేని వారికి లేబుల్.

NULL మరియు కంకర

మొత్తం విధులు విస్మరించు NULLs (COUNT(*) మినహా):

  • COUNT(department_id) విలువ కలిగిన అడ్డు వరుసలను మాత్రమే గణిస్తుంది;
  • AVG(salary) సగటులు NULLsని విస్మరిస్తాయి — ఇది వాటిని కాదు 0గా పరిగణించదు;
  • SUM(...) NULL కాని విలువలను మాత్రమే సమకూరుస్తుంది.

దాదాపు ఎల్లప్పుడూ మీరు కోరుకునేది ఇదే. కానీ తెలుసుకోవడం మంచిది: మీరు ఉంటే "మొత్తం ఉద్యోగుల సంఖ్య" కోసం వెతుకుతోంది COUNT(*)ని ఉపయోగించండి, కాదు COUNT(department_id).

దీనిని ప్రయత్నించండి

వ్యాయామం#sql.m4.l2.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

ప్రతి ఉద్యోగికి, మొదటి పేరు (మొదటి_పేరు), చివరి పేరు (చివరి_పేరు) మరియు వారి డిపార్ట్‌మెంట్_ఐడికి సమానమైన 'డిపార్టిమెంటో_ఐడి' కాలమ్ లేదా కేటాయించకపోతే -1ని చూపండి. మూడు నిలువు వరుసలు, ఒక్కో ఉద్యోగికి ఒక వరుస.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

NULLలను -1తో భర్తీ చేయడానికి COALESCE(department_id, -1)ని ఉపయోగించండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం సమీక్షించండి

వ్యాయామం#sql.m4.l2.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

అన్ని ఉద్యోగుల మొదటి పేరు (మొదటి_పేరు), చివరి పేరు (చివరి_పేరు) మరియు విభాగం పేరు (departments.name) అందించండి, డిపార్ట్‌మెంట్ తప్పిపోయినప్పుడు '(nessuno)'ని చూపుతుంది. LEFT JOIN + COALESCEని ఉపయోగించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

COALESCE(d.name, '(nessuno)') LEFT JOIN ద్వారా ప్రవేశపెట్టబడిన NULLని నిర్వహిస్తుంది.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది