जानें कि SQL क्वेरियों में WHERE पंक्ति-स्तर के डाटा को फ़िल्टर करता है, जबकि HAVING एग्रीगेशन के बाद समूहित डाटा को फ़िल्टर करता है—और इनके अलग-अलग उपयोगों में महारत पाएं।
WHERE और HAVING SQL की दो आवश्यक क्लॉज़ हैं। आप बहुत उन्नत क्वेरियाँ लिख रहे हों या साधारण, दोनों का उपयोग करने की ज़रूरत पड़ेगी। आप WHERE और HAVING को सहोदर मान सकते हैं। दोनों का काम समान है (फिल्टरिंग), और ये अक्सर साथ दिखते हैं। लेकिन, सहोदरों की तरह ही, इनकी अपनी-अपनी विशिष्टताएँ और अलग भूमिकाएँ होती हैं.
यदि आप WHERE और HAVING को समझने-समझाने की प्रक्रिया में हैं, तो मैं सुझाव दूँगा कि आप हमारे SQL Fundamentals स्किल ट्रैक में नामांकन करें—शुरुआत के लिए यह एक बढ़िया और व्यापक संसाधन है। यह आपको अलग-अलग SQL क्लॉज़, SQL में क्लॉज़ के निष्पादन का क्रम, SQL क्वेरियों का अनुकूलन, और कई अन्य अहम बातें सिखाएगा.
संक्षेप में: WHERE बनाम HAVING
संक्षेप में—और यही बहुतों के लिए उलझन का कारण है—WHERE पंक्ति-स्तर के डाटा पर काम करता है, जबकि HAVING समूहित डाटा पर काम करता है। मार्गदर्शन के लिए:
WHERE किसी भी ग्रुपिंग या एग्रीगेशन से पहले पंक्तियों को फ़िल्टर करता है। यह व्यक्तिगत पंक्तियों पर लागू होता है और एग्रीगेट फ़ंक्शंस के साथ इस्तेमाल नहीं किया जा सकता।
HAVING ग्रुपिंग और एग्रीगेशन हो जाने के बाद समूहों को फ़िल्टर करता है। यह एग्रीगेट फ़ंक्शंस के परिणामों पर लागू होता है और GROUP BY के साथ संयोजन में इस्तेमाल होता है.
अंतर समझाने के लिए एक त्वरित उदाहरण
एक छोटा-सा उदाहरण देखते हैं। यदि आप अपने वर्कफ़्लो के साथ चलना चाहते हैं, तो आप प्रॉपर्टी रेंटल्स डेटासेट को इस GitHub रिपॉज़िटरी से डाउनलोड कर सकते हैं।
अब मान लें हमें अपने डेटासेट में उन सभी प्रॉपर्टीज़ को लौटाना है जिनका रेंटल मूल्य $500 से कम है। डेटासेट की हर पंक्ति का विवरण स्तर (प्रति पंक्ति एक प्रॉपर्टी) क्वेरी की शर्त के विवरण स्तर से मेल खाता है। इसलिए, हम निम्नलिखित क्वेरी में WHERE का उपयोग करेंगे:
SELECT*FROM rentals
WHERE rental_price <500संचालित द्वारा
परिणाम कुछ इस तरह दिखेगा। ध्यान दें कि 118 पंक्तियाँ लौटती हैं।
WHERE के साथ साधारण पंक्ति फ़िल्टरिंग। छवि: लेखक.
अब मान लें कि हम प्रॉपर्टीज़ की टेबल नहीं, बल्कि उन शहरों की टेबल चाहते हैं जिनका औसत रेंटल मूल्य $2,700 से कम है। यहाँ हर पंक्ति किसी प्रॉपर्टी के बजाय एक शहर के औसत किराए का प्रतिनिधित्व करेगी—यानी हम पंक्तियों को समूहबद्ध करके रेंटल मूल्य का औसत निकालेंगे। अतः, हम HAVING का उपयोग करेंगे, जैसे कि इस क्वेरी में:
SELECT city,AVG(rental_price)AS average_rent
FROM rentals
GROUPBY city
HAVINGAVG(rental_price)<2700;संचालित द्वारा
और परिणाम इस तरह होगा। ध्यान दें कि केवल एक परिणाम है.
HAVING के साथ साधारण समूह फ़िल्टरिंग। छवि: लेखक.
WHERE, HAVING, और SQL में निष्पादन का क्रम
हमने देखा कि WHERE पंक्ति-स्तर की फ़िल्टरिंग के लिए काम करता है, जबकि HAVING एग्रीगेट-स्तर की फ़िल्टरिंग करता है। इस अंतर को समझना हमें SQL में क्लॉज़ के निष्पादन के क्रम को सीखने का मार्ग भी दिखाता है.
WHERE का मूल्यांकन GROUP BY से पहले, और ठीक FROM (और यदि हो तो JOIN) के बाद होता है; यह किसी ग्रुपिंग या एग्रीगेशन से नहीं निपटता। WHERE एग्रीगेशन होने से पहले ही लागू हो जाता है। इसलिए यह केवल पंक्ति-स्तर के डाटा पर काम करता है.
वहीं, HAVING का उपयोग GROUP BY क्लॉज़ के निष्पादित होने के बाद आता है। यानी यह तब काम में आता है जब टेबल को रूपांतरित कर समूहबद्ध कर दिया गया हो और उसका स्तर स्रोत टेबल की सूक्ष्मता से अलग हो। HAVING टेबल के नए, रूपांतरित संस्करण पर काम करता है.
SQL में WHERE क्लॉज़ का उपयोग कैसे करें
अब एक कदम पीछे चलें और प्रत्येक क्लॉज़ को अलग-अलग देखें। शुरुआत WHERE क्लॉज़ से करते हैं।
WHERE का सिंटैक्स और स्टेटमेंट
WHERE तीन अलग-अलग SQL स्टेटमेंट में उपयोग किया जा सकता है: SELECT, UPDATE, और DELETE।
SELECT स्टेटमेंट में WHERE
SELECT स्टेटमेंट, जो डेटाबेस से डाटा लाने के लिए उपयोग होते हैं, में WHERE पंक्ति-स्तर फ़िल्टरिंग की अपनी भूमिका निभाता है और FROM क्लॉज़ के ठीक बाद आता है, जैसा कि इस क्वेरी में देखें:
SELECT column1, column2… etc.FROM table_name
WHERE condition;संचालित द्वारा
SELECT के साथ WHERE का उपयोग वह जगह है जहाँ WHERE क्लॉज़ अक्सर HAVING से गड़बड़ा दिया जाता है.
UPDATE स्टेटमेंट में WHERE
इसके अलावा, WHEREUPDATE स्टेटमेंट में भी अहम भूमिका निभाता है ताकि यह निर्धारित किया जा सके कि किस पंक्ति में डाटा अपडेट होना चाहिए, जैसा कि यह सिंटैक्स दर्शाता है:
UPDATE table_name
SET column_name1 = value1, column_name2 = value2… etc.WHERE condition;संचालित द्वारा
DELETE स्टेटमेंट में WHERE
WHEREDELETE स्टेटमेंट के लिए भी उपयोगी है ताकि यह तय किया जा सके कि किन रिकॉर्ड्स (पंक्तियों) को हटाया जाना चाहिए, जैसा कि यहाँ देखें:
WHERE कंडीशन एक सरल लॉजिकल अभिव्यक्ति की तरह लिखी जाती है। इसमें तीन भाग होते हैं: वेरिएबल/ऑपरेंड, कंडीशन, और वैल्यू/परिणाम। आइए WHERE कंडीशनों के विकल्प देखें जिनमें तुलना (comparison) और लॉजिकल ऑपरेटर दोनों शामिल हैं.
कई कंडीशनों को मिलाता है, कम से कम एक सच होना चाहिए
लॉजिकल (बूलियन)
NOT
किसी कंडीशन का निषेध
लॉजिकल (बूलियन)
IS NULL
null मानों की जाँच
सभी डाटा प्रकार
IS NOT NULL
गैर-null मानों की जाँच
सभी डाटा प्रकार
यहाँ NOT को IN तुलना ऑपरेटर के साथ उपयोग करने का एक उदाहरण है:
SELECT*FROM rentals
WHERE city NOTIN('Cairo','Giza');संचालित द्वारा
यह स्टेटमेंट उन सभी प्रॉपर्टीज़ को लौटाएगा जो न तो Cairo और न ही Giza शहर में हैं।
Cairo और Giza के बाहर की प्रॉपर्टीज़। छवि: लेखक।
WHERE के उपयोग के मामले
यह जानते हुए कि WHERESELECT, UPDATE और DELETE स्टेटमेंट्स के साथ काम करता है, हम तीन उपयोग-परिदृश्य देख सकते हैं: पंक्ति-स्तर फ़िल्टरिंग, डाटा प्राप्ति, और डाटा हेरफेर।
पंक्ति-स्तर फ़िल्टरिंग
हम अपनी टेबल की पंक्तियों को एक या अधिक शर्तों के आधार पर फ़िल्टर कर सकते हैं। निम्नलिखित क्वेरी केवल विला प्रॉपर्टीज़ को शामिल करने के लिए पंक्तियों को फ़िल्टर करती है।
WHERE का उपयोग उस विशेष डाटा बिंदु को प्राप्त करने के लिए किया जा सकता है जिसकी हमें तलाश है। यह पंक्ति-स्तर फ़िल्टरिंग जैसा है लेकिन अधिक विशिष्ट। मान लें हमें उस प्रॉपर्टी का ID जानना है जो 1 जनवरी 2022 को Cairo में उपलब्ध थी, तो हम यह क्वेरी लिख सकते हैं:
SELECT property_id
FROM rentals
WHERE available_date ='2022-01-01'AND city ='Cairo';संचालित द्वारा
एक डाटा बिंदु प्राप्त करना। छवि: लेखक.
डाटा हेरफेर
अंत में, WHERE आपके डेटाबेस में मानों को संशोधित करने और विशिष्ट रिकॉर्ड हटाने के लिए बहुत मददगार है। उदाहरण के लिए, यदि हमें पता चलता है कि प्रॉपर्टी 171 असल में पालतू-अनुकूल नहीं है, तो हम UPDATE स्टेटमेंट में WHERE का उपयोग कर pet_friendly कॉलम को इस प्रकार संशोधित कर सकते हैं:
UPDATE rentals
SET pet_friendly =falseWHERE property_id =171;संचालित द्वारा
SQL में HAVING क्लॉज़ का उपयोग कैसे करें
अब, बारी है HAVING क्लॉज़ को इसी स्तर की बारीकी से समझने की.
HAVING का सिंटैक्स और स्टेटमेंट
सबसे पहले, ध्यान दें कि HAVING क्लॉज़ केवल SELECT स्टेटमेंट में उपयोग किया जा सकता है। इसलिए, इसका एकमात्र सिंटैक्स निम्न प्रकार है:
SELECT grouped_column, aggregate_function(aggregated_column)… etc.FROM table_name
GROUPBY grouped_column
HAVING conditionसंचालित द्वारा
ध्यान दें कि आप एक से अधिक समूहित कॉलम और एक से अधिक एग्रीगेटेड कॉलम जोड़ सकते हैं। हम नीचे उदाहरण देखेंगे।
HAVING कंडीशन कैसे लिखें
WHERE की तरह, HAVING कंडीशन भी लॉजिकल अभिव्यक्तियों के रूप में लिखी जाती हैं, पर एक अतिरिक्त घटक—एग्रीगेशन फ़ंक्शन—के साथ। इस प्रकार, एक HAVING कंडीशन में होते हैं: 1) एग्रीगेट फ़ंक्शन, 2) वेरिएबल/ऑपरेंड, 3) तुलना ऑपरेटर, और 4) मान/परिणाम।
HAVING के साथ एग्रीगेट फ़ंक्शन
SQL में मुख्यतः पाँच एग्रीगेट फ़ंक्शन होते हैं, और एक छठा विशेष स्थिति के रूप में। ये फ़ंक्शंस हैं:
एग्रीगेट फ़ंक्शन
उपयुक्त डाटा प्रकार
SUM()
सांख्यिक
AVG()
सांख्यिक
MIN()
सांख्यिक, टेक्स्ट, तारीख/टाइमस्टैम्प
MAX()
सांख्यिक, टेक्स्ट, तारीख/टाइमस्टैम्प
COUNT()
सांख्यिक, टेक्स्ट, तारीख/टाइमस्टैम्प, बूलियन
एक उदाहरण देखते हैं। यहाँ हम COUNT() फ़ंक्शन को GROUP BY के साथ प्रयोग कर एक फ़्रीक्वेंसी टेबल बनाते हैं, और HAVING कंडीशन को फ़िल्टर की तरह इस्तेमाल करते हैं। विशेष रूप से, हमें वे शहर जानने हैं जिनका उल्लेख 150 बार या उससे कम हुआ है, जो इस संदर्भ में पंजीकरणों की संख्या से संबंधित होगा। हम यह क्वेरी लिख सकते हैं:
SELECT city,COUNT(*)AS properties_count
FROM rentals
GROUPBY city
HAVINGCOUNT(*)<=150;संचालित द्वारा
HAVING के साथ COUNT() का उपयोग। छवि: लेखक.
तुलना और लॉजिकल ऑपरेटर
HAVING वे सभी तुलना और लॉजिकल ऑपरेटर स्वीकार करता है जो WHERE स्वीकार करता है। एकमात्र अंतर यह है कि HAVING के साथ उपयुक्त डाटा प्रकार मुख्यतः प्रयुक्त एग्रीगेट फ़ंक्शन पर निर्भर करता है, जैसा कि ऊपर तालिका में देखा।
HAVING के उपयोग के मामले
WHERE के विपरीत, HAVING को UPDATE और DELETE स्टेटमेंट में इस्तेमाल नहीं किया जा सकता; HAVING केवल डाटा प्राप्ति के लिए उपयोग होता है। मोटे तौर पर, यह दो परिदृश्यों में बँटता है:
समूह-स्तर फ़िल्टरिंग
यह HAVING का सामान्य और मानक उपयोग है। उदाहरण के लिए, केवल वे शहर लौटाना जिनका औसत रेंटल मूल्य $2,700 से कम है।
SELECT city,AVG(rental_price)AS avg_price
FROM rentals
GROUPBY city
HAVINGAVG(rental_price)<2700;संचालित द्वारा
एकल-पंक्ति फ़िल्टरिंग
यह कम सामान्य स्थिति है, पर HAVING का उपयोग एकल-पंक्ति एग्रीगेशन—जैसे कोई मीट्रिक या KPI—लौटाने के लिए किया जा सकता है, केवल यदि वह किसी शर्त को पूरा करता हो। यह GROUP BY के बिना HAVING के उपयोग से प्राप्त किया जा सकता है। निम्न उदाहरण में, हम औसत रेंटल मूल्य केवल तभी लौटाते हैं जब वह $2,800 से कम हो। यदि मान शर्त पूरी करे, तो एकल-पंक्ति परिणाम मिलेगा; अन्यथा, टेबल खाली होगी।
SELECTAVG(rental_price)as avg_price
FROM rentals
HAVINGAVG(rental_price)>2800;संचालित द्वारा
WHERE और HAVING का संयोजन
WHERE और HAVING को एक साथ उपयोग कर एग्रीगेशन से पहले और बाद—दोनों स्थितियों में—टेबल को फ़िल्टर किया जा सकता है। निम्न उदाहरण में, हम हर शहर में प्रॉपर्टीज़ की गिनती लौटाते हैं, केवल वे प्रॉपर्टीज़ गिनते हुए जो पालतू-अनुकूल हैं, और केवल उन शहरों को फ़िल्टर करते हुए जहाँ 80 से अधिक प्रॉपर्टीज़ हैं।
SELECT city,COUNT(*)AS number_properties
FROM rentals
WHERE pet_friendly =trueGROUPBY city
HAVINGCOUNT(*)>80;संचालित द्वारा
WHERE और HAVING का बुनियादी संयोजन। छवि: लेखक.
प्रदर्शन (परफ़ॉर्मेंस) में WHERE और HAVING के बीच अंतर
हम जानते हैं कि WHERE क्लॉज़ ग्रुपिंग या एग्रीगेशन से पहले लागू होता है। इसी कारण, क्योंकि यह क्वेरी की शुरुआत में ही प्रोसेस होने वाली पंक्तियों की संख्या घटा देता है, व्यक्तिगत पंक्तियों को फ़िल्टर करने के लिए WHERE अधिक कुशल होता है.
दूसरी ओर, HAVING क्लॉज़ एग्रीगेशन के बाद लागू होता है और समूहित डाटा के आधार पर रिज़ल्ट सेट को फ़िल्टर करता है। इस वजह से, क्योंकि यह सभी पंक्तियों के समूहित हो जाने के बाद डाटा प्रोसेस करता है, यह आम तौर पर WHERE से कम कुशल होता है—हालाँकि एग्रीगेट फ़ंक्शंस से जुड़ी शर्तों के लिए यह आवश्यक है।
आइए इस क्वेरी को देखें:
SELECT city,COUNT(*)FROM rentals
GROUPBY city
HAVING rental_price <2700;संचालित द्वारा
यह क्वेरी अक्षम है क्योंकि rental_price की शर्त किसी एग्रीगेशन पर निर्भर नहीं करती—यह व्यक्तिगत पंक्तियों को फ़िल्टर करती है। यह क्वेरी पहले सभी रेंटल्स को शहर के अनुसार समूहित करेगी, उनकी गिनती करेगी, और फिर परिणाम को फ़िल्टर करेगी—जो गैर-ज़रूरी पंक्तियों को प्रोसेस करने के कारण अक्षम है। इसी कारण, यह क्वेरी तेज़ होगी:
SELECT city,COUNT(*)FROM rentals
WHERE rental_price <2700GROUPBY city;संचालित द्वारा
WHERE और HAVING के अनुकूलन के सुझाव
उपरोक्त के आधार पर, हम कुछ अच्छी प्रथाएँ देख सकते हैं जो WHERE और HAVING के उपयोग को अनुकूलित कर सकती हैं। यदि आपके पास बड़े डेटासेट हैं, तो यह विशेष रूप से महत्वपूर्ण है।
उच्च चयनात्मक रहें: केवल उन्हीं मानों के अनुसार फ़िल्टर करें जिनकी आपको आवश्यकता है—और उससे ज़्यादा नहीं। इससे व्यू में पंक्तियों की संख्या घटेगी और क्वेरी की दक्षता बढ़ेगी।
सरल रखें: किसी भी अनावश्यक कंडीशन, एग्रीगेशन और टाइप-कास्ट को हटा दें। ये सारे ऐड-ऑन गणनात्मक लागत के साथ आते हैं।
जल्दी फ़िल्टर करें: यदि आप समूह-स्तर एग्रीगेशन कर रहे हैं, तो समूह बनाने की प्रक्रिया तेज़ करने के लिए पहले WHERE से पंक्तियों को प्री-फ़िल्टर करें। ऐसा करके, आप समूह में प्रोसेस होने वाली पंक्तियों की संख्या घटाएँगे।
तुलनात्मक तालिका
आइए अपनी बातों को एक सुविधाजनक तालिका में समेटें:
तुलना
WHERE
HAVING
मुख्य उद्देश्य
पंक्ति-स्तर फ़िल्टरिंग
समूह-स्तर फ़िल्टरिंग
बुनियादी सिंटैक्स
SELECT column1, column2... FROM table_name WHERE condition;
SELECT grouped_column, aggregate_function(aggregated_column)... FROM table_name GROUP BY grouped_column HAVING condition;
मूल्यांकन क्रम
GROUP BY से पहले
GROUP BY के बाद
संगत स्टेटमेंट
SELECT, UPDATE, DELETE
SELECT
कंडीशन
एग्रीगेट फ़ंक्शंस शामिल नहीं कर सकते
एग्रीगेट फ़ंक्शंस शामिल होने चाहिए
उपयोग के मामले
पंक्ति-स्तर फ़िल्टरिंग डाटा प्राप्ति डाटा हेरफेर
समूह-स्तर फ़िल्टरिंग एकल-पंक्ति फ़िल्टरिंग
सबक्वेरियाँ
सबक्वेरियों के साथ काम कर सकता है
CTE के रूप में लिखना चाहिए
निष्कर्ष
इस लेख में, हमने SQL में WHERE और HAVING के बीच मुख्य अंतर को समझा—कि WHERE क्लॉज़ एग्रीगेशन से पहले पंक्तियों को फ़िल्टर करता है, जबकि HAVING क्लॉज़ एग्रीगेशन के बाद समूहित डाटा को फ़िल्टर करता है। हमने कुछ कम चर्चित अंतरों पर भी चर्चा की, जैसे कि WHERESELECT, UPDATE, और DELETE स्टेटमेंट्स के साथ काम कर सकता है, लेकिन HAVING केवल SELECT के साथ काम करता है। हमने प्रदर्शन से जुड़ी बातों पर भी संक्षेप में चर्चा की।
इस्लाम The KPI Institute में डेटा कंसल्टेंट हैं। पत्रकारिता के पृष्ठभूमि के साथ, इस्लाम की रुचियाँ विविध हैं, जिनमें लेखन, दर्शन, मीडिया, तकनीक और संस्कृति शामिल हैं।
Frequently Asked Questions
WHERE और HAVING में क्या अंतर है?⌄
WHERE पंक्ति-स्तर फ़िल्टरिंग करता है जबकि HAVING समूह-स्तर फ़िल्टरिंग करता है।
क्या मैं एक ही क्वेरी में WHERE और HAVING दोनों का उपयोग कर सकता/सकती हूँ?⌄
हाँ, और यदि आप HAVING का उपयोग करने जा रहे हैं, तो WHERE का उपयोग करना अत्यंत अनुशंसित है।
क्या WHERE, HAVING की तरह एग्रीगेट फ़ंक्शंस के साथ काम कर सकता है?⌄
नहीं, एग्रीगेट फ़ंक्शंस के साथ केवल HAVING काम कर सकता है।
क्या WHERE और HAVING एक ही तुलना और लॉजिकल ऑपरेटर के साथ काम करते हैं?⌄
हाँ, दोनों एक ही ऑपरेटर के साथ काम करते हैं क्योंकि WHERE और HAVING कंडीशन लॉजिकल अभिव्यक्ति के रूप में लिखी जाती हैं।
क्या मैं GROUP BY के बिना HAVING का उपयोग कर सकता/सकती हूँ?⌄
HAVING सामान्यतः GROUP BY के साथ ग्रुपिंग के बाद उपयोग होता है। इसका एक अपवाद है—एक-मूल्य वाले व्यू की फ़िल्टरिंग (जैसे किसी एक मीट्रिक की गणना)।
WHEREऔरHAVINGSQL की दो आवश्यक क्लॉज़ हैं। आप बहुत उन्नत क्वेरियाँ लिख रहे हों या साधारण, दोनों का उपयोग करने की ज़रूरत पड़ेगी। आपWHEREऔरHAVINGको सहोदर मान सकते हैं। दोनों का काम समान है (फिल्टरिंग), और ये अक्सर साथ दिखते हैं। लेकिन, सहोदरों की तरह ही, इनकी अपनी-अपनी विशिष्टताएँ और अलग भूमिकाएँ होती हैं.यदि आप
WHEREऔरHAVINGको समझने-समझाने की प्रक्रिया में हैं, तो मैं सुझाव दूँगा कि आप हमारे SQL Fundamentals स्किल ट्रैक में नामांकन करें—शुरुआत के लिए यह एक बढ़िया और व्यापक संसाधन है। यह आपको अलग-अलग SQL क्लॉज़, SQL में क्लॉज़ के निष्पादन का क्रम, SQL क्वेरियों का अनुकूलन, और कई अन्य अहम बातें सिखाएगा.संक्षेप में: WHERE बनाम HAVING
संक्षेप में—और यही बहुतों के लिए उलझन का कारण है—
WHEREपंक्ति-स्तर के डाटा पर काम करता है, जबकिHAVINGसमूहित डाटा पर काम करता है। मार्गदर्शन के लिए:WHEREकिसी भी ग्रुपिंग या एग्रीगेशन से पहले पंक्तियों को फ़िल्टर करता है। यह व्यक्तिगत पंक्तियों पर लागू होता है और एग्रीगेट फ़ंक्शंस के साथ इस्तेमाल नहीं किया जा सकता।HAVINGग्रुपिंग और एग्रीगेशन हो जाने के बाद समूहों को फ़िल्टर करता है। यह एग्रीगेट फ़ंक्शंस के परिणामों पर लागू होता है औरGROUP BYके साथ संयोजन में इस्तेमाल होता है.अंतर समझाने के लिए एक त्वरित उदाहरण
एक छोटा-सा उदाहरण देखते हैं। यदि आप अपने वर्कफ़्लो के साथ चलना चाहते हैं, तो आप प्रॉपर्टी रेंटल्स डेटासेट को इस GitHub रिपॉज़िटरी से डाउनलोड कर सकते हैं।
अब मान लें हमें अपने डेटासेट में उन सभी प्रॉपर्टीज़ को लौटाना है जिनका रेंटल मूल्य $500 से कम है। डेटासेट की हर पंक्ति का विवरण स्तर (प्रति पंक्ति एक प्रॉपर्टी) क्वेरी की शर्त के विवरण स्तर से मेल खाता है। इसलिए, हम निम्नलिखित क्वेरी में
WHEREका उपयोग करेंगे:परिणाम कुछ इस तरह दिखेगा। ध्यान दें कि 118 पंक्तियाँ लौटती हैं।
WHERE के साथ साधारण पंक्ति फ़िल्टरिंग। छवि: लेखक.
अब मान लें कि हम प्रॉपर्टीज़ की टेबल नहीं, बल्कि उन शहरों की टेबल चाहते हैं जिनका औसत रेंटल मूल्य $2,700 से कम है। यहाँ हर पंक्ति किसी प्रॉपर्टी के बजाय एक शहर के औसत किराए का प्रतिनिधित्व करेगी—यानी हम पंक्तियों को समूहबद्ध करके रेंटल मूल्य का औसत निकालेंगे। अतः, हम
HAVINGका उपयोग करेंगे, जैसे कि इस क्वेरी में:और परिणाम इस तरह होगा। ध्यान दें कि केवल एक परिणाम है.
HAVING के साथ साधारण समूह फ़िल्टरिंग। छवि: लेखक.
WHERE, HAVING, और SQL में निष्पादन का क्रम
हमने देखा कि
WHEREपंक्ति-स्तर की फ़िल्टरिंग के लिए काम करता है, जबकिHAVINGएग्रीगेट-स्तर की फ़िल्टरिंग करता है। इस अंतर को समझना हमें SQL में क्लॉज़ के निष्पादन के क्रम को सीखने का मार्ग भी दिखाता है.WHEREका मूल्यांकनGROUP BYसे पहले, और ठीकFROM(और यदि हो तोJOIN) के बाद होता है; यह किसी ग्रुपिंग या एग्रीगेशन से नहीं निपटता।WHEREएग्रीगेशन होने से पहले ही लागू हो जाता है। इसलिए यह केवल पंक्ति-स्तर के डाटा पर काम करता है.वहीं,
HAVINGका उपयोगGROUP BYक्लॉज़ के निष्पादित होने के बाद आता है। यानी यह तब काम में आता है जब टेबल को रूपांतरित कर समूहबद्ध कर दिया गया हो और उसका स्तर स्रोत टेबल की सूक्ष्मता से अलग हो।HAVINGटेबल के नए, रूपांतरित संस्करण पर काम करता है.SQL में WHERE क्लॉज़ का उपयोग कैसे करें
अब एक कदम पीछे चलें और प्रत्येक क्लॉज़ को अलग-अलग देखें। शुरुआत
WHEREक्लॉज़ से करते हैं।WHERE का सिंटैक्स और स्टेटमेंट
WHEREतीन अलग-अलग SQL स्टेटमेंट में उपयोग किया जा सकता है:SELECT,UPDATE, औरDELETE।SELECT स्टेटमेंट में WHERE
SELECTस्टेटमेंट, जो डेटाबेस से डाटा लाने के लिए उपयोग होते हैं, मेंWHEREपंक्ति-स्तर फ़िल्टरिंग की अपनी भूमिका निभाता है औरFROMक्लॉज़ के ठीक बाद आता है, जैसा कि इस क्वेरी में देखें:SELECTके साथWHEREका उपयोग वह जगह है जहाँWHEREक्लॉज़ अक्सरHAVINGसे गड़बड़ा दिया जाता है.UPDATE स्टेटमेंट में WHERE
इसके अलावा,
WHEREUPDATEस्टेटमेंट में भी अहम भूमिका निभाता है ताकि यह निर्धारित किया जा सके कि किस पंक्ति में डाटा अपडेट होना चाहिए, जैसा कि यह सिंटैक्स दर्शाता है:DELETE स्टेटमेंट में WHERE
WHEREDELETEस्टेटमेंट के लिए भी उपयोगी है ताकि यह तय किया जा सके कि किन रिकॉर्ड्स (पंक्तियों) को हटाया जाना चाहिए, जैसा कि यहाँ देखें:WHERE कंडीशन कैसे लिखें
WHEREकंडीशन एक सरल लॉजिकल अभिव्यक्ति की तरह लिखी जाती है। इसमें तीन भाग होते हैं: वेरिएबल/ऑपरेंड, कंडीशन, और वैल्यू/परिणाम। आइएWHEREकंडीशनों के विकल्प देखें जिनमें तुलना (comparison) और लॉजिकल ऑपरेटर दोनों शामिल हैं.यहाँ
NOTकोINतुलना ऑपरेटर के साथ उपयोग करने का एक उदाहरण है:यह स्टेटमेंट उन सभी प्रॉपर्टीज़ को लौटाएगा जो न तो Cairo और न ही Giza शहर में हैं।
Cairo और Giza के बाहर की प्रॉपर्टीज़। छवि: लेखक।
WHERE के उपयोग के मामले
यह जानते हुए कि
WHERESELECT,UPDATEऔरDELETEस्टेटमेंट्स के साथ काम करता है, हम तीन उपयोग-परिदृश्य देख सकते हैं: पंक्ति-स्तर फ़िल्टरिंग, डाटा प्राप्ति, और डाटा हेरफेर।पंक्ति-स्तर फ़िल्टरिंग
हम अपनी टेबल की पंक्तियों को एक या अधिक शर्तों के आधार पर फ़िल्टर कर सकते हैं। निम्नलिखित क्वेरी केवल विला प्रॉपर्टीज़ को शामिल करने के लिए पंक्तियों को फ़िल्टर करती है।
विला प्रॉपर्टीज़ का चयन। छवि: लेखक.
डाटा प्राप्ति
WHEREका उपयोग उस विशेष डाटा बिंदु को प्राप्त करने के लिए किया जा सकता है जिसकी हमें तलाश है। यह पंक्ति-स्तर फ़िल्टरिंग जैसा है लेकिन अधिक विशिष्ट। मान लें हमें उस प्रॉपर्टी का ID जानना है जो 1 जनवरी 2022 को Cairo में उपलब्ध थी, तो हम यह क्वेरी लिख सकते हैं:एक डाटा बिंदु प्राप्त करना। छवि: लेखक.
डाटा हेरफेर
अंत में,
WHEREआपके डेटाबेस में मानों को संशोधित करने और विशिष्ट रिकॉर्ड हटाने के लिए बहुत मददगार है। उदाहरण के लिए, यदि हमें पता चलता है कि प्रॉपर्टी 171 असल में पालतू-अनुकूल नहीं है, तो हमUPDATEस्टेटमेंट मेंWHEREका उपयोग करpet_friendlyकॉलम को इस प्रकार संशोधित कर सकते हैं:SQL में HAVING क्लॉज़ का उपयोग कैसे करें
अब, बारी है
HAVINGक्लॉज़ को इसी स्तर की बारीकी से समझने की.HAVING का सिंटैक्स और स्टेटमेंट
सबसे पहले, ध्यान दें कि
HAVINGक्लॉज़ केवलSELECTस्टेटमेंट में उपयोग किया जा सकता है। इसलिए, इसका एकमात्र सिंटैक्स निम्न प्रकार है:ध्यान दें कि आप एक से अधिक समूहित कॉलम और एक से अधिक एग्रीगेटेड कॉलम जोड़ सकते हैं। हम नीचे उदाहरण देखेंगे।
HAVING कंडीशन कैसे लिखें
WHEREकी तरह,HAVINGकंडीशन भी लॉजिकल अभिव्यक्तियों के रूप में लिखी जाती हैं, पर एक अतिरिक्त घटक—एग्रीगेशन फ़ंक्शन—के साथ। इस प्रकार, एकHAVINGकंडीशन में होते हैं: 1) एग्रीगेट फ़ंक्शन, 2) वेरिएबल/ऑपरेंड, 3) तुलना ऑपरेटर, और 4) मान/परिणाम।HAVING के साथ एग्रीगेट फ़ंक्शन
SQL में मुख्यतः पाँच एग्रीगेट फ़ंक्शन होते हैं, और एक छठा विशेष स्थिति के रूप में। ये फ़ंक्शंस हैं:
एक उदाहरण देखते हैं। यहाँ हम
COUNT()फ़ंक्शन कोGROUP BYके साथ प्रयोग कर एक फ़्रीक्वेंसी टेबल बनाते हैं, औरHAVINGकंडीशन को फ़िल्टर की तरह इस्तेमाल करते हैं। विशेष रूप से, हमें वे शहर जानने हैं जिनका उल्लेख 150 बार या उससे कम हुआ है, जो इस संदर्भ में पंजीकरणों की संख्या से संबंधित होगा। हम यह क्वेरी लिख सकते हैं:HAVING के साथ COUNT() का उपयोग। छवि: लेखक.
तुलना और लॉजिकल ऑपरेटर
HAVINGवे सभी तुलना और लॉजिकल ऑपरेटर स्वीकार करता है जोWHEREस्वीकार करता है। एकमात्र अंतर यह है किHAVINGके साथ उपयुक्त डाटा प्रकार मुख्यतः प्रयुक्त एग्रीगेट फ़ंक्शन पर निर्भर करता है, जैसा कि ऊपर तालिका में देखा।HAVING के उपयोग के मामले
WHEREके विपरीत,HAVINGकोUPDATEऔरDELETEस्टेटमेंट में इस्तेमाल नहीं किया जा सकता;HAVINGकेवल डाटा प्राप्ति के लिए उपयोग होता है। मोटे तौर पर, यह दो परिदृश्यों में बँटता है:समूह-स्तर फ़िल्टरिंग
यह
HAVINGका सामान्य और मानक उपयोग है। उदाहरण के लिए, केवल वे शहर लौटाना जिनका औसत रेंटल मूल्य $2,700 से कम है।एकल-पंक्ति फ़िल्टरिंग
यह कम सामान्य स्थिति है, पर
HAVINGका उपयोग एकल-पंक्ति एग्रीगेशन—जैसे कोई मीट्रिक या KPI—लौटाने के लिए किया जा सकता है, केवल यदि वह किसी शर्त को पूरा करता हो। यहGROUP BYके बिनाHAVINGके उपयोग से प्राप्त किया जा सकता है। निम्न उदाहरण में, हम औसत रेंटल मूल्य केवल तभी लौटाते हैं जब वह $2,800 से कम हो। यदि मान शर्त पूरी करे, तो एकल-पंक्ति परिणाम मिलेगा; अन्यथा, टेबल खाली होगी।WHERE और HAVING का संयोजन
WHEREऔरHAVINGको एक साथ उपयोग कर एग्रीगेशन से पहले और बाद—दोनों स्थितियों में—टेबल को फ़िल्टर किया जा सकता है। निम्न उदाहरण में, हम हर शहर में प्रॉपर्टीज़ की गिनती लौटाते हैं, केवल वे प्रॉपर्टीज़ गिनते हुए जो पालतू-अनुकूल हैं, और केवल उन शहरों को फ़िल्टर करते हुए जहाँ 80 से अधिक प्रॉपर्टीज़ हैं।WHERE और HAVING का बुनियादी संयोजन। छवि: लेखक.
प्रदर्शन (परफ़ॉर्मेंस) में WHERE और HAVING के बीच अंतर
यह क्वेरी अक्षम है क्योंकि
rental_priceकी शर्त किसी एग्रीगेशन पर निर्भर नहीं करती—यह व्यक्तिगत पंक्तियों को फ़िल्टर करती है। यह क्वेरी पहले सभी रेंटल्स को शहर के अनुसार समूहित करेगी, उनकी गिनती करेगी, और फिर परिणाम को फ़िल्टर करेगी—जो गैर-ज़रूरी पंक्तियों को प्रोसेस करने के कारण अक्षम है। इसी कारण, यह क्वेरी तेज़ होगी:WHERE और HAVING के अनुकूलन के सुझाव
उपरोक्त के आधार पर, हम कुछ अच्छी प्रथाएँ देख सकते हैं जो
WHEREऔरHAVINGके उपयोग को अनुकूलित कर सकती हैं। यदि आपके पास बड़े डेटासेट हैं, तो यह विशेष रूप से महत्वपूर्ण है।उच्च चयनात्मक रहें: केवल उन्हीं मानों के अनुसार फ़िल्टर करें जिनकी आपको आवश्यकता है—और उससे ज़्यादा नहीं। इससे व्यू में पंक्तियों की संख्या घटेगी और क्वेरी की दक्षता बढ़ेगी।
सरल रखें: किसी भी अनावश्यक कंडीशन, एग्रीगेशन और टाइप-कास्ट को हटा दें। ये सारे ऐड-ऑन गणनात्मक लागत के साथ आते हैं।
जल्दी फ़िल्टर करें: यदि आप समूह-स्तर एग्रीगेशन कर रहे हैं, तो समूह बनाने की प्रक्रिया तेज़ करने के लिए पहले
WHEREसे पंक्तियों को प्री-फ़िल्टर करें। ऐसा करके, आप समूह में प्रोसेस होने वाली पंक्तियों की संख्या घटाएँगे।तुलनात्मक तालिका
आइए अपनी बातों को एक सुविधाजनक तालिका में समेटें:
निष्कर्ष
इस लेख में, हमने SQL में
WHEREऔरHAVINGके बीच मुख्य अंतर को समझा—किWHEREक्लॉज़ एग्रीगेशन से पहले पंक्तियों को फ़िल्टर करता है, जबकिHAVINGक्लॉज़ एग्रीगेशन के बाद समूहित डाटा को फ़िल्टर करता है। हमने कुछ कम चर्चित अंतरों पर भी चर्चा की, जैसे किWHERESELECT,UPDATE, औरDELETEस्टेटमेंट्स के साथ काम कर सकता है, लेकिनHAVINGकेवलSELECTके साथ काम करता है। हमने प्रदर्शन से जुड़ी बातों पर भी संक्षेप में चर्चा की।DataCamp का SQL Basics Cheat Sheet
WHEREऔरHAVINGक्लॉज़ का अच्छा सार प्रदान करता है और SQL में फ़िल्टरिंग करने के लिए मार्गदर्शन देता है। साथ ही, यदि आप SQL शुरू कर रहे हैं, तो SQL Fundamentals स्किल ट्रैक और Associate Data Analyst in SQL करियर ट्रैक पर नज़र डालें.