मुख्य सामग्री पर जाएँ

SQL के निष्पादन का क्रम: समझें क्वेरी कैसे चलती हैं

SQL के निष्पादन क्रम को समझें और यह लिखने के क्रम से कैसे अलग है। बेहतर प्रदर्शन के लिए सटीक और ऑप्टिमाइज़्ड क्वेरी लिखें और क्वेरी डिज़ाइन में आम गलतियों से बचें।
· 5 मि॰ पढ़ें

AI के साथ खोजें

जब हम SQL क्वेरी लिखते हैं, तो आमतौर पर एक निश्चित क्रम का पालन करते हैं। (कहा जाता है कि SQL अंदर-बाहर के तरीके से लिखी जाती है।) हालांकि, SQL इंजन क्वेरी को कम्पाइल करते समय एक विशिष्ट निष्पादन क्रम का पालन करते हैं, जो लिखने के सामान्य क्रम से अलग होता है। जैसा आप देखेंगे, SQL के निष्पादन क्रम को समझना क्वेरी ऑप्टिमाइज़ेशन में महारत, क्वेरी की सटीकता और प्रदर्शन में सुधार, और जटिल समस्याओं को डिबग करने के लिए महत्वपूर्ण है।

शुरू करने के लिए, मैं DataCamp के Introduction to SQL कोर्स और SQL Fundamentals स्किल ट्रैक की सलाह देता/देती हूं, ताकि आप SQL की बुनियाद और क्वेरी के ज़रिए डेटा निकालना सीख सकें। SQL Basics Cheat Sheet फ़िल्टरिंग और एग्रीगेशन के लिए आम SQL फ़ंक्शंस का उपयोगी मार्गदर्शक है।

SQL निष्पादन क्रम क्या है?

SQL निष्पादन क्रम से तात्पर्य उस क्रम से है जिसमें क्वेरी के विभिन्न क्लॉज़ का मूल्यांकन किया जाता है। इसे समझना फ़ायदेमंद है क्योंकि निष्पादन क्रम अक्सर उस क्रम से अलग होता है जिसमें हम SQL क्वेरी लिखते हैं। सबसे सरल उदाहरण लें, आप सोच सकते हैं कि SELECT * FROM database के मामले में SELECT पहले मूल्यांकित होता है, लेकिन वास्तव में निष्पादन क्रम FROM क्लॉज़ से शुरू होता है।

यह रहा SQL का निष्पादन क्रम। अगली अनुभाग में हम प्रत्येक चरण को विस्तार से देखेंगे। 

  • FROM/JOIN: वे टेबल्स निर्दिष्ट करता है जिनसे डेटा प्राप्त करना है।
  • WHERE: ग्रुपिंग से पहले शर्त पूरी करने वाली पंक्तियों को फ़िल्टर करता है।
  • GROUP BY: समान गुण वाली पंक्तियों को समूहित करता है।
  • HAVING: समूह बनने के बाद शर्तों के आधार पर समूहों को फ़िल्टर करता है।
  • SELECT: लौटाने के लिए कॉलम या गणनाएँ निर्दिष्ट करता है।
  • DISTINCT: परिणाम सेट से डुप्लिकेट पंक्तियाँ हटाता है।
  • ORDER BY: निर्दिष्ट कॉलम के आधार पर परिणाम सेट को क्रमबद्ध करता है।
  • LIMIT: लौटाई जाने वाली पंक्तियों की अधिकतम संख्या तय करता है।
  • OFFSET: पंक्तियाँ लौटाना शुरू करने से पहले कितनी पंक्तियाँ छोड़नी हैं, यह बताता है।

नीचे दी गई क्वेरी में, मैंने कमेंट्स जोड़कर दिखाया है कि कौन-से भाग पहले मूल्यांकित होते हैं। 

-- #6+7   SELECT DISTINCT department_id                                 
-- #1     FROM employees                                                
-- #2     JOIN orders ON customers.customer_id = orders.customer_id     
-- #3     WHERE salary > 3000                                          
-- #4     GROUP BY department 
-- #5     HAVING AVG(salary) > 5000 
-- #8     ORDER BY department 
-- #9     LIMIT 10 OFFSET 5 
-- #10    OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; 

मैंने एक एक्रोस्टिक भी बनाया है जो मदद कर सकता है: For Work Goals and Hurdles Search DataCamp's Organized Learning Opportunities.

