sql - बाएं, दाएं, बाहरी और अंदरूनी जुड़ने के बीच क्या अंतर है?
database join (7)
इसे और अधिक दृश्यमान बनाने में मदद मिल सकती है। एक उदाहरण:
तालिका एक:
ID_STUDENT STUDENT_NAME
1 Raony
2 Diogo
3 Eduardo
4 Luiz
तालिका 2:
आईडी उपयोगकर्ता लॉकर
3 l1
4 l2
5 l3
जब मैं करता हूं तो मुझे क्या मिलता है:
-Inner join of Table 1 and Table 2:
- Inner join returns both tables merged only when the key
(ID_STUDENT) exists in both tables
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
-Left join of Table 1 and Table 2:
- Left join merges both tables with all records form table 1, in
other words, there might be non-populated fields from table 2
ID_ESTUDANTE NOME_ESTUDANTE LOCKER
1 Raony -
2 Diogo -
3 Eduardo l1
4 Luiz l2
-Right join of table 1 and table 2:
- Right join merges both tables with all records from table 2, in
other words, there might be non-populated fields from table 1
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
5 - l3
-Outter join of table 1 and table 2:
- Returns all records from both tables, in other words, there
might be non-populated fields either from table 1 or 2.
ID_STUDENT STUDENT_NAME LOCKER
1 Raony -
2 Diogo -
3 Eduardo l1
4 Luiz l2
5 - l3
मैं सोच रहा हूं कि इन सभी अलग-अलग जुड़ों को कैसे अलग किया जाए ...
एसक्यूएल जॉइन अंतर:
याद रखना बहुत आसान है:
INNER JOIN
केवल दोनों टेबलों के लिए रिकॉर्ड रिकॉर्ड दिखाता है।
OUTER JOIN
दोनों तालिकाओं की सभी सामग्री एक साथ विलय कर दी जाती है या तो वे मेल खाते हैं या नहीं।
LEFT JOIN
LEFT OUTER JOIN
समान है - (सही तालिका रिकॉर्ड से मेल खाने वाली पहली (बाएं-सबसे) तालिका से रिकॉर्ड का चयन करें।)
RIGHT JOIN
RIGHT OUTER JOIN
समान है - (बाएं टेबल रिकॉर्ड्स से मेल खाने वाली दूसरी (दाएं-सबसे) तालिका से रिकॉर्ड का चयन करें।)
यहां सभी शामिल होने का एक ग्राफिक दृश्य है जो स्पष्ट दृश्य स्पष्टीकरण देता है।
और यहां सीएल मोफैट द्वारा विस्तार से समझाए गए Visual-Representation-of-SQL-Joins विज़ुअलाइजेशन
शामिल होने के तीन मूल प्रकार हैं:
-
INNER
दो तालिकाओं की तुलना में शामिल होता है और केवल एक परिणाम मौजूद होता है जहां एक मैच मौजूद होता है। पहली तालिका से रिकॉर्ड्स डुप्लिकेट किए जाते हैं जब वे दूसरे में कई परिणाम मिलते हैं। INNER में शामिल होने के परिणामस्वरूप छोटे सेट होते हैं, लेकिन क्योंकि रिकॉर्ड्स को डुप्लिकेट किया जा सकता है, इसकी गारंटी नहीं है। -
CROSS
दो तालिकाओं की तुलना में जुड़ता है और दोनों तालिकाओं से पंक्तियों के हर संभव संयोजन को वापस कर देता है। आप इस तरह के शामिल होने से बहुत सारे परिणाम प्राप्त कर सकते हैं जो कि सार्थक भी नहीं हो सकता है, इसलिए सावधानी के साथ उपयोग करें। -
OUTER
जुड़ने से दो तालिकाओं की तुलना होती है और जब कोई मिलान उपलब्ध होता है या अन्य मूल्यों को डेटा देता है तो डेटा लौटाता है। INNER में शामिल होने के साथ, यह एक तालिका में पंक्तियों को डुप्लिकेट करेगा जब यह अन्य तालिका में एकाधिक रिकॉर्ड से मेल खाता है। बाहरी जुड़ने के परिणामस्वरूप बड़े सेट होते हैं, क्योंकि वे स्वयं सेट से किसी भी रिकॉर्ड को नहीं हटाएंगे। नल मूल्यों को कब और कहां जोड़ना है यह निर्धारित करने के लिए आपको एक बाहरी शामिल होना भी चाहिए:-
LEFT
मतलब है कि पहले टेबल से सभी रिकॉर्ड्स रखें, इससे कोई फर्क नहीं पड़ता कि दूसरी तालिका क्या मेल नहीं खाती है और नल मानों को सम्मिलित करती है। -
RIGHT
मतलब विपरीत है: दूसरी तालिका से सभी रिकॉर्ड रखें, इससे कोई फर्क नहीं पड़ता कि वह कौन सा मूल्य जोड़ता है और जब वह पहली तालिका मेल नहीं खाता है। -
FULL
मतलब है कि दोनों टेबलों से सभी रिकॉर्ड रखें, और यदि कोई मिलान न हो तो किसी भी तालिका में एक नल मान डालें।
-
अक्सर आप देखते हैं कि OUTER
कीवर्ड वाक्यविन्यास से छोड़ा जाएगा। इसके बजाय यह सिर्फ "बाएं जॉइन", "सही जॉइन", या "पूर्ण जॉइन" होगा। ऐसा इसलिए किया जाता है क्योंकि आईएनएनईआर और सीआरओएसएस में बाएं, दाएं या पूर्ण के संबंध में कोई अर्थ नहीं है, और इसलिए इन्हें अपने आप से पर्याप्त रूप से एक बाहरी शामिल होने का संकेत मिलता है।
यहां एक उदाहरण दिया गया है जब आप प्रत्येक प्रकार का उपयोग करना चाहेंगे:
-
INNER
: आप अपने चालान "इनवॉइसलाइन" के साथ "चालान" तालिका से सभी रिकॉर्ड वापस करना चाहते हैं। यह मानता है कि प्रत्येक वैध चालान में कम से कम एक पंक्ति होगी। -
OUTER
: आप अपने संबंधित "इनवेंटरीइटम" रिकॉर्ड के साथ, एक विशेष चालान के लिए सभी "चालान रेखाएं" रिकॉर्ड वापस करना चाहते हैं। यह एक ऐसा व्यवसाय है जो सेवा भी बेचता है, जैसे कि सभी चालान रेखाओं में एक IventoryItem नहीं होगा। -
CROSS
: आपके पास 10 पंक्तियों के साथ एक अंक तालिका है, प्रत्येक होल्डिंग मान '0' '9' के माध्यम से होती है। आप इसके खिलाफ शामिल होने के लिए दिनांक सीमा तालिका बनाना चाहते हैं, ताकि आप प्रत्येक दिन सीमा के भीतर एक रिकॉर्ड के साथ समाप्त हो जाएं। क्रॉस द्वारा इस तालिका को बार-बार अपने साथ जोड़कर आप लगातार कई पूर्णांक बना सकते हैं जैसा कि आपको चाहिए (आपको 10 से 1 शक्ति पर शुरू करने के बाद, प्रत्येक जुड़ने वाले को 1 जोड़ता है)। फिर उन मानों को सीमा के लिए अपनी मूल तिथि में जोड़ने के लिए DATEADD () फ़ंक्शन का उपयोग करें।
विकिपीडिया पर शामिल हों (एसक्यूएल) देखें
- आंतरिक जुड़ें - दो तालिकाओं को देखते हुए एक आंतरिक जुड़ने से दोनों पंक्तियों में मौजूद सभी पंक्तियां मिलती हैं
बाएं / दाएं (बाहरी) में शामिल हों - दो तालिकाओं को देखते हुए आपकी पंक्तियों की बाएं या दाएं तालिका में मौजूद सभी पंक्तियां लौटाती हैं, साथ ही दूसरी तरफ से पंक्तियां वापस लौटा दी जाएंगी जब खंड में एक मैच या शून्य वापस आ जाएगा वे कॉलम
पूर्ण बाहरी - दो टेबल दिए गए सभी पंक्तियां लौटाते हैं, और जब बाएं या दाएं कॉलम नहीं होते हैं तो वे नल वापस आ जाएंगे
क्रॉस जॉइन - कार्टेशियन शामिल हो और खतरनाक हो सकता है अगर सावधानीपूर्वक उपयोग नहीं किया जाता है
LEFT JOIN
और RIGHT JOIN
OUTER JOIN
एस के प्रकार हैं।
INNER JOIN
डिफ़ॉल्ट है - दोनों टेबलों की पंक्तियों को शामिल स्थिति से मेल खाना चाहिए।
सरल उदाहरण : मान लें कि आपके पास Students
तालिका है, और Lockers
तालिका है। एसक्यूएल में, आपके द्वारा जुड़ने वाली पहली तालिका, Students
, LEFT तालिका है, और दूसरा, Lockers
, सही तालिका है।
प्रत्येक छात्र को लॉकर को असाइन किया जा सकता है, इसलिए Student
तालिका में लॉकर LockerNumber
कॉलम है। एक से अधिक छात्र संभावित रूप से एक लॉकर में हो सकते हैं, लेकिन विशेष रूप से स्कूल वर्ष की शुरुआत में, आपके पास कुछ आने वाले छात्र लॉकर के बिना हो सकते हैं और कुछ लॉकर्स जिनके पास कोई छात्र असाइन नहीं किया जाता है।
इस उदाहरण के लिए, मान लें कि आपके पास 100 छात्र हैं , जिनमें से 70 लॉकर्स हैं। आपके पास कुल 50 लॉकर्स हैं , जिनमें से 40 में कम से कम 1 छात्र हैं और 10 लॉकर्स के पास कोई छात्र नहीं है।
इनर जॉइन " मुझे लॉकर्स वाले सभी छात्रों को दिखाएं " के बराबर है।
लॉकर्स के बिना किसी भी छात्र, या छात्रों के बिना किसी भी लॉकर्स गायब हैं।
70 पंक्तियां देता है
बाएं बाहरी जॉइन " मुझे सभी छात्रों को दिखाएगा, उनके संबंधित लॉकर के साथ यदि उनके पास एक है "।
यह एक सामान्य छात्र सूची हो सकती है, या इसका उपयोग लॉकर वाले छात्रों की पहचान के लिए किया जा सकता है।
100 पंक्तियां देता है
सही बाहरी जॉइन " मुझे सभी लॉकर्स दिखाएगा, और अगर कोई है तो छात्रों को सौंपा गया "।
इसका उपयोग उन लॉकर्स को पहचानने के लिए किया जा सकता है जिनके पास कोई छात्र असाइन नहीं किया गया है, या लॉकर्स जिनमें बहुत से छात्र हैं।
80 पंक्तियां लौटाती हैं (40 लॉकर्स में 70 छात्रों की सूची, साथ ही साथ कोई छात्र नहीं 10 लॉकर्स)
पूर्ण बाहरी जॉइन मूर्खतापूर्ण होगा और शायद अधिक उपयोग नहीं करेगा।
कुछ " मुझे सभी छात्रों और सभी लॉकर्स दिखाएं, और उनसे मेल करें जहां आप कर सकते हैं "
110 पंक्तियां लौटाती हैं (लॉकर्स के बिना उन सभी 100 छात्रों सहित। साथ ही कोई छात्र के साथ 10 लॉकर्स)
इस परिदृश्य में क्रॉस जॉइन भी काफी मूर्खतापूर्ण है।
यह छात्र तालिका में लिंक किए गए lockernumber
फ़ील्ड का उपयोग नहीं करता है, इसलिए आप मूल रूप से प्रत्येक संभावित छात्र-से-लॉकर जोड़ी की एक बड़ी विशाल सूची के साथ समाप्त होते हैं, चाहे वह वास्तव में मौजूद हो या नहीं।
5000 पंक्तियां लौटाती है (100 छात्र x 50 लॉकर्स)। रिक्त लॉकर्स वाले नए छात्रों से मेल खाने के लिए शुरुआती बिंदु के रूप में उपयोगी (फ़िल्टरिंग के साथ) हो सकता है।