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

सब कुछ बाईं ओर रखते हुए: बाईं ओर जुड़ें

पिछले पाठ के INNER JOIN का एक महत्वपूर्ण दुष्प्रभाव है: यह उन पंक्तियों को हटा देता है जिनका कोई मेल नहीं है। यदि किसी कर्मचारी के पास कोई विभाग नहीं है (department_id NULL है), वे परिणाम से गायब हो जाते हैं।

कभी-कभी आप यही चाहते हैं। हालाँकि, अक्सर ऐसा नहीं होता है: एचआर रिपोर्ट में सभीकर्मचारियों को देखना आवश्यक है, जिनमें बिना विभाग वाले कर्मचारी भी शामिल हैं, और जानें कि वे कौन हैं. LEFT JOIN यही है (पूरी तरह से, LEFT OUTER JOIN)।

यह काम किस प्रकार करता है

SQL
SELECT columns
FROM   table_a
LEFT JOIN table_b ON table_a.x = table_b.y;

अंग्रेजी में पढ़ें: "table_a की सभी पंक्तियाँ रखें; प्रत्येक के लिए प्रयास करें table_b से एक पंक्ति संलग्न करें; यदि कोई मेल नहीं है, तो कॉलम भरें table_b NULL" के साथ।

मुख्य शब्द है LEFT: इसका अर्थ है "बाएं टेबल", यानी जो लिखा है FROM के बाद. इसकी सभी पंक्तियाँ सदैव जीवित रहती हैं।

SQL
-- All employees, including those without a department:
SELECT e.first_name,
       e.last_name,
       d.name AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

हमारे डेटासेट में यह क्वेरी 10 पंक्तियाँ (प्रत्येक एक कर्मचारी) लौटाती है। एंड्रिया कोस्टा, जिसके पास department_id = NULL है, dipartimento = NULL के साथ दिखाई देता है गायब होने के बजाय.

"कोई मिलान नहीं" पंक्तियाँ ढूँढना

एक बहुत ही उपयोगी परिणाम: के एक कॉलम पर IS NULL के साथ फ़िल्टर करके दाएँ हाथ की तालिका में आपको बिल्कुल वही पंक्तियाँ मिलती हैं बिना किसी मिलान के:

SQL
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE  d.id IS NULL;

यह ट्रिक वास्तविक दुनिया में हर समय उपयोग की जाती है: "मुझे बिना नंबर वाले ऑर्डर ढूंढें ग्राहक", "बिना समीक्षा वाले उत्पाद", "वे उपयोगकर्ता जिन्होंने कभी लॉग इन नहीं किया है में".

इसे अजमाएं

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

उन कर्मचारियों का पहला नाम (पहला_नाम) और अंतिम नाम (अंतिम_नाम) लौटाएं जिनके पास कोई विभाग नहीं सौंपा गया है। एक या अधिक पंक्तियाँ, दो स्तंभ।

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

WHERE को d.id IS NULL के साथ पूरा करें - आप वे पंक्तियाँ चाहते हैं जहाँ LEFT JOIN को कोई मेल खाने वाला विभाग नहीं मिला।

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

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

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

सभी विभागों (विभागों का नाम) और उनके आगे कर्मचारियों की संख्या की सूची बनाएं, जिसमें बिना कर्मचारियों वाले विभाग भी शामिल हैं (उनके लिए 0 दिखाएं)। संकेत: विभागों से शुरू करें और कर्मचारियों के साथ लेफ्ट जॉइन करें, फिर ग्रुप बाय + काउंट करें।

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

जब कोई मिलान न हो तो 0 की गिनती करने के लिए COUNT(e.id) (COUNT(*) नहीं) का उपयोग करें: NULL के साथ बाईं ओर की जॉइन पंक्ति के कारण COUNT(*) की गिनती 1 होगी।

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