SQL क्वेरी निष्पादन के चरण

हालांकि हमारी ज़्यादातर SQL क्वेरी SELECT स्टेटमेंट से शुरू होती हैं, तार्किक निष्पादन क्रम FROM क्लॉज़ से शुरू होता है। यहाँ मैं कुछ क्वेरी लिखूंगा/लिखूंगी ताकि क्वेरी के निष्पादन क्रम को दिखाया जा सके। ध्यान रखें कि ये क्वेरी अधूरी हैं और कम्पाइल नहीं होंगी।

FROM क्लॉज़

SQL क्वेरी का निष्पादन FROM क्लॉज़ से शुरू होता है। यह आमतौर पर पहला चरण होता है क्योंकि डेटाबेस डेटा स्रोत/टेबल की पहचान करता है। जहाँ कई टेबल शामिल होती हैं, वहाँ SQL क्वेरी डेटा स्रोत के रूप में निर्दिष्ट टेबल्स को जोड़ने के लिए JOIN कंडीशन का भी मूल्यांकन करती है।

नीचे दी गई अधूरी क्वेरी पहले FROM क्लॉज़ से customers टेबल और JOIN क्लॉज़ से orders टेबल का डेटा चुनेगी।

FROM customers
JOIN orders ON customers.customer_id = orders.customer_id;

WHERE क्लॉज़

WHERE क्लॉज़, FROM और JOIN क्लॉज़ के बाद चलती है और पंक्तियों को निर्दिष्ट शर्तों के आधार पर फ़िल्टर करती है। यह ध्यान रखना महत्वपूर्ण है कि SELECT क्लॉज़ में परिभाषित कॉलम उपनामों (aliases) को सीधे WHERE में संदर्भित नहीं किया जा सकता, क्योंकि WHERE का प्रोसेसिंग SELECT से पहले होता है। 

नीचे दी गई क्वेरी WHERE क्लॉज़ का उपयोग उन कर्मचारियों के रिकॉर्ड फ़िल्टर करने के लिए करती है जिनका bonus 5000 से अधिक है।

FROM employees
JOIN departments ON employees.employee_id = departments.department_id
WHERE salary * 0.1 > 5000;

GROUP BY क्लॉज़

पंक्तियों को फ़िल्टर करने के बाद, SQL निर्दिष्ट कॉलम के आधार पर परिणामों को समूहित करने के लिए GROUP BY क्लॉज़ चलाता है। यह चरण आमतौर पर COUNT(), SUM(), और AVG() जैसे एग्रीगेट फ़ंक्शंस के साथ उपयोग होता है, ताकि निर्दिष्ट कॉलम पर गणनाएँ की जा सकें।

नीचे दी गई क्वेरी पहले उन कर्मचारियों को फ़िल्टर करती है जिनका salary 3,000 से अधिक है, फिर उन्हें department के आधार पर समूहित करती है और प्रत्येक समूह के लिए औसत वेतन निकालती है।

FROM employees e
JOIN departments d ON e.employee_id = d.department_id
WHERE e.salary > 3000
GROUP BY e.name, d.department_name;

HAVING क्लॉज़

HAVING क्लॉज़, WHERE की तरह है लेकिन GROUP BY ऑपरेशन के बाद समूहित डेटा को फ़िल्टर करने के लिए इस्तेमाल होता है। नीचे दी गई क्वेरी में, SQL employees को department के अनुसार समूहित करता है, प्रत्येक समूह के लिए औसत वेतन निकालता है, और फिर वे समूह हटा देता है जहाँ औसत वेतन 5,000 से कम या बराबर है। 

FROM employees
JOIN departments ON employees.employee_id = departments.department_id
WHERE salary > 3000
GROUP BY department_name
HAVING AVG(salary) > 5000;

SELECT क्लॉज़

SELECT क्लॉज़ वह स्थान है जहाँ SQL, पिछले चरणों के निष्पादन के बाद लौटाए जाने वाले कॉलम या अभिव्यक्तियाँ निर्धारित करता है। आप SELECT क्लॉज़ में अंकगणितीय ऑपरेशन, उपनाम (aliasing) और एग्रीगेट फ़ंक्शंस लागू कर सकते हैं।

निम्नलिखित क्वेरी employees टेबल से name और salary * 0.1 के रूप में गणना किया गया bonus प्राप्त करने के लिए SELECT क्लॉज़ का उपयोग करती है।

