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 
   )