मेरे पास इस तरह 2 टेबल हैं:
> SELECT * FROM table_a;
+------+------+
| id | name |
+------+------+
| 1 | row1 |
| 2 | row2 |
+------+------+
> SELECT * FROM table_b;
+------+------+------+
| id | name | aid |
+------+------+------+
| 3 | row3 | 1 |
| 4 | row4 | 1 |
| 5 | row5 | NULL |
+------+------+------+
INNER JOIN में दोनों तालिकाओं की परवाह है
INNER JOIN दोनों तालिकाओं की परवाह करता है, इसलिए आपको केवल एक पंक्ति मिलती है यदि दोनों तालिकाओं में एक है। यदि एक से अधिक मिलान जोड़ी है, तो आपको कई पंक्तियाँ मिलती हैं।
> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
+------+------+------+------+------+
यदि आप क्रम को उलटते हैं तो INNER JOIN पर कोई फर्क नहीं पड़ता, क्योंकि यह दोनों तालिकाओं की परवाह करता है:
> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
+------+------+------+------+------+
आपको समान पंक्तियाँ मिलती हैं, लेकिन कॉलम एक अलग क्रम में हैं क्योंकि हमने एक अलग क्रम में तालिकाओं का उल्लेख किया है।
बाईं ओर केवल पहली तालिका के बारे में परवाह है
LEFT JOIN को आपके द्वारा दी गई पहली तालिका के बारे में परवाह है, और दूसरे के बारे में ज्यादा परवाह नहीं है, इसलिए आपको हमेशा पहली तालिका से पंक्तियाँ मिलती हैं, भले ही दूसरी में कोई समान पंक्ति न हो:
> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| 2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+
ऊपर आप table_a की सभी पंक्तियों को देख सकते हैं, भले ही उनमें से कुछ तालिका b में किसी भी चीज़ के साथ मेल न खाती हों, लेकिन table_b की सभी पंक्तियाँ नहीं हैं - केवल वे जो table_a में कुछ मिलाते हैं।
यदि हम तालिकाओं के क्रम को उलट देते हैं, तो LEFT JOIN अलग तरह से व्यवहार करता है:
> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| 5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+
अब हमें table_b की सभी पंक्तियाँ मिल जाती हैं, लेकिन केवल table_a की पंक्तियों का मिलान होता है।
राइट जॉइन केवल दूसरी तालिका के बारे में परवाह करता है
a RIGHT JOIN b
आप के रूप में बिल्कुल वही पंक्तियाँ प्राप्त करता है b LEFT JOIN a
। एकमात्र अंतर स्तंभों का डिफ़ॉल्ट क्रम है।
> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| NULL | NULL | 5 | row5 | NULL |
+------+------+------+------+------+
यह वही पंक्तियाँ हैं table_b LEFT JOIN table_a
, जो हमने LEFT JOIN सेक्शन में देखीं।
इसी तरह:
> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| NULL | NULL | NULL | 2 | row2 |
+------+------+------+------+------+
जैसी पंक्तियाँ हैं table_a LEFT JOIN table_b
।
कोई भी जुड़ाव आपको हर चीज की प्रतियां नहीं देता है
कोई ज्वाइन क्लॉज नहीं: यदि आप अपनी टेबल को बिना किसी जॉय क्लॉज के साथ लिखते हैं, तो बस कॉमा से अलग हो जाते हैं, तो आपको हर संभव संयोजन में, दूसरी तालिका की हर पंक्ति के आगे लिखी गई पहली तालिका की प्रत्येक पंक्ति मिलती है:
> SELECT * FROM table_b, table_a;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 3 | row3 | 1 | 2 | row2 |
| 4 | row4 | 1 | 1 | row1 |
| 4 | row4 | 1 | 2 | row2 |
| 5 | row5 | NULL | 1 | row1 |
| 5 | row5 | NULL | 2 | row2 |
+------+------+------+------+------+
(यह मेरे ब्लॉग पोस्ट एसक्यूएल जॉइन के उदाहरणों से है )