SELECT name, salary * 0.1 AS bonus
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY name
HAVING AVG(salary) > 5000;

DISTINCT क्लॉज़

किसी क्वेरी में DISTINCT का मूल्यांकन SELECT क्लॉज़ के बाद होता है। DISTINCT टेबल से डुप्लिकेट रिकॉर्ड हटाने में महत्वपूर्ण है क्योंकि यह यूनिक पंक्तियाँ लौटाता है। नीचे दी गई क्वेरी प्रत्येक यूनिक department_id लौटाती है, डुप्लिकेट्स को हटा कर।

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;

ORDER BY क्लॉज़

ORDER BY क्लॉज़, निर्दिष्ट कॉलम या अभिव्यक्तियों के परिणाम सेट को क्रमबद्ध करता है। WHERE क्लॉज़ के विपरीत, ORDER BY क्लॉज़ SELECT स्टेटमेंट में परिभाषित कॉलम उपनामों का उपयोग कर सकता है।

नीचे दी गई क्वेरी bonus कॉलम को अवरोही क्रम में सॉर्ट करती है। ध्यान दें कि bonus को SELECT स्टेटमेंट में एक अभिव्यक्ति के उपनाम के रूप में परिभाषित किया गया था।

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC;

LIMIT/OFFSET क्लॉज़

LIMIT और OFFSET क्लॉज़ आमतौर पर SQL क्वेरी के अंत में चलती हैं ताकि लौटाई जाने वाली पंक्तियों की संख्या सीमित की जा सके। LIMIT अधिकतम पंक्तियों की संख्या बताता है, और OFFSET यह बताता है कि पंक्तियाँ लौटाना शुरू करने से पहले कितनी पंक्तियाँ छोड़नी हैं।

नीचे दी गई क्वेरी कर्मचारियों के नाम और वेतन प्राप्त करती है, उन्हें salary के अवरोही क्रम में सॉर्ट करती है, और पहले 5 पंक्तियाँ छोड़ते हुए आउटपुट को 10 परिणामों तक सीमित करती है।

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC
LIMIT 10 OFFSET 5;
-- OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY --SQL SERVER / ORACLE

LIMIT और OFFSET क्लॉज़ MySQL और PostgreSQL डेटाबेस में समर्थित हैं। SQL Server और Oracle के लिए, आप क्वेरी से लौटाई जाने वाली पंक्तियों की संख्या सीमित करने हेतु OFFSET, ROWS FETCH, और ROWS ONLY का उपयोग करते हैं।

हमारे ट्यूटोरियल How to Use SQL OFFSET को देखें और डेटा पेजिनेशन तथा OFFSET और LIMIT क्लॉज़ के डेटाबेस-विशिष्ट सपोर्ट के बारे में और जानें।

SQL निष्पादन क्रम बनाम लिखने का क्रम

SQL एक घोषणात्मक भाषा है, यानी क्वेरी का निष्पादन क्रम लिखे गए क्रम से भिन्न होता है। इसलिए, किसी कार्य को कैसे करना है यह बताने के बजाय, आप यह घोषित करते हैं कि आपको क्या चाहिए, और डेटाबेस इंजन उसे प्राप्त करने का सर्वोत्तम तरीका तय करता है। यह तरीका Python या Java जैसी इम्पेरेटिव प्रोग्रामिंग भाषाओं से अलग है, जहाँ आप निष्पादन के लिए चरण-दर-चरण निर्देश स्पष्ट रूप से लिखते हैं। 

SQL के निष्पादन क्रम को समझने से क्वेरी बनाने के प्रति आपका दृष्टिकोण बदलता है। उदाहरण के लिए, मान लें कि आपने SELECT क्लॉज़ में बनाया गया एक उपनाम लेकर पंक्तियों को फ़िल्टर करने के लिए क्वेरी लिखी:

SELECT price * 0.9 AS discounted_price
FROM products
WHERE discounted_price > 100;

पहली नज़र में यह तार्किक लगता है, लेकिन यह त्रुटि देगा। क्यों? क्योंकि SQL के निष्पादन क्रम में WHERE का मूल्यांकन SELECT से पहले होता है। इसे ठीक करने के लिए आपको सबक्वेरी या HAVING का उपयोग करना होगा:

SELECT price * 0.9 AS discounted_price
FROM products
HAVING discounted_price > 100;

