निम्नलिखित उदाहरण पर विचार करें। हमारे पास दो टेबल, डिपार्टमेंट्स और कर्मचारी हैं।
कुछ विभागों में अभी तक कोई कर्मचारी नहीं है।
यह क्वेरी भीतरी का उपयोग करता है में शामिल होने कि, 999 काम करता है पर विभाग कर्मचारी पाता है, यदि कोई हो, अन्यथा यह कुछ भी नहीं है (यहां तक कि नहीं कर्मचारी या उसके नाम) दिखाता है:
select a.department_id, a.department_desc, b.employee_id, b.employee_name
from departments a
join employees b
on a.department_id = b.department_id
where b.employee_id = '999'
यह अगले क्वेरी एक का उपयोग करता है बाहरी जुड़ाव (विभागों और कर्मचारियों के बीच छोड़ दिया गया) और उस विभाग को पाता है जो कर्मचारी 999 के लिए काम करता है। हालांकि यह कर्मचारी के आईडी या उसके नाम को भी नहीं दिखाएगा, अगर वे किसी भी विभाग में काम नहीं करते हैं। यह WHERE खंड में उपयोग की जाने वाली बाहरी जुड़ी तालिका के कारण है। यदि कोई मिलान विभाग नहीं है, तो यह शून्य होगा (999 नहीं, भले ही 999 कर्मचारियों में मौजूद है)।
select a.department_id, a.department_desc, b.employee_id, b.employee_name
from departments a
left join employees b
on a.department_id = b.department_id
where b.employee_id = '999'
लेकिन इस प्रश्न को:
select a.department_id, a.department_desc, b.employee_id, b.employee_name
from departments a
left join employees b
on a.department_id = b.department_id
and b.employee_id= '999'
अब मापदंड खंड पर है। तो अगर यह कर्मचारी किसी भी विभाग में काम नहीं करता है, तो भी वह वापस आ जाएगा (उसकी आईडी और नाम)। विभाग के कॉलम शून्य होंगे, लेकिन हमें परिणाम मिलेगा (कर्मचारी पक्ष)।
आपको लगता है कि आप कभी भी WHERE क्लॉज में बाहरी शामिल तालिका का उपयोग नहीं करना चाहेंगे, लेकिन यह आवश्यक नहीं है। आम तौर पर, ऊपर वर्णित कारण के लिए, हालांकि है।
मान लीजिए कि आप सभी विभागों के साथ कोई कर्मचारी नहीं चाहते हैं। तो फिर तुम निम्नलिखित है, जो में शामिल होने के एक बाहरी का उपयोग करता चला सकते हैं, और बाहरी में शामिल हो गए तालिका जहां खंड में प्रयोग किया जाता है:
select a.department_id, a.department_desc, b.employee_id
from departments a
left join employees b
on a.department_id = b.department_id
where b.employee_id is null
^^ नहीं कर्मचारियों के साथ विभागों दिखाता है।
उपरोक्त एकमात्र वैध कारण है कि आप ऑन क्लॉज के बजाय WHERE क्लॉज में बाहरी शामिल तालिका का उपयोग करना चाहते हैं (जो मुझे लगता है कि आपका प्रश्न क्या है; आंतरिक और बाहरी जुड़ने के बीच का अंतर पूरी तरह से है अलग विषय)।
यह देखने का एक अच्छा तरीका यह है: आप नल की अनुमति देने के लिए बाहरी जुड़ने का उपयोग करते हैं। फिर आप बाहरी शामिल होने का उपयोग क्यों करेंगे और कहेंगे कि एक क्षेत्र शून्य नहीं होना चाहिए और 'XYZ' के बराबर होना चाहिए? यदि कोई मान 'XYZ' होना चाहिए (शून्य नहीं), तो डेटाबेस को निर्देशों को वापस आने की अनुमति देने के लिए क्यों निर्देश दें? यह एक बात कहने जैसा है और फिर इसे बाद में ओवरराइड करना है।
बेहतर? वे एक अलग उद्देश्य की सेवा करते हैं। जॉइन एक आंतरिक जुड़ाव है, बाएं जॉइन एक बाहरी जुड़ाव है (बाएं बाहरी जॉइन के समान ही)। आपके इरादों के आधार पर आप या तो बाहरी या आंतरिक शामिल होंगे। कहां स्थितियों के लिए WHERE खंड का उपयोग नहीं किया जाना चाहिए। इसका इस्तेमाल अन्य मानदंडों के लिए किया जाना चाहिए; अर्थात। छानने। –
मैंने वहां जवाब पढ़ा है "चूंकि बाएं जॉइन (जहां के साथ) प्रभावी रूप से * एक इंटर्न जॉइन है, बस इसके बजाय एक INNER जॉइन का उपयोग करें।" मुझे यकीन नहीं है कि यह एक [विशिष्ट] क्वेरी प्लानर के लिए "भ्रमित" कैसे है, लेकिन यह मानव [पढ़ने: मेरी] खपत, IMOHO के लिए आदर्श से कम है। (एक INNER पर्याप्त होने पर क्रॉस जॉइन का उपयोग करने के लिए भी कहा जा सकता है, उदाहरण के लिए।) – user2864740
एक बाएं जो किसी भी खंड के साथ जुड़ता है, जिसमें बाहरी जॉइन टेबल प्रभावी रूप से आंतरिक शामिल होता है। हालांकि अगर जहां खंड बाहरी जुड़ने वाली तालिका का उपयोग नहीं करता है, नहीं, यह मामला नहीं है। –