MySQL Joins
JOIN क्या करता है?
Relational design में हर fact सही table में रहता है। Student row class identifier रखती है; class name, room और teacher classes table में होने चाहिए। JOIN query के समय relationship test करके useful combined view बनाता है।
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 + matches | Right side preserve करके outer logic। |
| CROSS JOIN | हर possible pair | हर class–shift combination बनाएँ। |
| SELF JOIN | Chosen 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;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 से तय होता है।
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;Outer join में ON condition तय करती है कि right rows कैसे match करें, पर left rows preserved रहती हैं। वही condition WHERE में completed result filter करके NULL-extended rows हटा सकती है और answer बदल देती है।
Performance Checklist
- Primary और foreign-key join columns index करें; parent primary key पहले से indexed है।
- Compatible data types/collations join करें; indexed join column पर function या implicit conversion से बचें।
SELECT *की जगह required columns चुनें।EXPLAINमें access type, chosen key और estimated rows देखें।- 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;अभ्यास और सारांश
- सभी classes और उनका student count लौटाएँ, zero सहित।
- Missing class_id वाले students खोजें।
- तीन classes और दो shifts के CROSS JOIN का row count पहले predict करें।
सारांश: JOIN का अर्थ matching + preservation है। Population तय करें, ON में relationship लिखें, cardinality predict करें, query चलाएँ और unmatched cases verify करें। यह habit diagrams याद करने से अधिक उपयोगी है।
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 करें।