विशेष रूप से WHERE और HAVING के बारे में अधिक जानने के लिए हमारा ट्यूटोरियल पढ़ें: The Difference Between WHERE and HAVING in SQL।

सामान्य गलतियाँ और सर्वोत्तम उपयोग

भले ही लिखने का क्रम क्वेरी के निष्पादन क्रम को प्रभावित नहीं करता, निष्पादन प्रवाह को समझना सामान्य गलतियों से बचने और क्वेरी प्रदर्शन में सुधार के लिए अहम है। निम्नलिखित गलतियाँ सीधे-सीधे SQL के निष्पादन क्रम की गलतफहमी से जुड़ी हैं:

सामान्य गलतियाँ

ये सामान्य गलतियाँ आपकी क्वेरी के प्रदर्शन में बाधा बन सकती हैं।

  • WHERE क्लॉज़ में कॉलम उपनामों का उपयोग: क्योंकि WHERE क्लॉज़ का निष्पादन SELECT से पहले होता है, WHERE में उपनाम का उपयोग करने की कोशिश त्रुटि देगी। यह समझना कि SQL WHERE का मूल्यांकन SELECT से पहले करता है, सिखाता है कि आपको उपनाम पर निर्भर रहने के बजाय पूरी अभिव्यक्ति दोहरानी चाहिए।

  • पंक्ति फ़िल्टरिंग के लिए WHERE के बजाय HAVING का उपयोग: HAVING क्लॉज़ GROUP BY के बाद चलता है और एग्रीगेटेड डेटा को फ़िल्टर करने के लिए बना है। यदि आप गैर-एग्रीगेटेड डेटा फ़िल्टर कर रहे हैं, तो वह WHERE क्लॉज़ में होना चाहिए। WHERE और HAVING के निष्पादन क्रम के अंतर को जानना यह तय करने में मदद करता है कि किस शर्त को कहाँ रखा जाए।

  • GROUP BY के बिना SELECT में एग्रीगेट्स का गलत उपयोग: क्योंकि GROUP BY का निष्पादन HAVING या SELECT से पहले होता है, एग्रीगेट फ़ंक्शन लगाने से पहले डेटा को समूहित नहीं करना गलत परिणामों या त्रुटियों की ओर ले जाएगा। निष्पादन क्रम समझने से स्पष्ट होता है कि ये दोनों क्लॉज़ साथ क्यों चलते हैं।

  • ORDER BY क्लॉज़ में उपनामों का सही उपयोग न करना: WHERE क्लॉज़ के विपरीत, ORDER BY का मूल्यांकन SELECT के बाद होता है। इससे आप SELECT में बनाए गए उपनामों का सॉर्टिंग के लिए उपयोग कर सकते हैं, और यह जानकर भ्रम से बच सकते हैं कि उपनाम कब उपलब्ध होते हैं।

सर्वोत्तम उपयोग

यह सुनिश्चित करने के लिए कि आपकी क्वेरी अपेक्षा के अनुसार चले, निम्नलिखित सर्वोत्तम उपाय अपनाएँ।

  • WHERE के साथ शुरुआती फ़िल्टरिंग: क्योंकि WHERE क्लॉज़ का निष्पादन GROUP BY और JOIN से पहले होता है, जल्दी फ़िल्टर लगाने से बाद के क्लॉज़ द्वारा प्रोसेस होने वाली पंक्तियों की संख्या घटती है और प्रदर्शन सुधरता है। गैर-एग्रीगेटेड डेटा को यथासंभव जल्दी फ़िल्टर करके, आप उस डेटा को सीमित करते हैं जिसे समूहित या जोड़ा जाना है, और प्रोसेसिंग समय बचता है।

  • Joins से पहले डेटा को प्री-एग्रीगेट करें: यह जानते हुए कि FROM और JOIN पहले चलते हैं, सबक्वेरी या CTEs से डेटा को पहले ही एग्रीगेट करना जॉइन प्रक्रिया से पहले डेटासेट को छोटा कर देता है। इससे जॉइन के दौरान कम पंक्तियाँ प्रोसेस होती हैं।

  • इंडेक्स के साथ ORDER BY को ऑप्टिमाइज़ करें: क्योंकि ORDER BY अंतिम चरणों में से एक है, यह सुनिश्चित करना कि सॉर्ट किए जाने वाले कॉलम इंडेक्स्ड हों, डेटाबेस को सॉर्टिंग अधिक कुशलता से संभालने में मदद करता है और क्वेरी का प्रदर्शन तेज़ करता है।

  • प्रोडक्शन क्वेरी में SELECT * से बचें: चूँकि SELECT फ़िल्टरिंग, ग्रुपिंग और एग्रीगेशन के बाद चलता है, केवल आवश्यक कॉलम निर्दिष्ट करने से प्राप्त डेटा की मात्रा कम होती है और अनावश्यक ओवरहेड घटता है।

