बाहरी जुड़ने के कारण

वैसे, क्या आपको याद है जब हमने अपनी स्प्रैडशीट्स को मर्ज किया था और हमारे कार्यालय की सफाई का काम गायब हो गया था क्योंकि अभी तक कोई क्लीनर नहीं था?

यदि आप इस तरह की क्वेरी चलाते हैं:

SELECT * FROM task

तब हमें यह परिणाम मिलता है:

पहचान कर्मचारी_आईडी नाम अंतिम तारीख
1 1 दृश्यपटल पर एक बग ठीक करें 2022-06-01
2 2 बैकएंड पर एक बग ठीक करें 2022-06-15
3 5 कॉफी खरीदें 2022-07-01
4 5 कॉफी खरीदें 2022-08-01
5 5 कॉफी खरीद लेंगे 2022-09-01
6 (व्यर्थ) कार्यालय की सफाई करें (व्यर्थ)
7 4 जीवन का आनंद लें (व्यर्थ)
8 6 जीवन का आनंद लें (व्यर्थ)

यदि हम कर्मचारी_आईडी द्वारा कर्मचारी तालिका के साथ कार्य तालिका में शामिल होने का प्रयास करते हैं तो "क्लियर ऑफिस" कार्य गायब हो जाता है।

इस समस्या को हल करने के लिए, JOIN ऑपरेटर में विभिन्न संशोधक जोड़े गए हैं जो ऐसी अनाथ पंक्तियों को किसी अन्य तालिका में जोड़े के बिना संग्रहीत करने की अनुमति देते हैं।

मैं आपको JOIN ऑपरेटर के क्लासिक रूप की याद दिलाता हूं:

table 1 JOIN table 2 ON
condition

हम SQL सर्वर को यह सुनिश्चित करने के लिए कह सकते हैं कि बाईं तालिका (तालिका 1) से सभी डेटा सम्मिलित तालिका में मौजूद है। भले ही उनके लिए सही टेबल में कोई जोड़ी न हो। ऐसा करने के लिए, आपको बस लिखने की जरूरत है:

table 1 LEFT JOIN table 2 ON condition

यदि आप चाहते हैं कि ज्वाइन टेबल में दायें टेबल से सभी पंक्तियाँ हों , तो आपको लिखने की आवश्यकता है:

table 1 RIGHT JOIN table 2 ON
 condition

आइए एक क्वेरी लिखें जो सभी कार्यों और कर्मचारियों को जोड़ती है ताकि निष्पादक के बिना कार्य खो न जाए। ऐसा करने के लिए, एक प्रश्न लिखें:

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

और इस प्रश्न का परिणाम:

पहचान नाम पेशा वेतन आयु शामिल होने की तारीख पहचान कर्मचारी_आईडी नाम
1 इवानोव इवान प्रोग्रामर 100000 25 2012-06-30 1 1 दृश्यपटल पर एक बग ठीक करें
2 पेट्रोव पेट्र प्रोग्रामर 80000 23 2013-08-12 2 2 बैकएंड पर एक बग ठीक करें
4 राबिनोविच मोइशा निदेशक 200000 35 2015-05-12 7 4 जीवन का आनंद लें
5 किरिंको अनास्तासिया कार्यालय प्रबंधक 40000 25 2015-10-10 3 5 कॉफी खरीदें
5 किरिंको अनास्तासिया कार्यालय प्रबंधक 40000 25 2015-10-10 4 5 कॉफी खरीदें
5 किरिंको अनास्तासिया कार्यालय प्रबंधक 40000 25 2015-10-10 5 5 कॉफी खरीदें
6 वास्का बिल्ली 1000 3 2018-11-11 8 6 जीवन का आनंद लें
(व्यर्थ) (व्यर्थ) (व्यर्थ) (व्यर्थ) (व्यर्थ) (व्यर्थ) 6 (व्यर्थ) कार्यालय की सफाई करें

हमारी तालिका में एक और पंक्ति जोड़ी गई है, और दिलचस्प बात यह है कि इसमें बहुत सारे NULL मान हैं। कर्मचारी तालिका से लिया गया सभी डेटा NULL के रूप में प्रदर्शित होता है, क्योंकि "स्वच्छ कार्यालय" कार्य के लिए कर्मचारी तालिका से कोई निष्पादक नहीं था।

