एक सबक्वेरी उस डेटा को खोजने का एक शक्तिशाली तरीका है जिसे आप किसी अन्य क्वेरी के लिए उपयोग करना चाहते हैं। इन प्रश्नों को अधिक कुशल और बनाए रखने में आसान बनाने के लिए इनका उपयोग अक्सर SELECT और UPDATE स्टेटमेंट में किया जाता है।
UPDATE स्टेटमेंट में सबक्वेरी का उपयोग करने के कई अलग-अलग तरीके हैं। आइए उनमें से प्रत्येक पर एक नज़र डालें।
सेट और सबक्वेरी
पहली विधि जिस पर हम ध्यान देंगे, वह है UPDATE स्टेटमेंट के SET क्लॉज में एक सबक्वेरी का उपयोग करना।
मान लें कि हमारे पास इस तरह दिखने वाले उत्पादों की एक तालिका थी:
[टेबल आईडी=29 /]
यह कंपनी द्वारा बेचे जाने वाले विभिन्न उत्पादों के बारे में कुछ जानकारी संग्रहीत करता है।
मान लें कि कंपनी ने "काउच" उत्पाद (उत्पाद आईडी 1) की कीमत बढ़ाने का फैसला किया है। हालांकि, एक विशिष्ट मूल्य निर्धारित करने के बजाय, वे इसे अपने सबसे महंगे उत्पाद से 20% अधिक बनाना चाहते हैं।
ऐसा करने के लिए, हम SET क्लॉज में एक सबक्वेरी का उपयोग कर सकते हैं। हम अलग-अलग कथनों का उपयोग कर सकते हैं, लेकिन एक कथन का उपयोग करके बनाए रखना आसान है।
हमारा बयान इस तरह दिखेगा:
UPDATE product SET price = ( SELECT MAX(price) * 1.2 FROM product ) WHERE product_id = 1;
आप देख सकते हैं कि SET क्लॉज में एक सबक्वेरी शामिल है, जो उत्पाद तालिका में मूल्य कॉलम का MAX मान ढूंढता है और इसे 1.2 से गुणा करके 20% जोड़ता है। अंत में, WHERE क्लॉज सबक्वेरी के बाहर है, केवल 1 के product_id को अपडेट करने के लिए, क्योंकि यह सबक्वेरी के बजाय UPDATE पर लागू होता है।
इसके परिणामस्वरूप निम्नलिखित परिवर्तन होंगे:
[टेबल आईडी=30 /]
सेट और सहसंबद्ध सबक्वेरी
UPDATE स्टेटमेंट में सबक्वायरी का उपयोग करने का दूसरा तरीका एक सहसंबद्ध सबक्वेरी का उपयोग करना है।
यह पिछले उदाहरण की तरह ही काम करता है। हालांकि, एक सहसंबद्ध सबक्वेरी एक सबक्वेरी है जो बाहरी स्टेटमेंट को संदर्भित करती है और एक UPDATE स्टेटमेंट का हिस्सा हो सकती है।
पिछले उदाहरण (उत्पाद तालिका) के डेटा का उपयोग करते हुए, कंपनी उन सभी उत्पादों को निष्क्रिय करना चाहती है जिनके लिए ऑर्डर नहीं दिया गया है। इसके लिए डेटा ऑर्डर_लाइन टेबल में स्टोर किया जाता है।
अगर हमने इसे एक सहसंबद्ध उपश्रेणी के रूप में लिखा है, तो क्वेरी इस तरह दिखेगी:
UPDATE product p SET active = ( SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM order_line o WHERE o.product_id = p.product_id );
सबक्वेरी यह निर्धारित करने के लिए कि COUNT के मान के आधार पर दिया गया मान Y या N है या नहीं, यह निर्धारित करने के लिए CASE कथन का उपयोग करके COUNT फ़ंक्शन निष्पादित करेगा। इसकी गणना प्रत्येक product_id के लिए की जाती है और बाहरी क्वेरी से मेल खाती है।
इसके परिणामस्वरूप कुछ उत्पादों के लिए सक्रिय कॉलम Y पर सेट होगा और अन्य को N पर सेट किया जाएगा:
[टेबल आईडी=31 /]
सबक्वायरी से बड़ा कहां है
WHERE क्लॉज में भी सबक्वायरी का उपयोग करना संभव है। पिछले उदाहरणों की तरह, यह अपडेट किए जाने वाले मान को खोजने के अलग चरण को हटाने और फिर इसे अपडेट करने के लिए क्वेरी चलाने के लिए किया जा सकता है।
हम पिछले चरणों से अपने उदाहरण के साथ काम करना जारी रख सकते हैं। मान लें कि कंपनी उन उत्पादों को सक्रिय करना चाहती है जिनकी कीमत औसत से ऊपर है। ऐसा करने के लिए, हम WHERE क्लॉज में एक सबक्वेरी जोड़ सकते हैं।
सबसे पहले, सभी उत्पादों को निष्क्रिय करें।
UPDATE product SET active = ’N’;
फिर, हमारी सबक्वेरी का उपयोग करके तालिका को अपडेट करें।
UPDATE product SET active = 'Y' WHERE price > ( SELECT AVG(price) FROM product );
यह उन सभी रिकॉर्ड के लिए सक्रिय मान को Y पर सेट कर देगा जिनकी कीमत औसत से अधिक है।
तालिका अब इस तरह दिखती है:
[टेबल आईडी=32 /]
यह Y के सक्रिय मान के साथ 2 रिकॉर्ड दिखाता है क्योंकि वे औसत से ऊपर हैं।
इस प्रकार की क्वेरी को अन्य ऑपरेटरों के साथ भी चलाया जा सकता है जो एकल मान की अनुमति देते हैं, जैसे <या>=.
सबक्वायरी में कहां
साथ ही, हम WHERE क्लॉज में IN ऑपरेटर के साथ सबक्वेरी का उपयोग कर सकते हैं।
यह पिछले उदाहरण के समान है जिसमें एकल मान के लिए ऑपरेटर से अधिक का उपयोग किया गया था। IN ऑपरेटर को कई मानों पर लागू किया जा सकता है।
बता दें कि कंपनी कुछ ऐसे उत्पादों की कीमत अपडेट करना चाहती थी जो इस श्रेणी में एकमात्र आइटम थे। कीमतों को आधा करना होगा।
हमारी क्वेरी कुछ इस तरह दिख सकती है:
UPDATE product SET price = price / 2 WHERE category_id IN ( SELECT category_id FROM product GROUP BY category_id HAVING COUNT(*) = 1 );
सबक्वेरी सभी श्रेणी_आईडी मान ढूंढती है जहां COUNT 1 है। हमें सबक्वायरी के SELECT भाग में COUNT रखने की आवश्यकता नहीं है, हालांकि, यदि हम करते हैं, तो क्वेरी एक त्रुटि प्रदर्शित करेगी।
अद्यतन विवरण उस मूल्य को अपडेट करेगा जहां श्रेणी उप-क्वेरी के मानदंडों को पूरा करती है।
तब हमारे परिणाम इस तरह दिखाई देंगे:
[टेबल आईडी=33 /]
डेटा बहुत समान दिखता है। हालांकि, 1 की श्रेणी आईडी वाले उत्पाद की कीमत अपनी मूल लागत के आधे तक अपडेट कर दी गई है, क्योंकि यह अपनी श्रेणी का एकमात्र उत्पाद है।
अपडेट सबक्वेरी
अंत में, आप तालिका को अद्यतन करने के लिए अद्यतन विवरण में एक सबक्वेरी का उपयोग कर सकते हैं।
पिछले उदाहरणों में, हमने अभी उत्पाद तालिका का उपयोग किया है। हालांकि, आप उत्पाद तालिका के बजाय एक सबक्वेरी का उपयोग कर सकते हैं, जो एक परिणाम सेट लौटाएगा जिसे अपडेट किया जा सकता है।
परिणाम सेट को अपडेट करने योग्य होना चाहिए, ठीक उसी तरह जैसे जब आप एक व्यू ऑब्जेक्ट बनाते हैं और इसे अपडेट करने का प्रयास करते हैं। यह सरल होना चाहिए और प्राथमिक कुंजी होनी चाहिए।
इस प्रकार, हमारे पिछले उदाहरणों का उपयोग करते हुए, मान लीजिए कि कंपनी उन सभी उत्पादों की श्रेणी बदलना चाहती है जो श्रेणी 4 से श्रेणी 5 में हैं।
हमारी क्वेरी कुछ इस तरह दिख सकती है:
UPDATE ( SELECT product_id, category_id FROM product) SET category_id = 5 WHERE category_id = 4;
यह एक सरल उदाहरण है जो अवधारणा को प्रदर्शित करता है। टेबल को SELECT स्टेटमेंट से बदल दिया गया है जो टेबल के केवल दो कॉलम दिखाता है।
इस क्वेरी के परिणाम होंगे:
[टेबल आईडी=34 /]
WHERE क्लॉज को UPDATE स्टेटमेंट में ले जाकर वही परिणाम प्राप्त किया जा सकता है:
UPDATE ( SELECT product_id, category_id FROM product WHERE category_id = 4) SET category_id = 5;
निष्कर्ष
UPDATE स्टेटमेंट में सबक्वेरी का उपयोग करना आपके प्रश्नों की स्थिरता को बेहतर बनाने का एक अच्छा तरीका हो सकता है। यह एक ही क्वेरी में दो या अधिक प्रश्नों को संपीड़ित करके आपके डेटा को अपडेट करने के लिए आवश्यक चरणों की संख्या को भी कम कर सकता है।