निष्कर्ष

SQL के निष्पादन क्रम को समझना कुशल, सटीक और ऑप्टिमाइज़्ड क्वेरी लिखने के लिए महत्वपूर्ण है। हमने SQL में क्वेरी के तार्किक निष्पादन क्रम पर चर्चा की और उसे लिखने के क्रम से तुलना की। मैं आपको अलग-अलग क्वेरी लिखने का अभ्यास करने के लिए प्रोत्साहित करता/करती हूँ ताकि तार्किक निष्पादन क्रम बेहतर समझ में आ सके। इस अवधारणा में महारत हासिल करने से आप SQL क्वेरी को ट्रबलशूट और ऑप्टिमाइज़ करने में कहीं अधिक सक्षम हो जाएंगे।

यदि आप अपनी SQL कौशल को आगे बढ़ाना चाहते हैं, तो DataCamp का Associate Data Analyst in SQL करियर ट्रैक ज़रूर आज़माएँ ताकि आप दक्ष डेटा विश्लेषक बन सकें। Reporting in SQL कोर्स भी आपको प्रभावी डेटा प्रस्तुति के लिए जटिल रिपोर्ट और डैशबोर्ड बनाने में दक्ष बनाएगा। अंत में, आपको SQL Associate Certification प्राप्त करनी चाहिए ताकि आप SQL का उपयोग कर व्यावसायिक समस्याओं को सुलझाने में अपनी महारत दिखा सकें और अन्य पेशेवरों के बीच अलग नज़र आएँ।

Allan Ouko

लेखक

Allan Ouko

डेटा एनालिटिक्स, बिज़नेस इंटेलिजेंस और डेटा साइंस में व्यावहारिक अनुभव रखने वाला डेटा साइंस तकनीकी लेखक। मैं SQL, Python, Power BI, Databricks और डेटा इंजीनियरिंग पर व्यावहारिक, उद्योग-केंद्रित सामग्री लिखता/लिखती हूँ, जो वास्तविक दुनिया की एनालिटिक्स कार्य से जुड़ी होती है। मेरी लेखनी तकनीकी गहराई और व्यावसायिक प्रभाव के बीच पुल का काम करती है, जिससे पेशेवरों को डेटा को आत्मविश्वासपूर्ण निर्णयों में बदलने में मदद मिलती है. 

SQL निष्पादन क्रम FAQs

SQL का निष्पादन लिखने के क्रम से कैसे अलग है?

SQL का निष्पादन क्रम आमतौर पर FROM क्लॉज़ से शुरू होता है, जिसके बाद WHERE और GROUP BY जैसे क्लॉज़ आते हैं, जबकि लिखने का क्रम SELECT स्टेटमेंट से शुरू होता है।

निष्पादन क्रम में JOIN कैसे फिट होता है?

JOIN ऑपरेशंस, FROM क्लॉज़ का हिस्सा होते हुए निष्पादित होते हैं।

क्या मैं WHERE क्लॉज़ में कॉलम उपनामों का उपयोग कर सकता/सकती हूँ?

नहीं, कॉलम उपनाम SELECT क्लॉज़ में परिभाषित होते हैं, जिसका निष्पादन WHERE क्लॉज़ के बाद होता है।

WHERE और HAVING में क्या अंतर है?

WHERE ग्रुपिंग से पहले पंक्तियों को फ़िल्टर करता है, जबकि HAVING GROUP BY के बाद फ़िल्टर करता है और एग्रीगेटेड डेटा पर काम करता है।

क्या SQL का निष्पादन क्रम क्वेरी प्रदर्शन को प्रभावित करता है?

हाँ, निष्पादन क्रम को समझने से आप शुरुआती चरण में फ़िल्टर लागू कर सकते हैं और अनावश्यक ऑपरेशन घटाकर क्वेरी को ऑप्टिमाइज़ कर सकते हैं।

विषय