Theory
Names एक table में रहते हैं, scores दूसरे में
Principal अब तक का सबसे simple सवाल पूछते हैं: "मुझे student names उनके DBMS scores के साथ दिखाइए।"
Problem: names students में रहते हैं, scores marks में रहते हैं। कोई भी table अकेले जवाब नहीं दे सकती।
Data को इस तरह split करना BCA105 का normalization lesson अपना काम कर रहा था (कोई repetition नहीं)। पर split data को query time पर वापस stitch करना होगा, shared roll column से rows match करते हुए। Stitching को joining कहते हैं, और joins की एक छोटी family है, हर एक अलग सवाल का जवाब देती है।
Theory
दो registers roll number से match करना
एक register admissions (roll, name, city) list करता है। दूसरा exam entries (roll, subject, score) list करता है।
Principal का जवाब देने वाला एक clerk admissions register पर चलता है और, हर roll के लिए, exam register में matching lines देखता है। मिली: उन्हें साथ staple कीजिए। Join family सिर्फ़ इसमें अलग है: clerk एक roll के match न होने पर क्या करता है: इसे skip कीजिए, इसे blanks के साथ रखिए, या चाहे जो हो सब कुछ pair कीजिए।
At a glance
एक नज़र में join family
| Join | क्या रखता है | Typical सवाल |
|---|---|---|
| INNER | सिर्फ़ matching pairs | Names उनके scores के साथ |
| LEFT | सभी left rows; NULLs gaps भरते हैं | बिना marks वाले students शामिल कीजिए |
| CROSS | हर pair (m × n rows) | हर student × हर subject grid |
| SELF | Table ख़ुद से matched (aliases) | एक city से students की pairs |
| FULL OUTER | दोनों sides के unmatched rows | सब कुछ, matched या नहीं |
Practical
Family, college.db पर
-- INNER: names with scores (unmatched students vanish)
SELECT s.name, m.subject, m.score
FROM students s
INNER JOIN marks m ON s.roll = m.roll;
-- LEFT: EVERY student, NULL score if they never sat an exam
SELECT s.name, m.score
FROM students s
LEFT JOIN marks m ON s.roll = m.roll;
-- the classic use of LEFT: who has NO marks at all?
SELECT s.name
FROM students s
LEFT JOIN marks m ON s.roll = m.roll
WHERE m.roll IS NULL;
-- CROSS: every student paired with every subject (a blank grid)
SELECT s.name, sub.subject
FROM students s CROSS JOIN subjects sub;
-- SELF: pairs of students from the same city (aliases a, b)
SELECT a.name, b.name, a.city
FROM students a
JOIN students b ON a.city = b.city AND a.roll < b.roll;
This example runs in Gri-Learn on the web, where you can edit it and see the output.
Theory
दो tricky वालों को पढ़ना
SELF JOIN: एक table, दो aliases (a और b) के तहत दो बार इस्तेमाल हुई, क्योंकि SQL को copies बताने के लिए अलग नाम चाहिए। a.roll < b.roll trick हर pair को दो बार दिखने से रोकता है और students को ख़ुद के साथ pair होने से रोकता है।
FULL OUTER JOIN: दोनों sides से unmatched rows रखता है। सालों तक SQLite famously इसके बिना था (textbook answer: हर तरफ़ एक LEFT JOIN से emulate कीजिए, UNIONed); 2022 से versions इसे natively support करते हैं। एक exam में, दोनों facts बताइए और आप दोनों तरह से safe हैं।
Quiz
students में 3 rows हैं, marks में 4 rows हैं, और एक student के पास बिल्कुल कोई marks नहीं हैं। INNER JOIN और LEFT JOIN (students LEFT JOIN marks, ON roll) हर एक कितनी rows return करते हैं?
- INNER: 4, LEFT: 5
- INNER: 4, LEFT: 4
- INNER: 3, LEFT: 4
- INNER: 12, LEFT: 12
Show the answer
INNER: 4, LEFT: 5
INNER प्रति match एक row return करता है: सभी 4 marks rows किसी न किसी student से match करती हैं, तो 4। LEFT उन 4 को रखता है AND markless student को NULLs के साथ एक बार जोड़ता है: 5। Option D (12 = 3 × 4) वह है जो CROSS JOIN produce करता, या जब कोई ON condition पूरी तरह भूल जाता है: वह error जिससे पिछला block warn करता है। Row counts से join outputs गिनना एक standard exam exercise है; match by match reason कीजिए।
Think first
Join चुनिए
तीन requests: (1) attendance-eligible list: हर student, marks वहाँ जहाँ मौजूद हों, बाक़ी blanks; (2) हर student बनाम हर subject का एक printable blank grid; (3) roommate suggestions: एक ही city के students की pairs। tap करने से पहले हर एक join नाम दीजिए।
Show the answer
(1) LEFT JOIN: सभी left rows बचती हैं, gaps NULL बनते हैं।
(2) CROSS JOIN: जानबूझकर हर-के-साथ-हर pairing।
(3) City पर दो aliases के साथ SELF JOIN (plus a.roll < b.roll duplicates और self-pairs से बचने के लिए)।
Selection logic: बिना match के कौन बचना चाहिए? Left rows → LEFT। सबके साथ सब → CROSS। ख़ुद की दूसरी copy → SELF।
Watch out
Silent disasters
ON भूलना: बिना condition के FROM students JOIN marks एक CROSS JOIN में degenerate हो जाता है: हज़ारों nonsense rows, कोई error message नहीं।
INNER जब आपका मतलब LEFT था: बिना marks वाला student चुपचाप reports से ग़ायब हो जाता है; कोई notice नहीं करता जब तक markless student complain न करे। जब एक report को सबका account देना हो, LEFT को default मानिए और IS NULL से test कीजिए।
Theory
Joins normalization का payoff हैं
BCA105 ने आपको data को साफ़ tables में split करना सिखाया; joins promised reunion हैं। हर असली system इन्हीं पर चलता है: आपका college portal students को fees और hostels से जोड़ता, Grishu topics को आपके quiz attempts से जोड़ता। Unit 4 में, pandas वही trick pd.merge(students, marks, on='roll', how='left') के रूप में perform करता है: how= parameter literally इसी lesson का table है।
Summary
Key takeaways
- Joins दो tables को एक matching column पर stitch करते हैं: FROM a JOIN b ON a.key = b.key।
- INNER सिर्फ़ matches रखता है; LEFT हर left row gaps में NULLs के साथ रखता है।
- LEFT + WHERE right.key IS NULL बिना match वाली left rows ढूँढता है (markless student)।
- CROSS सब कुछ सब कुछ के साथ pair करता है (m × n); भूला हुआ ON वही disaster देता है।
- SELF एक table को दो aliases से ख़ुद से जोड़ता है; a.roll < b.roll duplicates मारता है।
- FULL OUTER: दोनों sides से unmatched; SQLite में classically emulated, 2022 से native।
- Memory hook: clerk बिना match वाले roll का क्या करता है?