MySQL: जॉइन के प्रकारों का त्वरित ब्रेकडाउन


157

मैं MySQL जॉइन के प्रकारों का त्वरित विराम चाहूंगा। मुझे ये पता है, बाकी मुझे यकीन नहीं है कि उनका क्या मतलब है।

  • अल्पविराम अलग हो गया ( वास्तव में यह किसके लिए कम है?):SELECT * FROM a, b WHERE b.id = a.beeId AND ...
  • यदि बी में कोई मैच नहीं हैं, तब भी जानकारी दिखाएं: SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...

मैंने अन्य जोड़ियों को देखा है, लेकिन जानना चाहता हूं कि उन्हें क्या अलग बनाता है, क्या है INNER/ OUTER, LEFTबदलती चीजों को जोड़ता है।

मैं पहले से ही जानता हूं कि काम में कैसे शामिल होता है, मैं सिर्फ यह जानना चाहता हूं कि क्या अन्य प्रकार के जोड़ हैं, या यदि वे एक ही परिणाम प्राप्त करने के लिए अलग-अलग तरीके हैं।


क्या इससे आपके सवाल का जवाब मिलता है? "INNER JOIN" और "OUTER JOIN" में क्या अंतर है?
दार्शनिक

जवाबों:


463

3
+1 लेकिन दोनों गायब हैं cross join, जो एक कार्टेशियन उत्पाद करता है।
डेनिस डे बर्नार्डी

11
@denis: codinghorror.com लिंक पर बारीकी से नज़र:There's also a cartesian product or cross join, which as far as I can tell, can't be expressed as a Venn diagram:
Rufinus

1
मैं चकित हूं, इस आरेख को मुद्रित कर रहा हूं और अपने कार्यालय की दीवार पर लगा रहा हूं। आपने मेरी जिंदगी बदल दी!
9

41
प्रश्न विशेष रूप से MySQL के बारे में है। MySQL फुल ओवर्स जॉइन का समर्थन नहीं करता है।
माइक बारांज़क

4
और निश्चित रूप से यह इस आलेख को पोस्ट नहीं करने का एक कारण होना चाहिए। sigh
रुफिनस

27

आपकी टिप्पणी के आधार पर, W3Schools में प्रत्येक की सरल परिभाषा सबसे अच्छी पाई जाती है । प्रत्येक प्रकार की पहली पंक्ति , सम्मिलित प्रकार का संक्षिप्त विवरण देती है।

  • JOIN: दोनों टेबलों में कम से कम एक मैच होने पर पंक्तियों को लौटाएं
  • बाईं ओर: बाईं तालिका से सभी पंक्तियों को वापस करें, भले ही सही तालिका में कोई मेल न हों
  • राइट जॉइन: राइट टेबल से सभी पंक्तियों को लौटाएं, भले ही लेफ्ट टेबल में मैच न हों
  • पूर्ण जॉइन: तालिकाओं में से एक में मैच होने पर पंक्तियों को लौटाएं

END EDIT

संक्षेप में, अल्पविराम ने आपके द्वारा दिए गए उदाहरण को अलग कर दिया

SELECT * FROM a, b WHERE b.id = a.beeId AND ...

तालिकाओं को अलग करने वाले तालिकाओं के साथ a और b तालिकाओं से हर रिकॉर्ड का चयन कर रहा है, इसका उपयोग स्तंभों की तरह भी किया जा सकता है

SELECT a.beeName,b.* FROM a, b WHERE b.id = a.beeId AND ...

इसके बाद पंक्ति में निर्देशित जानकारी मिल रही है जहाँ b.id कॉलम और a.beeId कॉलम का आपके उदाहरण में मेल है। तो आपके उदाहरण में यह टेबल और बी से सभी जानकारी प्राप्त करेगा जहां b.id बराबर a.beeId है। मेरे उदाहरण में यह b तालिका से सभी जानकारी प्राप्त करेगा और केवल a.beeName कॉलम से जानकारी प्राप्त करेगा जब b.id a.beeId के बराबर होगा। ध्यान दें कि एक और खंड भी है, यह आपके परिणामों को परिष्कृत करने में मदद करेगा।

