Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 69

LEFT JOIN और RIGHT JOIN

Outer-Join Idea

Outer join matching pairs के साथ chosen input भी preserve करता है। LEFT JOIN left input और RIGHT JOIN right input रखता है। Missing partner की columns NULL-extended होती हैं।

Language test: Requirement में “सभी students, class न हो तब भी” लिखा हो तो students को preserved side पर रखें।

LEFT JOIN और Verified Output

SELECT s.student_id, s.student_name, c.class_name
FROM join_students AS s
LEFT JOIN classes AS c
  ON c.class_id = s.class_id
ORDER BY s.student_id;
1 | Aarav | X-A 2 | Meera | X-A 3 | Kabir | X-B 4 | Sana | X-B 5 | Vihaan | NULL

पाँच left rows कम-से-कम पाँच output rows देती हैं। यदि एक left row के कई right matches हों तो output अधिक भी हो सकता है। Vihaan का NULL outer join generate करता है क्योंकि class row match नहीं हुई।

Equivalent RIGHT JOIN और Preferred Rewrite

SELECT s.student_name, c.class_name
FROM join_students AS s
RIGHT JOIN classes AS c
  ON c.class_id = s.class_id
ORDER BY c.class_id, s.student_id;
Aarav | X-A Meera | X-A Kabir | X-B Sana | X-B NULL | XI-A

यह XI-A सहित सभी classes रखता है। Same result अक्सर इस form में आसानी से पढ़ता है:

SELECT s.student_name, c.class_name
FROM classes AS c
LEFT JOIN join_students AS s
  ON s.class_id = c.class_id
ORDER BY c.class_id, s.student_id;

RIGHT JOIN valid MySQL syntax है; rewrite केवल style choice है, capability difference नहीं।

Anti-Join: Unmatched Rows खोजें

SELECT s.student_id, s.student_name
FROM join_students AS s
LEFT JOIN classes AS c
  ON c.class_id = s.class_id
WHERE c.class_id IS NULL;
5 | Vihaan

Students के बिना classes के लिए preserved side reverse करें:

SELECT c.class_id, c.class_name
FROM classes AS c
LEFT JOIN join_students AS s
  ON s.class_id = c.class_id
WHERE s.student_id IS NULL;
30 | XI-A

ON बनाम WHERE से Question बदलता है

सभी students रखें; केवल X-A को match होने दें

SELECT s.student_name, c.class_name
FROM join_students AS s
LEFT JOIN classes AS c
  ON c.class_id = s.class_id
 AND c.class_name = 'X-A'
ORDER BY s.student_id;
Aarav | X-A Meera | X-A Kabir | NULL Sana | NULL Vihaan | NULL

Final result में केवल X-A rows रखें

SELECT s.student_name, c.class_name
FROM join_students AS s
LEFT JOIN classes AS c
  ON c.class_id = s.class_id
WHERE c.class_name = 'X-A';
Aarav | X-A Meera | X-A

कोई query universally better नहीं; दोनों अलग requirements solve करती हैं। Predicate place करने से पहले requirement लिखें।

Zero सहित Counts

SELECT c.class_name,
       COUNT(s.student_id) AS student_count
FROM classes AS c
LEFT JOIN join_students AS s
  ON s.class_id = c.class_id
GROUP BY c.class_id, c.class_name
ORDER BY c.class_id;
X-A | 2 X-B | 2 XI-A | 0

COUNT(expression) NULL ignore करता है। Child primary key count करने से zero children और one match अलग होते हैं। Displayed name के साथ stable class identifier पर भी group करें।

गलतियाँ, Performance और अभ्यास

  • Left population बचानी हो तो NULL-rejecting right filter WHERE में न रखें।
  • Absence detect करने के लिए nullable right attribute नहीं, non-nullable key test करें।
  • यह न मानें कि outer join row multiplication रोकता है।
  • Join keys index करें और meaning/row count verify करने के बाद EXPLAIN देखें।

अभ्यास: सभी classes preserve करके zero students दिखाएँ; RIGHT और LEFT दोनों forms लिखें; फिर समझाएँ कि इस data में XI-A के लिए COUNT(*) गलत क्यों है।

Official संदर्भ

Syntax और optimizer notes official MySQL 8.4 manual से जाँचे गए हैं। अपने schema और data पर plan तथा row count अवश्य test करें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

LEFT JOIN क्या preserve करता है?
यह left input की हर row रखता है। Right match जोड़ा जाता है; match न मिले तो right-side columns NULL आती हैं।
क्या RIGHT JOIN, LEFT JOIN से अलग है?
यह written opposite side preserve करता है। Table order swap करके अधिकतर RIGHT JOIN को LEFT JOIN में rewrite किया जा सकता है, जो consistent reading देता है।
WHERE ने unmatched rows क्यों हटा दीं?
Right-table condition WHERE में NULL extension के बाद test होती है। यदि वह NULL reject करती है तो preserved unmatched rows गायब हो जाती हैं।
Partner के बिना rows कैसे खोजें?
जिस population को रखना है उससे LEFT JOIN करें, फिर partner की non-nullable primary key पर WHERE IS NULL लगाएँ।
Zero बचाते हुए matches कैसे count करें?
Parents को LEFT JOIN से preserve करें और non-nullable child key COUNT करें। COUNT(*) placeholder row गिनकर zero की जगह one दे सकता है।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.