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

Join Three Tables

Relationship Path में सोचें

Three-table query कोई magical syntax नहीं; यह relationships की sequence है। Students, student_id से results से जुड़ते हैं; results, subject_code से subjects से जुड़ते हैं। Students में direct subject column आवश्यक नहीं।

Path: join_students → results → subjects। SELECT लिखने से पहले हर arrow की key और cardinality verify करें।

School Lab Extend करें

CREATE TABLE subjects (
  subject_code VARCHAR(10) PRIMARY KEY,
  subject_name VARCHAR(60) NOT NULL
);

CREATE TABLE results (
  student_id INT NOT NULL,
  subject_code VARCHAR(10) NOT NULL,
  marks DECIMAL(5,2) NOT NULL,
  PRIMARY KEY (student_id, subject_code),
  FOREIGN KEY (student_id)
    REFERENCES join_students(student_id),
  FOREIGN KEY (subject_code)
    REFERENCES subjects(subject_code)
);

INSERT INTO subjects VALUES
('CSC', 'Computer Science'),
('MAT', 'Mathematics');

INSERT INTO results VALUES
(1, 'MAT', 86), (1, 'CSC', 91),
(2, 'MAT', 92), (3, 'CSC', 74),
(4, 'MAT', 89);

Composite primary key same student–subject के two results रोकती है। One student फिर भी many subjects ले सकता है।

Verified Three-Table JOIN

SELECT s.student_name,
       sub.subject_name,
       r.marks
FROM join_students AS s
JOIN results AS r
  ON r.student_id = s.student_id
JOIN subjects AS sub
  ON sub.subject_code = r.subject_code
ORDER BY s.student_id, sub.subject_code;
Aarav | Computer Science | 91.00 Aarav | Mathematics | 86.00 Meera | Mathematics | 92.00 Kabir | Computer Science | 74.00 Sana | Mathematics | 89.00

पाँच result records से पाँच rows मिलती हैं। Aarav दो subjects के कारण legitimately twice आता है। Vihaan का result नहीं, इसलिए inner join में हट जाता है।

Join Path पढ़ें और बनाएँ

  1. Report की required population से शुरू करें।
  2. Bridge या transaction table को foreign key से join करें।
  3. Descriptive master को next foreign key से join करें।
  4. Common columns qualify करें और केवल needed fields चुनें।
  5. हर one-to-many edge का row count effect predict करें।
Students को unrelated column या CROSS JOIN से subjects से direct न जोड़ें। Results table ही fact है जो student द्वारा subject लेने को prove करती है।

Joined Grain को Safely Aggregate करें

SELECT s.student_id, s.student_name,
       COUNT(r.subject_code) AS subjects_taken,
       ROUND(AVG(r.marks), 2) AS average_marks
FROM join_students AS s
JOIN results AS r
  ON r.student_id = s.student_id
GROUP BY s.student_id, s.student_name
ORDER BY s.student_id;
1 | Aarav | 2 | 88.50 2 | Meera | 1 | 92.00 3 | Kabir | 1 | 74.00 4 | Sana | 1 | 89.00

Report grain define करें—one row per student। Attendance details जैसी दूसरी one-to-many table result rows multiply करके AVG/SUM corrupt कर सकती है। Different grains हों तो हर fact अलग aggregate करके join करें।

No-Result Students Preserve करें

SELECT s.student_name,
       COUNT(r.subject_code) AS subjects_taken,
       ROUND(AVG(r.marks), 2) AS average_marks
FROM join_students AS s
LEFT JOIN results AS r
  ON r.student_id = s.student_id
GROUP BY s.student_id, s.student_name
ORDER BY s.student_id;
Aarav | 2 | 88.50 Meera | 1 | 92.00 Kabir | 1 | 74.00 Sana | 1 | 89.00 Vihaan | 0 | NULL

Result key का COUNT Vihaan के लिए zero; AVG के पास non-NULL input नहीं, इसलिए NULL। Subject names भी चाहिए तो subjects को r.subject_code से LEFT JOIN करें ताकि optional chain optional रहे।

Debug और Optimize

  • एक समय एक JOIN जोड़ें और हर step पर rows count करें।
  • हर key की दोनों sides temporarily select करें।
  • Composite keys और unique constraints जाँचें।
  • Starting population बचानी हो तो optional-side filters ON में रखें।
  • Foreign keys index करें: composite primary key results.student_id से शुरू होती है; subject-driven access के लिए separate subject_code index उपयोगी हो सकता है।
  • Correctness tests के बाद EXPLAIN लें।

अभ्यास: class_name को fourth table की तरह जोड़ें; double-counting के बिना class average निकालें; every student और केवल Mathematics marks दिखाएँ, no-Mathematics students preserve रहें।

Official संदर्भ

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

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

MySQL में three tables कैसे join करें?
Required population से शुरू करके हर table को explicit JOIN और ON relation से जोड़ें, aliases लें। हर new table valid path से connect होनी चाहिए।
क्या written JOIN order execution order तय करता है?
यह logical query दिखाता है, पर MySQL inner joins का अलग physical order चुन सकता है। Outer-join dependencies कुछ reorderings रोकती हैं।
Third table जोड़ने पर rows क्यों multiply होती हैं?
Third table हर existing result row के कई matches दे सकती है। हर edge की one-to-one, one-to-many या many-to-many cardinality confirm करें।
No-result students कैसे रखें?
Students से शुरू करके results को LEFT JOIN और nullable result से subjects को LEFT JOIN करें। Optional tables पर NULL-rejecting WHERE predicates से बचें।
एक optional subject का filter कहाँ रखें?
सभी students बचाने हों तो relevant ON clause में subject restriction रखें। Final report में only matched subject rows चाहिए तो WHERE लें।
🔗

Share this topic with a friend

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

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

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

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

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