MySQL के कुछ सरल ट्यूटोरियल्स और स्पष्टीकरणों के लिए, Tizag के mySQL ट्यूटोरियल्स पर एक नज़र और बाएँ ज्वाइन पर एक नज़र है। आप कीथ जे। ब्राउन की वेबसाइट पर जॉइन के बारे में अधिक जानकारी के लिए भी देख सकते हैं जो काफी अच्छा है।

मैं आशा करता हूं कि इससे तुम्हें सहायता मिलेगी


ऐसा होता है कि मुझे वह सब पता है। मैं वास्तव में ऐसे प्रकारों की तलाश कर रहा था जो कि हैं। क्षमा करें, मैं इस बारे में स्पष्ट नहीं था कि मुझे क्या पता है। लेकिन मैं केवल त्वरित सारांश प्राप्त करने के लिए लंबे दस्तावेज की तलाश नहीं कर रहा था।
ब्रायन फील्ड

उत्तर में एक और संदर्भ ... आप जो चाहते हैं, वह अधिक हो सकता है।
रयान

उस संपादन के लिए +1। मैं W3Schools के खिलाफ पक्षपाती नहीं हूं जैसे कुछ लोग दिखाई देते हैं। शायद मैंने बुरे पक्षों को ज्यादा नहीं देखा है या शायद यह सिर्फ एक "पवित्र युद्ध" है। इसके अलावा, मैंने W3Schools की सामग्री में संपादित किया है, मुझे आशा है कि आपको कोई आपत्ति नहीं है, लेकिन जो भी संपादन आपको पसंद है उसे बनाने के लिए स्वतंत्र महसूस करें। स्वीकृत उत्तर में वे सभी दृश्य अच्छे हैं, लेकिन कुछ वास्तव में बहुत ही भिन्नता के रूप हैं। यह एक अच्छा विकल्प है।
ब्रायन फील्ड

धन्यवाद जॉर्ज, मैं बिल्कुल भी बुरा नहीं मानता, संपादित करना सही है! मुझे विश्वास है कि लोगों को उन स्रोतों को खोजने की आवश्यकता है जो उनके लिए सही हैं, अधिक या कम जानकारी, बहुत सारे उदाहरण या कोई भी नहीं। W3Schools के पास सटीक और संक्षिप्त हैं, वे अच्छे उदाहरण भी देते हैं, Tizag समान है। यह आसान दोस्त ले लो
रयान

1
mysql में कोई FULL JOIN नहीं है, इसलिए ये लिंक बहुत उपयोगी नहीं हैं।
ईथर

13

मेरे पास इस तरह 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 |
+------+------+------+------+------+

(यह मेरे ब्लॉग पोस्ट एसक्यूएल जॉइन के उदाहरणों से है )


@Anu कृपया ऐसे तुच्छ संपादन न करें जब आपकी कम प्रतिष्ठा का अर्थ है कि आपके संपादन को दूसरों द्वारा समीक्षा की जानी है, आप बस अपना समय बर्बाद कर रहे हैं। उस संपादन को कोई अंतर नहीं माना जाना चाहिए था। आपके द्वारा बदला गया कोड वास्तव में गलत नहीं था और आप टिप्पणी कर सकते थे।
दार्शनिक

@philipxy ठीक है। उसके साथ नहीं। जब मैं स्पष्टीकरण को समझने की कोशिश कर रहा था, मैंने इस तरह का एक टाइपो देखा और इसीलिए इसे और अधिक स्पष्ट करने के लिए संपादित किया गया। वास्तव में यह एक अच्छा जवाब है और मेरा इरादा इसे और सही रखना था।
अनु

@ आन्नू के इस उत्तर में अधिकांश खंडों के समान खंडित अधूरे विवरण हैं। यह वास्तव में यह नहीं कहता कि आउटपुट इनपुट के कार्य के रूप में क्या है। दोनों पृष्ठों पर प्रस्तावित डुप्लिकेट और मेरी टिप्पणियों पर लगभग हर उत्तर भी देखें। वहां भी मेरा जवाब देखिए। पी एस I संयोग से कल ही इसे देखा गया था कल से संपादित आकार की समीक्षा करें (निश्चित रूप से मेटा स्टैक ओवरफ्लो और मेटा स्टैक एक्सचेंज में कई और अधिक संबंधित पोस्ट हैं )
9

11

पूर्ण आउटर जॉइन mysql में मौजूद नहीं है, आपको लेफ्ट और राइट जॉइन के संयोजन का उपयोग करने की आवश्यकता हो सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.