- इनर जॉइन क्या है?
- बाहरी जुड़ाव क्या है?
- (+) चिह्न का उपयोग करके बाहरी जोड़ निष्पादित करना
लगभग सभी रिलेशनल डेटाबेस की तरह, Oracle क्वेरी को उत्पन्न करने की अनुमति देता है जो गठबंधन या JOIN
अंतिम परिणाम सेट बनाने के लिए दो या दो से अधिक तालिकाओं से पंक्तियाँ। जबकि कई प्रकार हैं जो जॉइन किए जा सकते हैं उनमें से सबसे आम हैं INNER JOIN
और OUTER JOIN
।
इस ट्यूटोरियल में, हम संक्षेप में INNER
. के बीच के अंतर का पता लगाएंगे और OUTER JOIN
और फिर OUTER JOINS
के निष्पादन के लिए Oracle द्वारा प्रदान की गई शॉर्टहैंड विधि की जांच करें विशेष रूप से +
. का उपयोग करके ऑपरेटर प्रतीक।
इनर जॉइन क्या है?
एक INNER JOIN
एक रिलेशनल डेटाबेस में केवल दो या दो से अधिक तालिकाओं का जुड़ना होता है, जिसके परिणाम में केवल वह डेटा होता है जो सभी शामिल होने की शर्तों को पूरा करता है ।
उदाहरण के लिए, यहाँ हमारे पास एक बुनियादी library
है दो टेबल वाली स्कीमा:books
और languages
. languages
तालिका केवल संभावित भाषा नामों की एक सूची है और एक अद्वितीय भाषा id
. है :
SELECT * FROM library.languages;
id name
1 English
2 French
3 German
4 Mandarin
5 Spanish
6 Arabic
7 Japanese
8 Russian
9 Greek
10 Italian
इस बीच, हमारी books
तालिका में एक language_id
है वह पंक्ति जिसमें अधिकांश के लिए, लेकिन सभी के लिए नहीं, पुस्तकों में केवल language_id
होती है पुस्तक की मूल प्रकाशित भाषा से संबद्ध:
SELECT * FROM
books
ORDER BY
id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language_id
1 In Search of Lost Time Marcel Proust 1913 2
2 Ulysses James Joyce 1922 1
3 Don Quixote Miguel de Cervantes 1605 5
4 Moby Dick Herman Melville 1851 1
5 Hamlet William Shakespeare 1601 (null)
6 War and Peace Leo Tolstoy 1869 8
7 The Odyssey Homer -700 9
8 The Great Gatsby F. Scott Fitzgerald 1925 1
9 The Divine Comedy Dante Alighieri 1472 10
10 Madame Bovary Gustave Flaubert 1857 2
कई मामलों में, हम INNER JOIN
perform करना चाह सकते हैं books
. में से और languages
टेबल्स ताकि अर्थहीन language_id
को देखने के बजाय प्रत्येक पुस्तक का मूल्य, हम वास्तव में language name
. देख सकते हैं इसके बजाय।
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b
INNER JOIN
library.languages l
ON
b.language_id = l.id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language
1 In Search of Lost Time Marcel Proust 1913 French
2 Ulysses James Joyce 1922 English
3 Don Quixote Miguel de Cervantes 1605 Spanish
4 Moby Dick Herman Melville 1851 English
6 War and Peace Leo Tolstoy 1869 Russian
7 The Odyssey Homer -700 Greek
8 The Great Gatsby F. Scott Fitzgerald 1925 English
9 The Divine Comedy Dante Alighieri 1472 Italian
10 Madame Bovary Gustave Flaubert 1857 French
11 The Brothers Karamazov Fyodor Dostoyevsky 1880 Russian
यहां ध्यान देने योग्य बात यह है कि उपरोक्त दो प्रश्नों में हमारा परिणाम सेट थोड़ा अलग था। पहले में, हमने बस पहले 10
. को सूचीबद्ध किया था किताबें, लेकिन INNER JOIN
. में क्वेरी हम केवल परिणाम लौटा रहे हैं जो दोनों तालिकाओं से सभी शर्तों को पूरा करते हैं। इस कारण से, Hamlet
. का रिकॉर्ड (जिसमें एक language_id
है null
. का मान या खाली) को नजरअंदाज कर दिया जाता है और हमारे INNER JOIN
. के परिणाम में वापस नहीं किया जाता है ।
आउटर जॉइन क्या है?
केवल उन परिणामों को वापस करने के बजाय जो INNER JOIN
. की सभी सम्मिलित शर्तों को पूरा करते हैं , एक OUTER JOIN
न केवल सभी शर्तों को पूरा करने वाले परिणाम देता है, बल्कि भी एक तालिका से पंक्तियाँ लौटाता है जो शर्त को पूरा नहीं करती है। सशर्त आवश्यकताओं के इस "बाईपास" के लिए चुनी गई तालिका को शामिल होने की दिशा या "पक्ष" द्वारा निर्धारित किया जाता है, जिसे आमतौर पर LEFT
के रूप में संदर्भित किया जाता है। या RIGHT
बाहरी जोड़।
अपने OUTER JOIN
में एक पक्ष को परिभाषित करते समय , आप निर्दिष्ट कर रहे हैं कि कौन सी तालिका हमेशा अपनी पंक्ति लौटाएगी, भले ही विरोध जॉइन के दूसरी तरफ टेबल गायब है या null
शामिल होने की स्थिति के हिस्से के रूप में मान।
इसलिए, यदि हम वही मूल JOIN
. करते हैं books
retrieve को पुनः प्राप्त करने के लिए ऊपर के रूप में और language names
, हम जानते हैं कि हमारी books
तालिका को हमेशा डेटा लौटाना चाहिए, इसलिए हमारा JOIN
हमारी books
. की तरफ़ "इंगित" होना चाहिए तालिका, जिससे languages
. बनती है तालिका OUTER
तालिका हम इसे संलग्न कर रहे हैं।
इसे पूरा करने के लिए, हम बस इसे बदलते हैं:
books b INNER JOIN library.languages l
... इसके लिए:
books b LEFT OUTER JOIN library.languages l
इस प्रकार, संपूर्ण क्वेरी और परिणाम सेट लगभग INNER JOIN
. के समान दिखता है उस मामूली बदलाव को छोड़कर:
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b
LEFT OUTER JOIN
library.languages l
ON
b.language_id = l.id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language
1 In Search of Lost Time Marcel Proust 1913 French
2 Ulysses James Joyce 1922 English
3 Don Quixote Miguel de Cervantes 1605 Spanish
4 Moby Dick Herman Melville 1851 English
5 Hamlet William Shakespeare 1601 (null)
6 War and Peace Leo Tolstoy 1869 Russian
7 The Odyssey Homer -700 Greek
8 The Great Gatsby F. Scott Fitzgerald 1925 English
9 The Divine Comedy Dante Alighieri 1472 Italian
10 Madame Bovary Gustave Flaubert 1857 French
जैसा अपेक्षित था, LEFT OUTER JOIN
. का उपयोग करके पिछले INNER JOIN
. के बजाय , हम दोनों दुनिया के सर्वश्रेष्ठ प्राप्त कर रहे हैं:हम किसी भी books
को नहीं छोड़ रहे हैं रिकॉर्ड (जैसे Hamlet
) केवल इसलिए कि language_id
मान null
है उस रिकॉर्ड के लिए, फिर भी उन सभी रिकॉर्ड के लिए जहां language_id
मौजूद है, हमें अच्छी तरह से स्वरूपित language name
. मिलता है हमारी languages
. से प्राप्त किया गया टेबल।
(+) सिंबल का उपयोग करके आउटर जॉइन करना
जैसा कि आधिकारिक दस्तावेज़ीकरण में बताया गया है, Oracle एक विशेष outer join operator
. प्रदान करता है (+
सिंबल) जो OUTER JOINS
. के प्रदर्शन के लिए शॉर्टहैंड है ।
व्यवहार में, +
प्रतीक सीधे सशर्त में रखा गया है कथन और वैकल्पिक तालिका के किनारे पर (वह जिसमें खाली या null
रखने की अनुमति है सशर्त के भीतर मान)।
इसलिए, हम एक बार फिर से हमारे उपरोक्त LEFT OUTER JOIN
. को फिर से लिख सकते हैं +
. का उपयोग करके स्टेटमेंट ऐसा ऑपरेटर:
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b,
library.languages l
WHERE
l.id (+)= b.language_id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
परिणाम मानक LEFT OUTER JOIN
. के समान हैं उदाहरण ऊपर दिया गया है, इसलिए हम उन्हें यहां शामिल नहीं करेंगे। हालांकि, +
. का उपयोग करके सिंटैक्स के बारे में ध्यान देने योग्य एक महत्वपूर्ण पहलू है OUTER JOINS
. के लिए ऑपरेटर ।
+
ऑपरेटर जरूरी सशर्त के बाईं ओर हो (बराबर के बाईं ओर =
संकेत)। इसलिए, इस मामले में, क्योंकि हम यह सुनिश्चित करना चाहते हैं कि हमारी languages
तालिका वैकल्पिक तालिका है जो null
return लौटा सकती है इस तुलना के दौरान, हमने इस सशर्त में तालिकाओं के क्रम को बदल दिया, इसलिए languages
बाईं ओर है (और वैकल्पिक है) जबकि books
दाईं ओर है।
अंत में, +
. का उपयोग करते समय सशर्त में तालिका पक्षों के इस पुनर्क्रमण के कारण ऑपरेटर, यह महसूस करना महत्वपूर्ण है कि उपरोक्त RIGHT OUTER JOIN
के लिए बस शॉर्टहैंड है . इसका मतलब है कि क्वेरी का यह स्निपेट:
FROM
books b,
library.languages l
WHERE
l.id (+)= b.language_id
…प्रभावी रूप से इसके समान है:
FROM
library.languages l
RIGHT OUTER JOIN
books b
ON
b.language_id = l.id