क्वेरी को हल करने के लिए उपश्रेणियाँ
एक सबक्वेरी को एक क्वेरी के भीतर एक क्वेरी के रूप में सबसे अच्छा परिभाषित किया गया है। उपश्रेणी आपको उन प्रश्नों को लिखने में सक्षम करती है जो मापदंड के लिए डेटा पंक्तियों का चयन करते हैं जो वास्तव में विकसित होते हैं जबकि क्वेरी रन समय पर निष्पादित हो रही है। औपचारिक रूप से, यह किसी अन्य SELECT स्टेटमेंट के क्लॉस के अंदर एक SELECT स्टेटमेंट का उपयोग है। वास्तव में, एक उपश्रेणी को दूसरे उपशम के अंदर समाहित किया जा सकता है, जो कि एक अन्य उपश्रेणी के अंदर होता है, और आगे। INSERT, UPDATE, और DELETE कथनों के अंदर एक उपश्रेणी को भी नामांकित किया जा सकता है। कोष्ठक के भीतर उप-विषयों को संलग्न किया जाना चाहिए।
एक उप-वर्ग का उपयोग किसी भी स्थान पर किया जा सकता है, जहां एक अभिव्यक्ति की अनुमति है, यह एक एकल मूल्य प्रदान करता है। इसका मतलब यह है कि एक एकल मूल्य जो एक एकल मान लौटाता है, उसे एक वस्तु से एक सूची के रूप में सूचीबद्ध किया जा सकता है। इसे एक इनलाइन दृश्य कहा जाता है क्योंकि जब एक उपशम को FROM क्लॉज के भाग के रूप में उपयोग किया जाता है, तो इसे एक आभासी तालिका या दृश्य की तरह माना जाता है। उपक्वि को या तो FROM क्लॉज़ में रखा जा सकता है, जहाँ मुख्य क्वेरी का क्लॉज़ या HAVING क्लॉज़ है।
ओरेकल WHERE के क्लॉज में 255 सबक्वेरी लेवल के अधिकतम नेस्टिंग की अनुमति देता है। FROM क्लॉज में व्यक्त घोंसले के शिकार की उप-सीमाओं की कोई सीमा नहीं है। व्यवहार में, 255 स्तरों की सीमा वास्तव में बिल्कुल भी एक सीमा नहीं है, क्योंकि तीन या चार स्तरों से परे उप-वर्गों का सामना करना दुर्लभ है।
एक नियमित या बाहरी क्वेरी शुरू करने के लिए उपयोग किए जाने वाले SELECT कथन के समान एक सबक्वेरी सेलेक्ट स्टेटमेंट है। एक सबट्री का पूरा सिंटैक्स इस प्रकार है:
( SELECT [DISTINCT] subquery_select_parameter
FROM {table_name | view_name}
{table_name | view_name} ...
[WHERE search_conditions]
[GROUP BY column_name [,column_name ] ...]
[HAVING search_conditions] )
सबकुछ के प्रकार
Single Row Sub Query: उप क्वेरी जो एकल पंक्ति आउटपुट देता है। वे एकल पंक्ति तुलना ऑपरेटरों के उपयोग को चिह्नित करते हैं, जब WHERE की शर्तों में उपयोग किया जाता है।
Multiple row sub query: सब क्वेरी कई पंक्ति आउटपुट लौटाती है। वे IN, Any, ALL जैसे कई पंक्ति तुलना संचालकों का उपयोग करते हैं। कई कॉलमों को भी लौटाने वाले उप-प्रश्न हो सकते हैं।
Correlated Sub Query: संबंधित उप-वर्ग बाहरी क्वेरी द्वारा प्रदान किए गए डेटा पर निर्भर करते हैं। इस प्रकार की सबक्वेरी में उप-प्रकार भी शामिल होते हैं जो निर्दिष्ट मानदंडों को संतोषजनक डेटा पंक्तियों के अस्तित्व का परीक्षण करने के लिए EXISTS ऑपरेटर का उपयोग करते हैं।
एकल पंक्ति उप क्वेरी
एक एकल-पंक्ति सबक्वेरी का उपयोग तब किया जाता है जब बाहरी क्वेरी के परिणाम एकल, अज्ञात मान पर आधारित होते हैं। हालाँकि इस क्वेरी प्रकार को औपचारिक रूप से "एकल-पंक्ति" कहा जाता है, नाम का अर्थ है कि क्वेरी कई कॉलम लौटाती है-लेकिन परिणामों की केवल एक पंक्ति। हालाँकि, एकल-पंक्ति उपक्वेरी परिणाम की केवल एक पंक्ति को बाह्य क्वेरी में केवल एक स्तंभ से युक्त कर सकती है।
नीचे चयनित क्वेरी में, आंतरिक SQL केवल एक पंक्ति देता है यानी कंपनी के लिए न्यूनतम वेतन। यह बदले में सभी कर्मचारियों के वेतन की तुलना करने के लिए इस मूल्य का उपयोग करता है और केवल उन्हीं को प्रदर्शित करता है, जिनका वेतन न्यूनतम वेतन के बराबर है।
SELECT first_name, salary, department_id
FROM employees
WHERE salary = (SELECT MIN (salary)
FROM employees);
जब किसी स्थिति के आधार पर क्वेरी के समूह परिणामों को प्रतिबंधित करने की आवश्यकता होती है तो एक HAVING खंड का उपयोग किया जाता है। यदि किसी उप-वर्ग के परिणाम की तुलना एक समूह फ़ंक्शन के साथ की जानी चाहिए, तो आपको बाहरी क्वेरी के HAVING क्लॉज में आंतरिक क्वेरी को घोंसला बनाना होगा।
SELECT department_id, MIN (salary)
FROM employees
GROUP BY department_id
HAVING MIN (salary) < (SELECT AVG (salary) FROM employees)
एकाधिक पंक्ति उप क्वेरी
एकाधिक-पंक्ति उप-श्रृंखलाएँ नेस्टेड क्वेरीज़ हैं जो मूल क्वेरी के परिणामों की एक से अधिक पंक्ति में वापस आ सकती हैं। एकाधिक-पंक्ति उप-श्रेणियों का उपयोग आमतौर पर WHERE और HAVING खंडों में सबसे अधिक किया जाता है। चूंकि यह कई पंक्तियों को लौटाता है, इसे सेट तुलना ऑपरेटरों (IN, ALL, किसी भी) द्वारा नियंत्रित किया जाना चाहिए। जब ऑपरेटर में वही अर्थ होता है जो पहले अध्याय में चर्चा करता है, तो कोई भी ऑपरेटर उप-क्वेरी द्वारा लौटाए गए प्रत्येक मान के लिए निर्दिष्ट मान की तुलना करता है सब एक मूल्य की तुलना एक उप क्वेरी द्वारा लौटाए गए हर मूल्य से करते हैं।
जब एक पंक्ति उप क्वेरी कई पंक्तियों को लौटाती है, तो क्वेरी नीचे त्रुटि दिखाती है।
SELECT first_name, department_id
FROM employees
WHERE department_id = (SELECT department_id FROM employees WHERE LOCATION_ID = 100)
department_id = (select
*
ERROR at line 4:
ORA-01427: single-row subquery returns more than one row
मल्टीपल रो ऑपरेटरों का उपयोग
[> ALL] सबक्वेरी द्वारा लौटाए गए उच्चतम मूल्य से अधिक
[<ALL] सबक्वेरी द्वारा लौटाए गए सबसे कम मूल्य से कम
[<कोई] सबक्वेरी द्वारा लौटाए गए उच्चतम मूल्य से कम
[> कोई भी] सबक्वेरी द्वारा लौटाए गए सबसे कम मूल्य से अधिक
[= कोई भी] किसी भी मूल्य के बराबर सबक्वेरी द्वारा लौटाया गया (उसी में)
एसक्यूएल के ऊपर नीचे ऑपरेटर की तरह का उपयोग करके फिर से लिखा जा सकता है।
SELECT first_name, department_id
FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE LOCATION_ID = 100)
उपरोक्त क्वेरी में ध्यान दें, IN मैच डिपार्टमेंट आईडी उप क्वेरी से लौटाए गए, इसकी तुलना मुख्य क्वेरी में करते हैं और कर्मचारी के नाम को लौटाते हैं जो शर्त को पूरा करते हैं।
उपरोक्त क्वेरी के लिए एक जुड़ाव बेहतर समाधान होगा, लेकिन चित्रण के उद्देश्य से, इसमें उप क्वेरी का उपयोग किया गया है।
परस्पर संबंधित उप क्वेरी
एक नियमित उपवर्ग के विपरीत, जहां बाहरी क्वेरी आंतरिक क्वेरी द्वारा प्रदान किए गए मानों पर निर्भर करती है, एक सहसंबद्ध सबक्वेरी वह है जहां आंतरिक क्वेरी बाहरी क्वेरी द्वारा प्रदान किए गए मानों पर निर्भर करती है। इसका मतलब यह है कि सहसंबंधित उप-वर्ग में, आंतरिक क्वेरी को बार-बार निष्पादित किया जाता है, एक बार प्रत्येक पंक्ति के लिए जिसे बाहरी क्वेरी द्वारा चुना जा सकता है।
सहसंबद्ध उपश्रेणियाँ परिणाम तालिकाएँ बना सकती हैं जो जटिल प्रबंधन प्रश्नों का उत्तर देती हैं।
नीचे चयनित क्वेरी पर विचार करें। पहले मानी जाने वाली उपश्रेणियों के विपरीत, इस SELECT कथन में उपश्रेणी को मुख्य क्वेरी से स्वतंत्र रूप से हल नहीं किया जा सकता है। ध्यान दें कि बाहरी क्वेरी निर्दिष्ट करती है कि पंक्तियों को कर्मचारी तालिका से e1 के उपनाम के साथ चुना गया है। आंतरिक क्वेरी कर्मचारी तालिका के कर्मचारी विभाग के नंबर कॉलम (DepartmentNumber) की तुलना अन्य नाम के साथ उपनाम स्तंभ नाम e1 के लिए उसी स्तंभ से करती है।
SELECT EMPLOYEE_ID, salary, department_id
FROM employees E
WHERE salary > (SELECT AVG(salary)
FROM EMP T
WHERE E.department_id = T.department_id)
एकाधिक कॉलम उप क्वेरी
एक से अधिक कॉलम सबक्विरी बाहरी क्वेरी के लिए एक से अधिक कॉलम देता है और इसे बाहरी क्वेरी के FROM, WHERE या HAVING क्लॉज में सूचीबद्ध किया जा सकता है। उदाहरण के लिए, नीचे दी गई क्वेरी उन लोगों के लिए कर्मचारी के ऐतिहासिक विवरण को दर्शाती है, जिनका वर्तमान वेतन 1000 और 2000 की श्रेणी में है और विभाग 10 या 20 में काम कर रहा है।
SELECT first_name, job_id, salary
FROM emp_history
WHERE (salary, department_id) in (SELECT salary, department_id
FROM employees
WHERE salary BETWEEN 1000 and 2000
AND department_id BETWEEN 10 and 20)
ORDER BY first_name;
जब बाहरी क्वेरी के FROM क्लॉज़ में कई-कॉलम सबक्वेरी का उपयोग किया जाता है, तो यह एक अस्थायी तालिका बनाता है जिसे बाहरी क्वेरी के अन्य क्लॉज़ द्वारा संदर्भित किया जा सकता है। इस अस्थायी तालिका को औपचारिक रूप से इनलाइन दृश्य कहा जाता है। सबक्वेरी के परिणामों को FROM क्लॉज में किसी भी अन्य तालिका की तरह माना जाता है। यदि अस्थायी तालिका में समूहीकृत डेटा होता है, तो समूहीकृत सबसेट को तालिका में डेटा की अलग-अलग पंक्तियों के रूप में माना जाता है। नीचे दिए गए क्वेरी में FROM क्लॉज़ पर विचार करें। उपकुंजी द्वारा गठित इनलाइन दृश्य मुख्य क्वेरी के लिए डेटा स्रोत है।
SELECT *
FROM (SELECT salary, department_id
FROM employees
WHERE salary BETWEEN 1000 and 2000);