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

MySQL Joins

JOIN क्या करता है?

Relational design में हर fact सही table में रहता है। Student row class identifier रखती है; class name, room और teacher classes table में होने चाहिए। JOIN query के समय relationship test करके useful combined view बनाता है।

Faculty rule: JOIN पढ़ते समय तीन प्रश्न पूछें—कौन-सी table preserve करनी है, match किन columns से बनेगा, और एक row के कितने matches हो सकते हैं?
SELECT s.student_name, c.class_name
FROM join_students AS s
JOIN classes AS c
  ON c.class_id = s.class_id;

केवल JOIN लिखना INNER JOIN के समान है। Aliases query छोटी रखते हैं, लेकिन common-name columns को table alias के साथ qualify करें।

Verified School Lab

यह isolated setup एक बार चलाएँ। join_students नाम earlier lessons की students table से collision रोकता है।

CREATE TABLE classes (
  class_id INT PRIMARY KEY,
  class_name VARCHAR(20) NOT NULL,
  room_no VARCHAR(20) NOT NULL,
  teacher_name VARCHAR(60) NOT NULL
);

CREATE TABLE join_students (
  student_id INT PRIMARY KEY,
  student_name VARCHAR(60) NOT NULL,
  class_id INT NULL,
  CONSTRAINT fk_join_student_class
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

INSERT INTO classes VALUES
(10, 'X-A', 'Room 101', 'Ms. Rao'),
(20, 'X-B', 'Room 102', 'Mr. Sen'),
(30, 'XI-A', 'Room 201', 'Ms. Iyer');

INSERT INTO join_students VALUES
(1, 'Aarav', 10), (2, 'Meera', 10),
(3, 'Kabir', 20), (4, 'Sana', 20),
(5, 'Vihaan', NULL);

इस data में चार matched students, class के बिना एक student और students के बिना एक class है। इसलिए आगे के सभी edge cases और outputs verify हो सकते हैं।

JOIN के प्रकार: Preservation से चुनें

Typeक्या बचाता हैTypical प्रश्न
INNER JOINकेवल matching pairsकिन students की class assigned है?
LEFT JOINसभी left rows + matchesहर student दिखाएँ, assigned हो या नहीं।
RIGHT JOINसभी right rows + matchesRight side preserve करके outer logic।
CROSS JOINहर possible pairहर class–shift combination बनाएँ।
SELF JOINChosen join पर निर्भरSame class के student pairs।
FULL OUTER patternदोनों sidesदोनों ओर matched/unmatched rows।

पहले लिखी table automatically important नहीं होती। Required population join type और preserved side से तय होती है।

पहला INNER JOIN और Verified Output

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

Vihaan exclude होता है क्योंकि NULL किसी class identifier के बराबर नहीं है। XI-A exclude होती है क्योंकि class 30 का student match नहीं है। इसलिए चार matches से चार rows मिलती हैं।

Keys, Cardinality और Row Count

classes.class_id unique है, जबकि कई students एक class_id share कर सकते हैं। Students से classes का relation many-to-one है, इसलिए हर matched student अधिकतम एक result row देता है। दोनों sides का joined column non-unique हो तो rows तेजी से बढ़ सकती हैं।

  • One-to-one: हर row का अधिकतम एक match।
  • One-to-many: parent से कई output rows बन सकती हैं।
  • Many-to-many: junction table लें; output उसके matches से तय होता है।
Unknown row explosion पर सीधे DISTINCT न लगाएँ। पहले missing ON condition, duplicate business keys और intended relation जाँचें।

NULL और Filter Placement

NULL के साथ equality TRUE नहीं, UNKNOWN होती है। Outer join missing partner की columns में NULL देता है। Missing partner खोजने के लिए non-nullable key पर IS NULL test करें।

SELECT s.student_name
FROM join_students AS s
LEFT JOIN classes AS c
  ON c.class_id = s.class_id
WHERE c.class_id IS NULL;
student_name Vihaan

Outer join में ON condition तय करती है कि right rows कैसे match करें, पर left rows preserved रहती हैं। वही condition WHERE में completed result filter करके NULL-extended rows हटा सकती है और answer बदल देती है।

Performance Checklist

  1. Primary और foreign-key join columns index करें; parent primary key पहले से indexed है।
  2. Compatible data types/collations join करें; indexed join column पर function या implicit conversion से बचें।
  3. SELECT * की जगह required columns चुनें।
  4. EXPLAIN में access type, chosen key और estimated rows देखें।
  5. Representative data पर actual row count verify करें; index गलत logic ठीक नहीं करता।
EXPLAIN
SELECT s.student_name, c.class_name
FROM join_students AS s
JOIN classes AS c
  ON c.class_id = s.class_id;

अभ्यास और सारांश

  1. सभी classes और उनका student count लौटाएँ, zero सहित।
  2. Missing class_id वाले students खोजें।
  3. तीन classes और दो shifts के CROSS JOIN का row count पहले predict करें।

सारांश: JOIN का अर्थ matching + preservation है। Population तय करें, ON में relationship लिखें, cardinality predict करें, query चलाएँ और unmatched cases verify करें। यह habit diagrams याद करने से अधिक उपयोगी है।

Official संदर्भ

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

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

MySQL में JOIN क्या है?
JOIN related tables की rows को ON condition के आधार पर जोड़ता है। इससे normalized data को facts repeat किए बिना साथ query किया जा सकता है।
Beginner को कौन-सा JOIN पहले सीखना चाहिए?
पहले INNER JOIN, फिर LEFT JOIN सीखें। INNER केवल matches रखता है; LEFT left input की unmatched rows भी बचाता है।
क्या JOIN के लिए foreign key अनिवार्य है?
नहीं। MySQL compatible expressions को बिना declared foreign key भी join कर सकता है, पर primary/foreign key constraints integrity और relationship स्पष्ट करते हैं।
JOIN duplicate जैसी rows क्यों देता है?
हर match के लिए एक result row बनती है। One-to-many और many-to-many relations rows बढ़ाते हैं; DISTINCT लगाने से पहले keys और cardinality जाँचें।
क्या MySQL direct FULL OUTER JOIN देता है?
नहीं। इसे दो outer-join branches और UNION ALL से emulate किया जाता है, जहाँ दूसरी branch केवल unmatched rows रखती है।
🔗

Share this topic with a friend

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

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

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

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

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