Kodokon kodokon.com

LEFT JOIN और NULL: जो गायब है उसे ढूँढना

LEFT JOIN से किसी टेबल की हर पंक्ति को बनाए रखें, IS NULL से अनुपस्थितियों को पहचानें और COALESCE से उन्हें बदल दें।

8 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

पिछले पाठ का INNER JOIN उन ग्राहकों को छिपा देता है जिनका कोई ऑर्डर नहीं है। फिर भी सबसे आम व्यावसायिक प्रश्न ठीक यही होता है: कौन गायब है? निष्क्रिय ग्राहक, कभी न बिके उत्पाद, बिना भुगतान वाले चालान... इस स्क्रिप्ट को sqliteonline.com या sqlite3 में चलाएँ: यह बिना किसी ऑर्डर वाला एक चौथा ग्राहक जोड़ती है।

SQL
CREATE TABLE customers (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT
);

CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  amount REAL NOT NULL
);

INSERT INTO customers (id, name, city) VALUES
  (1, 'Alice', 'Lyon'),
  (2, 'Karim', 'Paris'),
  (3, 'Mina', 'Nantes'),
  (4, 'Paulo', 'Lille');

INSERT INTO orders (id, customer_id, amount)
VALUES
  (1, 1, 49.90),
  (2, 1, 15.00),
  (3, 2, 120.50);
मीना और पाउलो ने कोई ऑर्डर नहीं दिया है।

LEFT JOIN बाईं ओर की टेबल (जिसका नाम कीवर्ड से पहले आता है) की सभी पंक्तियों को रखता है, भले ही दाईं ओर कोई मिलान न हो। जब मिलान गायब होता है, तो दाईं ओर की टेबल के कॉलम NULL से भर दिए जाते हैं।

SQL
SELECT c.name, o.id AS order_id, o.amount
FROM customers AS c
LEFT JOIN orders AS o
  ON o.customer_id = c.id;
मीना और पाउलो दिखाई देते हैं, जिनमें order_id और amount NULL पर सेट हैं।

जो गायब है उसे अलग करने के लिए, इन NULL वैल्यू पर फ़िल्टर करें: यह एंटी-जॉइन पैटर्न है, जो डेटा विश्लेषण में एक अनिवार्य सजगता है। जाँची जाने वाली कॉलम दाईं ओर की टेबल से आनी चाहिए और स्वाभाविक रूप से कभी NULL नहीं होनी चाहिए, इसीलिए इसकी प्राइमरी की o.id को चुना गया है।

SQL
SELECT c.name, c.city
FROM customers AS c
LEFT JOIN orders AS o
  ON o.customer_id = c.id
WHERE o.id IS NULL;
वे ग्राहक जिन्होंने कभी ऑर्डर नहीं किया: मीना और पाउलो।

एक आखिरी टूल: COALESCE(a, b) a लौटाता है यदि वह NULL नहीं है, अन्यथा b। किसी LEFT JOIN और एक एग्रीगेशन के साथ मिलकर, यह किसी रिपोर्ट या चालान में अनुपस्थितियों को उपयोगी शून्य में बदल देता है।

SQL
SELECT c.name,
  COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers AS c
LEFT JOIN orders AS o
  ON o.customer_id = c.id
GROUP BY c.id
ORDER BY total_spent DESC;
प्रति ग्राहक कुल खर्च, निष्क्रिय ग्राहकों के लिए NULL के बजाय 0।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. कौन सा संयोजन उन ग्राहकों की सूची बनाता है जिन्होंने कभी ऑर्डर नहीं किया?
    • INNER JOIN फिर WHERE o.id IS NULL
    • LEFT JOIN फिर WHERE o.id IS NULL
    • LEFT JOIN फिर WHERE o.id = NULL
  2. शर्त amount = NULL क्या लौटाती है?
    • उन पंक्तियों के लिए True जहाँ amount NULL है
    • कभी सही नहीं: तुलना अपरिभाषित रहती है
    • एक सिंटैक्स त्रुटि
  3. बिना किसी ऑर्डर वाले ग्राहक के लिए COALESCE(SUM(o.amount), 0) क्या लौटाता है?
    • 0
    • NULL
    • ग्राहक को परिणाम से बाहर कर दिया जाता है
    • एक एग्रीगेशन त्रुटि