SQL में नेस्टेड प्रश्न
SQL भाषा आपको एक क्वेरी को दूसरी क्वेरी में नेस्ट करने की अनुमति देती है। इससे एक बहुत बड़ी क्वेरी लिखना संभव हो जाता है जो कुछ बड़ा और जटिल करेगी, हालांकि कोड की पठनीयता बहुत कम हो जाती है।
उपश्रेणियों द्वारा कितने मान लौटाए जाते हैं, इस पर निर्भर करता है कि वे किस क्षेत्र में लागू किए जा सकते हैं। कुल तीन विकल्प हैं:
- सबक्वायरी एक एकल मान (एक कॉलम और एक पंक्ति) देता है।
- सबक्वायरी मूल्यों की एक सूची (एक कॉलम वाली तालिका) लौटाती है।
- सबक्वायरी एक टेबल (कई कॉलम, पंक्तियों की संख्या) लौटाती है।
आइए प्रत्येक मामले के लिए एक उदाहरण देखें।
स्केलर परिणाम के साथ सबक्वायरी
आइए कर्मचारी तालिका से अपने सभी कर्मचारियों की सूची देखें जिनका वेतन कंपनी के औसत वेतन से अधिक है। हम ऐसा कैसे कर सकते हैं?
यदि हम पहले से जानते हैं तो हम कर्मचारियों के वेतन की औसत से तुलना करके उन्हें आसानी से फ़िल्टर कर सकते हैं। उसी समय, हमने पहले ही एक प्रश्न लिखा है जो हमें कंपनी के कर्मचारियों के औसत वेतन की गणना करने की अनुमति देता है। आइए इसे याद करें:
SELECT AVG(salary) FROM employee
तब MySQL ने हमें मान लौटाया: 76833.3333 ।
अब उन सभी कर्मचारियों की सूची कैसे प्राप्त करें जिनका वेतन औसत से ऊपर है? यह भी बहुत आसान है:
SELECT * FROM employee
WHERE salary > 76833.3333
इस प्रश्न का परिणाम होगा:
पहचान | नाम | पेशा | वेतन |
---|---|---|---|
1 | इवानोव इवान | प्रोग्रामर | 100000 |
2 | पेट्रोव पेट्र | प्रोग्रामर | 80000 |
4 | राबिनोविच मोइशा | निदेशक | 200000 |
और अब हम 76833 मान के बजाय पहले अनुरोध को प्रतिस्थापित करके दोनों अनुरोधों को जोड़ते हैं:
SELECT * FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee)
इस क्वेरी का नतीजा वही होगा:
पहचान | नाम | पेशा | वेतन |
---|---|---|---|
1 | इवानोव इवान | प्रोग्रामर | 100000 |
2 | पेट्रोव पेट्र | प्रोग्रामर | 80000 |
4 | राबिनोविच मोइशा | निदेशक | 200000 |
मूल्यों की सूची के साथ सबक्वेरी
क्या आपको याद है कि एक बार हमारे पास एक कार्य था - एक तालिका से सभी अभिलेखों को खोजने के लिए जिनके लिए दूसरे से संबंधित अभिलेख नहीं हैं?
ये भी थी तस्वीर:
यदि मैं गलत नहीं हूँ, तो कार्य इस प्रकार है: कर्मचारी तालिका से सभी कर्मचारियों की सूची प्रदर्शित करें जिनके लिए कार्य तालिका में कोई कार्य नहीं है ।
आइए इसका भी दो चरणों में समाधान ढूंढते हैं।
सबसे पहले, आइए एक प्रश्न लिखें जो उन सभी कर्मचारियों की आईडी लौटाएगा जिनके कार्य तालिका में कार्य हैं। बस दो बातें याद रखें:
- डुप्लिकेट हटाएं - DISTINCT कीवर्ड का उपयोग करें।
- परिणाम से NULL मान हटाएं।
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
और यहाँ हमें इस तरह के अनुरोध का एक सुंदर परिणाम मिला:
कर्मचारी आयडी |
---|
1 |
2 |
5 |
4 |
6 |
चलिए इसे अस्थायी रूप से सुविधा के लिए अनुक्रम के रूप में लिखते हैं: 1,2,5,4,6। अब दूसरी क्वेरी लिखते हैं - कर्मचारी तालिका में, जो उन कर्मचारियों की सूची लौटाएगा जिनकी आईडी पहली सूची में शामिल नहीं है:
SELECT * FROM employee
WHERE id NOT IN (1,2,5,4,6)
और इस प्रश्न का परिणाम:
पहचान | नाम | पेशा | वेतन | आयु | शामिल होने की तारीख |
---|---|---|---|---|---|
3 | इवानोव सर्गेई | टेस्टर | 40000 | तीस | 2014-01-01 |
और अब, पिछले उदाहरण की तरह, आप आईडी सूची के बजाय केवल पहले अनुरोध के मुख्य भाग को प्रतिस्थापित करके दोनों अनुरोधों को जोड़ सकते हैं।
SELECT * FROM employee
WHERE id NOT IN (
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
)
GO TO FULL VERSION