जॉइन प्रकार

कुल मिलाकर 4 प्रकार के JOIN होते हैं। उन्हें नीचे दी गई तालिका में प्रस्तुत किया गया है:

संक्षिप्त प्रविष्टि लंबी प्रविष्टि व्याख्या
1 जोड़ना आंतरिक रूप से जुड़ा केवल वे रिकॉर्ड जो तालिका A और B में हैं
2 बाँया जोड़ बाईं ओर का बाहरी जोड़ तालिका ए से जोड़ी के बिना सभी पंक्तियां होनी चाहिए
3 सही शामिल हों दायां बाहरी जुड़ाव टेबल बी से जोड़ी के बिना सभी पंक्तियां होनी चाहिए
4 बाहरी शामिल हों पूर्ण बाहरी शामिल हों टेबल ए और बी से आधार जोड़े की सभी पंक्तियां होनी चाहिए

सादगी के लिए, यदि हम तालिकाओं को सेट के रूप में प्रस्तुत करते हैं, तो JOIN को चित्र के रूप में प्रदर्शित किया जा सकता है:

सेट इंटरसेक्शन का मतलब है कि एक टेबल के लिए दूसरी टेबल से संबंधित रिकॉर्ड होता है जिसे वह संदर्भित करता है।

साक्षात्कार से प्रश्न

कभी-कभी नौसिखिया प्रोग्रामर साक्षात्कार में एक बहुत ही सरल प्रश्न के साथ बमबारी कर रहे हैं। हमारी तालिकाओं को देखते हुए, इसे निम्नानुसार तैयार किया जा सकता है:

"एक प्रश्न लिखें जो उन सभी कर्मचारियों की सूची प्रदर्शित करेगा जिनके लिए कोई कार्य नहीं है ।" सबसे पहले, आइए इस प्रश्न को थोड़ा अलग करने का प्रयास करें: "एक प्रश्न लिखें जो कर्मचारी तालिका से सभी कर्मचारियों की सूची प्रदर्शित करेगा जिसके लिए कार्य तालिका में कोई कार्य नहीं है। " हमें यह सेट प्राप्त करने की आवश्यकता है:

इस समस्या को हल करने के कई तरीके हैं, लेकिन मैं सबसे सरल तरीके से शुरू करूँगा: सबसे पहले, आप हमारी तालिकाओं को LEFT JOIN के साथ जोड़ सकते हैं, और फिर WHERE का उपयोग उन सभी पंक्तियों को बाहर करने के लिए कर सकते हैं जिनके लिए लापता डेटा NULLs के साथ पैड किया गया था।

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

और इस प्रश्न का परिणाम:

पहचान नाम पेशा वेतन आयु शामिल होने की तारीख पहचान कर्मचारी_आईडी नाम
3 इवानोव सर्गेई टेस्टर 40000 तीस 2014-01-01 (व्यर्थ) (व्यर्थ) (व्यर्थ)

इस समाधान का एकमात्र नुकसान यह है कि यहाँ तालिका में पंक्तियों में NULL है, और शर्त के अनुसार हमें कर्मचारियों की सूची प्रदर्शित करने की आवश्यकता है।

ऐसा करने के लिए, आपको या तो कर्मचारी तालिका के आवश्यक स्तंभों को SELECT में सूचीबद्ध करना होगा, या यदि आपको उन सभी को प्रदर्शित करने की आवश्यकता है, तो आप निम्नलिखित निर्माण लिख सकते हैं:

SELECT e.* FROM employee e, task t 

पूरा अनुरोध इस तरह दिखेगा:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

इस प्रश्न का परिणाम:

पहचान नाम पेशा वेतन आयु शामिल होने की तारीख
3 इवानोव सर्गेई टेस्टर 40000 तीस 2014-01-01

बाकी तरीके आप पर होमवर्क के लिए छोड़े गए हैं। मैं आपको उन्हें स्वयं खोजने के आनंद से वंचित नहीं करना चाहता।