MySQL में SQL Join Examples
Dataset और Professional Method
ये examples JOIN overview के पाँच join_students और तीन classes rows लेते हैं। जरूरत हो तो lab दोबारा बनाएँ। हर query से पहले required population, matching rule और expected row count लिखें।
| Fact | Verified value |
|---|---|
| Assigned students | 4 |
| Unassigned students | 1 (Vihaan) |
| Students वाली classes | 2 |
| Students के बिना classes | 1 (XI-A) |
Example 1–2: Students और Classes Match करें
1. Assigned students और classroom
SELECT s.student_name, c.class_name, c.room_no
FROM join_students AS s
INNER JOIN classes AS c
ON c.class_id = s.class_id
ORDER BY s.student_id;2. Ms. Rao के students
SELECT s.student_name
FROM join_students AS s
JOIN classes AS c
ON c.class_id = s.class_id
WHERE c.teacher_name = 'Ms. Rao'
ORDER BY s.student_name;पहली query many-to-one है—हर assigned student एक class से match होता है। दूसरी matched population को class attribute से filter करती है।
Example 3: हर Student Preserve करें
SELECT s.student_name,
COALESCE(c.class_name, 'Not assigned') AS class_name
FROM join_students AS s
LEFT JOIN classes AS c
ON c.class_id = s.class_id
ORDER BY s.student_id;COALESCE केवल display logic है। Stored class_id NULL ही रहता है। Meaningful missing relationship को invented database data से न भरें।
Example 4–5: Missing Relationships खोजें
4. Class के बिना students
SELECT s.student_id, 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;5. Students के बिना classes
SELECT c.class_id, c.class_name
FROM classes AS c
LEFT JOIN join_students AS s
ON s.class_id = c.class_id
WHERE s.student_id IS NULL;ये anti-join patterns हैं। दूसरी side की non-nullable primary key test करें, nullable descriptive column नहीं; वरना genuine NULL को missing row समझ सकते हैं।
Example 6: Zero सहित Class Counts
SELECT c.class_id, c.class_name,
COUNT(s.student_id) AS student_count
FROM classes AS c
LEFT JOIN join_students AS s
ON s.class_id = c.class_id
GROUP BY c.class_id, c.class_name
ORDER BY c.class_id;COUNT(s.student_id) XI-A का NULL placeholder ignore करता है। COUNT(*) उस preserved class के लिए गलत रूप से one joined row गिनता।
Example 7: Students खोए बिना Matches Filter करें
Report में सभी students चाहिए, लेकिन class data केवल X-A के लिए दिखाना है। Right-table restriction ON में रखें:
SELECT s.student_name, c.class_name
FROM join_students AS s
LEFT JOIN classes AS c
ON c.class_id = s.class_id
AND c.class_name = 'X-A'
ORDER BY s.student_id;c.class_name = 'X-A' को WHERE में ले जाने पर केवल Aarav और Meera मिलेंगे। वह अलग question के लिए सही हो सकता है, पर सभी students preserve नहीं करता।
Debugging Checklist और अभ्यास
- Ambiguous columns को aliases से qualify करें।
- देखें ON condition में key के सभी parts हैं।
- Actual और predicted row counts compare करें।
- Mismatch देखने के लिए दोनों join keys temporarily select करें।
- Deterministic display चाहिए तभी ORDER BY दें।
- Result logically correct होने के बाद EXPLAIN चलाएँ।
अभ्यास: हर teacher के साथ student count दिखाएँ; कम-से-कम दो students वाली classes list करें; Example 7 को X-B matches के लिए बदलें लेकिन सभी पाँच students रखें।
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 करें।