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

MySQL में INNER JOIN

INNER JOIN का Rule

INNER JOIN intersection question हल करता है—केवल वे combinations लौटाता है जिनका join predicate TRUE है। यह पहले पूरी tables merge नहीं करता; logically candidate pairs test होती हैं, जबकि optimizer efficient physical order चुन सकता है।

Logical rule: unmatched students और unmatched classes की output row नहीं बनती। Matching student हर matching class row के लिए एक बार आता है।

Syntax और Verified Output

SELECT s.student_id, s.student_name,
       c.class_name, c.teacher_name
FROM join_students AS s
INNER JOIN classes AS c
  ON c.class_id = s.class_id
ORDER BY s.student_id;
1 | Aarav | X-A | Ms. Rao 2 | Meera | X-A | Ms. Rao 3 | Kabir | X-B | Mr. Sen 4 | Sana | X-B | Mr. Sen

Query चार rows देती है। Vihaan का class_id NULL है और XI-A का student नहीं है; किसी की TRUE pairing नहीं बनती। class_id दोनों tables में है, इसलिए alias से qualify करना ambiguity रोकता है।

ON बनाम USING

दोनों columns का same name हो तो यह equivalent form concise है:

SELECT s.student_name, c.class_name
FROM join_students AS s
INNER JOIN classes AS c
USING (class_id);

USING (class_id) unqualified projection में same-named join column को एक बनाता है। Names अलग हों, extra predicates हों या clarity चाहिए तो ON बेहतर है।

FormBest fit
ON c.class_id = s.class_idGeneral, explicit और flexible
USING (class_id)Same column name और simple equality
NATURAL JOINMaintainable code में avoid करें; schema change silently matches बदल सकता है

Cardinality और Duplicate जैसी Rows

Lab में classes.class_id unique है। दो students X-A और दो X-B से match होते हैं, इसलिए चार student rows से चार results मिलते हैं। यदि classes में गलती से class_id 10 की दो rows हों, Aarav और Meera दोनों twice match होंगे।

SELECT c.class_id, COUNT(*) AS matched_students
FROM join_students AS s
JOIN classes AS c
  ON c.class_id = s.class_id
GROUP BY c.class_id
ORDER BY c.class_id;
10 | 2 20 | 2

ये repetitions relational evidence हैं, automatically duplicates नहीं। Model uniqueness promise करे तो unique constraint लगाएँ और DISTINCT से पहले सभी key parts inspect करें।

Composite-Key Matches

यदि result student और subject दोनों से unique है, दो terms compare करते समय दोनों columns relation में हों:

SELECT t1.student_id, t1.subject_code,
       t1.marks AS term1_marks,
       t2.marks AS term2_marks
FROM term1_results AS t1
JOIN term2_results AS t2
  ON t2.student_id = t1.student_id
 AND t2.subject_code = t1.subject_code;

केवल student_id पर join करने से उस student का हर Term 1 subject हर Term 2 subject से pair होगा। Correct ON clause complete business key दिखाता है।

Filtering, NULL और Predicate Meaning

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

Inner join में one-table simple condition ON और WHERE के बीच रखने पर अक्सर final rows same रहती हैं, और optimizer work reorder कर सकता है। फिर भी relation predicates ON में और final filters WHERE में लिखना intent साफ रखता है। Equality NULL match नहीं करती; forced match के लिए unknown identifier को zero न बनाएँ।

Performance और अभ्यास

  • Referenced key indexed रखें और frequently joined foreign-key side भी सामान्यतः index करें।
  • Compatible numeric/string types लें; mismatched collations और conversions work बढ़ाते हैं।
  • Designed functional index के बिना indexed join column को function में wrap न करें।
  • पहले correct result, फिर EXPLAIN; optimizer join order written order से अलग हो सकता है।
EXPLAIN
SELECT s.student_name, c.class_name
FROM join_students AS s
JOIN classes AS c
  ON c.class_id = s.class_id;

अभ्यास: चार assigned students को room_no सहित दिखाएँ; teacher-wise match count निकालें; फिर disposable database में test करने से पहले ON clause हटाने का effect predict करें।

Official संदर्भ

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

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

INNER JOIN क्या लौटाता है?
यह input rows की हर उस pair के लिए result row देता है जहाँ ON condition TRUE हो। दोनों sides की unmatched rows हट जाती हैं।
क्या MySQL में JOIN और INNER JOIN same हैं?
हाँ। इस context में qualifier के बिना JOIN inner join है, हालांकि INNER JOIN लिखने से teaching और intent स्पष्ट हो सकते हैं।
USING कब लें और ON कब?
दोनों tables में same clear column name हो तो USING concise है। Different names, multiple conditions और non-equality relation के लिए ON अधिक flexible है।
क्या INNER JOIN duplicates हटाता है?
नहीं। यह हर matching pair लौटाता है। DISTINCT duplicate projection हटा सकता है, पर wrong या misunderstood relation छिपा भी सकता है।
क्या equality से NULL, NULL से join होता है?
नहीं। NULL = NULL UNKNOWN है, इसलिए equality INNER JOIN match नहीं करता। Null-safe logic तभी लें जब data meaning वास्तव में माँगे।
🔗

Share this topic with a friend

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

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

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

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

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