SQLite joins: Inner, left, cross, self, full outer joins

Joins दो tables से rows को matching column पर stitch करते हैं: INNER सिर्फ़ matches रखता है, LEFT हर left row रखता है (NULLs gaps भरते हैं), CROSS सब कुछ सब कुछ के साथ pair करता है, SELF एक table को ख़ुद से जोड़ता है।

11 min read · 10 cards · 2 checks

Read in: English · हिन्दी · ગુજરાતી


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 pairsNames उनके scores के साथ
LEFTसभी left rows; NULLs gaps भरते हैंबिना marks वाले students शामिल कीजिए
CROSSहर pair (m × n rows)हर student × हर subject grid
SELFTable ख़ुद से 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 करते हैं?

  1. INNER: 4, LEFT: 5
  2. INNER: 4, LEFT: 4
  3. INNER: 3, LEFT: 4
  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 का क्या करता है?

Study this properly

This page is the lesson to read. In Gri-Learn the same topic is a graded deck: the self-checks are scored and your weak topics are tracked. Free to start.

Start this topic

Already have an account? Sign in

More from Introduction to SQLite

Gri-Learn · syllabus-mapped B.C.A. lessons in English, Hindi and Gujarati

SQLite joins: Inner, left, cross, self, full outer joins · Database Handling using Python · Gri-Learn