MySQL में INNER JOIN
INNER JOIN का Rule
INNER JOIN intersection question हल करता है—केवल वे combinations लौटाता है जिनका join predicate TRUE है। यह पहले पूरी tables merge नहीं करता; logically candidate pairs test होती हैं, जबकि optimizer efficient physical order चुन सकता है।
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;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 बेहतर है।
| Form | Best fit |
|---|---|
| ON c.class_id = s.class_id | General, explicit और flexible |
| USING (class_id) | Same column name और simple equality |
| NATURAL JOIN | Maintainable 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;ये 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';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 संदर्भ
- MySQL 8.4 Reference Manual: JOIN Clause
- MySQL 8.4: Nested Join Optimization
- MySQL 8.4: EXPLAIN Statement
Syntax और optimizer notes official MySQL 8.4 manual से जाँचे गए हैं। अपने schema और data पर plan तथा row count अवश्य test करें।