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

SQL में WHERE और HAVING के बीच अंतर

जानें कि SQL क्वेरियों में WHERE पंक्ति-स्तर के डाटा को फ़िल्टर करता है, जबकि HAVING एग्रीगेशन के बाद समूहित डाटा को फ़िल्टर करता है—और इनके अलग-अलग उपयोगों में महारत पाएं।
· 8 मि॰ पढ़ें

AI के साथ खोजें

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 पंक्तियाँ लौटती हैं।

SQL WHERE के साथ साधारण पंक्ति फ़िल्टरिंग

WHERE के साथ साधारण पंक्ति फ़िल्टरिंग। छवि: लेखक.

अब मान लें कि हम प्रॉपर्टीज़ की टेबल नहीं, बल्कि उन शहरों की टेबल चाहते हैं जिनका औसत रेंटल मूल्य $2,700 से कम है। यहाँ हर पंक्ति किसी प्रॉपर्टी के बजाय एक शहर के औसत किराए का प्रतिनिधित्व करेगी—यानी हम पंक्तियों को समूहबद्ध करके रेंटल मूल्य का औसत निकालेंगे। अतः, हम HAVING का उपयोग करेंगे, जैसे कि इस क्वेरी में:

SELECT city, AVG(rental_price) AS average_rent
FROM rentals
GROUP BY city
HAVING AVG(rental_price) < 2700;

और परिणाम इस तरह होगा। ध्यान दें कि केवल एक परिणाम है. 

SQL 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 column1, column2… etc.
FROM table_name
WHERE condition;

SELECT के साथ WHERE का उपयोग वह जगह है जहाँ WHERE क्लॉज़ अक्सर HAVING से गड़बड़ा दिया जाता है. 

UPDATE स्टेटमेंट में WHERE

इसके अलावा, WHERE UPDATE स्टेटमेंट में भी अहम भूमिका निभाता है ताकि यह निर्धारित किया जा सके कि किस पंक्ति में डाटा अपडेट होना चाहिए, जैसा कि यह सिंटैक्स दर्शाता है:

UPDATE table_name
SET column_name1 = value1, column_name2 = value2… etc.
WHERE condition;

DELETE स्टेटमेंट में WHERE

WHERE DELETE स्टेटमेंट के लिए भी उपयोगी है ताकि यह तय किया जा सके कि किन रिकॉर्ड्स (पंक्तियों) को हटाया जाना चाहिए, जैसा कि यहाँ देखें:

DELETE FROM table_name
WHERE condition;

WHERE कंडीशन कैसे लिखें

WHERE कंडीशन एक सरल लॉजिकल अभिव्यक्ति की तरह लिखी जाती है। इसमें तीन भाग होते हैं: वेरिएबल/ऑपरेंड, कंडीशन, और वैल्यू/परिणाम। आइए WHERE कंडीशनों के विकल्प देखें जिनमें तुलना (comparison) और लॉजिकल ऑपरेटर दोनों शामिल हैं.  

ऑपरेटर चिन्हविवरणऑपरेंड डाटा प्रकार
=बराबर (तारीख पर)सांख्यिक, टेक्स्ट, तारीख/टाइमस्टैम्प, बूलियन
<से कम (तारीख से पहले)सांख्यिक, तारीख/टाइमस्टैम्प
>से अधिक (तारीख के बाद)सांख्यिक, तारीख/टाइमस्टैम्प
<=से कम या बराबर (तारीख पर या पहले)सांख्यिक, तारीख/टाइमस्टैम्प
>=से अधिक या बराबर (तारीख पर या बाद में)सांख्यिक, तारीख/टाइमस्टैम्प
<> (!=)बराबर नहीं (तारीख पर नहीं)सांख्यिक, टेक्स्ट, तारीख/टाइमस्टैम्प, बूलियन
INएकाधिक मानों के बराबर (कई तिथियों पर)सांख्यिक, टेक्स्ट, तारीख/टाइमस्टैम्प, बूलियन (हालाँकि तर्कहीन!)
LIKEटेक्स्ट पैटर्न से मेल (वाइल्डकार्ड का उपयोग)टेक्स्ट
BETWEENकिसी रेंज में मौजूदसांख्यिक, तारीख/टाइमस्टैम्प
ANDकई कंडीशनों को मिलाता है, सभी सच होने चाहिएलॉजिकल (बूलियन)
ORकई कंडीशनों को मिलाता है, कम से कम एक सच होना चाहिएलॉजिकल (बूलियन)
NOTकिसी कंडीशन का निषेधलॉजिकल (बूलियन)
IS NULLnull मानों की जाँचसभी डाटा प्रकार
IS NOT NULLगैर-null मानों की जाँचसभी डाटा प्रकार

यहाँ NOT को IN तुलना ऑपरेटर के साथ उपयोग करने का एक उदाहरण है:

SELECT *
FROM rentals
WHERE city NOT IN ('Cairo', 'Giza');

यह स्टेटमेंट उन सभी प्रॉपर्टीज़ को लौटाएगा जो न तो Cairo और न ही Giza शहर में हैं।

WHERE के साथ NOT का उपयोग

Cairo और Giza के बाहर की प्रॉपर्टीज़। छवि: लेखक।

WHERE के उपयोग के मामले

यह जानते हुए कि WHERE SELECT, UPDATE और DELETE स्टेटमेंट्स के साथ काम करता है, हम तीन उपयोग-परिदृश्य देख सकते हैं: पंक्ति-स्तर फ़िल्टरिंग, डाटा प्राप्ति, और डाटा हेरफेर।

पंक्ति-स्तर फ़िल्टरिंग

हम अपनी टेबल की पंक्तियों को एक या अधिक शर्तों के आधार पर फ़िल्टर कर सकते हैं। निम्नलिखित क्वेरी केवल विला प्रॉपर्टीज़ को शामिल करने के लिए पंक्तियों को फ़िल्टर करती है।

SELECT *
FROM rentals
WHERE type = ‘villa’;

WHERE के साथ NOT का उपयोग

विला प्रॉपर्टीज़ का चयन। छवि: लेखक.

डाटा प्राप्ति

WHERE का उपयोग उस विशेष डाटा बिंदु को प्राप्त करने के लिए किया जा सकता है जिसकी हमें तलाश है। यह पंक्ति-स्तर फ़िल्टरिंग जैसा है लेकिन अधिक विशिष्ट। मान लें हमें उस प्रॉपर्टी का ID जानना है जो 1 जनवरी 2022 को Cairo में उपलब्ध थी, तो हम यह क्वेरी लिख सकते हैं:

SELECT property_id
FROM rentals
WHERE available_date = '2022-01-01'
AND city = 'Cairo';

WHERE के साथ पंक्ति-स्तर फ़िल्टरिंग

एक डाटा बिंदु प्राप्त करना। छवि: लेखक.

डाटा हेरफेर

अंत में, WHERE आपके डेटाबेस में मानों को संशोधित करने और विशिष्ट रिकॉर्ड हटाने के लिए बहुत मददगार है। उदाहरण के लिए, यदि हमें पता चलता है कि प्रॉपर्टी 171 असल में पालतू-अनुकूल नहीं है, तो हम UPDATE स्टेटमेंट में WHERE का उपयोग कर pet_friendly कॉलम को इस प्रकार संशोधित कर सकते हैं:

UPDATE rentals
SET pet_friendly = false
WHERE property_id = 171;

SQL में HAVING क्लॉज़ का उपयोग कैसे करें

अब, बारी है HAVING क्लॉज़ को इसी स्तर की बारीकी से समझने की. 

HAVING का सिंटैक्स और स्टेटमेंट

सबसे पहले, ध्यान दें कि HAVING क्लॉज़ केवल SELECT स्टेटमेंट में उपयोग किया जा सकता है। इसलिए, इसका एकमात्र सिंटैक्स निम्न प्रकार है:

SELECT grouped_column, aggregate_function(aggregated_column)… etc.
FROM table_name
GROUP BY 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
GROUP BY city
HAVING COUNT(*) <= 150;

HAVING के साथ MAX() का उपयोग

HAVING के साथ COUNT() का उपयोग। छवि: लेखक.

तुलना और लॉजिकल ऑपरेटर

HAVING वे सभी तुलना और लॉजिकल ऑपरेटर स्वीकार करता है जो WHERE स्वीकार करता है। एकमात्र अंतर यह है कि HAVING के साथ उपयुक्त डाटा प्रकार मुख्यतः प्रयुक्त एग्रीगेट फ़ंक्शन पर निर्भर करता है, जैसा कि ऊपर तालिका में देखा।

HAVING के उपयोग के मामले

WHERE के विपरीत, HAVING को UPDATE और DELETE स्टेटमेंट में इस्तेमाल नहीं किया जा सकता; HAVING केवल डाटा प्राप्ति के लिए उपयोग होता है। मोटे तौर पर, यह दो परिदृश्यों में बँटता है:

समूह-स्तर फ़िल्टरिंग

यह HAVING का सामान्य और मानक उपयोग है। उदाहरण के लिए, केवल वे शहर लौटाना जिनका औसत रेंटल मूल्य $2,700 से कम है।

SELECT city, AVG(rental_price) AS avg_price
FROM rentals
GROUP BY city
HAVING AVG(rental_price) < 2700;

एकल-पंक्ति फ़िल्टरिंग

यह कम सामान्य स्थिति है, पर HAVING का उपयोग एकल-पंक्ति एग्रीगेशन—जैसे कोई मीट्रिक या KPI—लौटाने के लिए किया जा सकता है, केवल यदि वह किसी शर्त को पूरा करता हो। यह GROUP BY के बिना HAVING के उपयोग से प्राप्त किया जा सकता है। निम्न उदाहरण में, हम औसत रेंटल मूल्य केवल तभी लौटाते हैं जब वह $2,800 से कम हो। यदि मान शर्त पूरी करे, तो एकल-पंक्ति परिणाम मिलेगा; अन्यथा, टेबल खाली होगी।

SELECT AVG(rental_price) as avg_price
FROM rentals
HAVING AVG(rental_price) > 2800;

WHERE और HAVING का संयोजन

WHERE और HAVING को एक साथ उपयोग कर एग्रीगेशन से पहले और बाद—दोनों स्थितियों में—टेबल को फ़िल्टर किया जा सकता है। निम्न उदाहरण में, हम हर शहर में प्रॉपर्टीज़ की गिनती लौटाते हैं, केवल वे प्रॉपर्टीज़ गिनते हुए जो पालतू-अनुकूल हैं, और केवल उन शहरों को फ़िल्टर करते हुए जहाँ 80 से अधिक प्रॉपर्टीज़ हैं।

SELECT city, COUNT(*) AS number_properties
FROM rentals
WHERE pet_friendly = true
GROUP BY city
HAVING COUNT(*) > 80;

WHERE और HAVING का संयोजन

WHERE और HAVING का बुनियादी संयोजन। छवि: लेखक.

प्रदर्शन (परफ़ॉर्मेंस) में WHERE और HAVING के बीच अंतर

हम जानते हैं कि WHERE क्लॉज़ ग्रुपिंग या एग्रीगेशन से पहले लागू होता है। इसी कारण, क्योंकि यह क्वेरी की शुरुआत में ही प्रोसेस होने वाली पंक्तियों की संख्या घटा देता है, व्यक्तिगत पंक्तियों को फ़िल्टर करने के लिए WHERE अधिक कुशल होता है. 

दूसरी ओर, HAVING क्लॉज़ एग्रीगेशन के बाद लागू होता है और समूहित डाटा के आधार पर रिज़ल्ट सेट को फ़िल्टर करता है। इस वजह से, क्योंकि यह सभी पंक्तियों के समूहित हो जाने के बाद डाटा प्रोसेस करता है, यह आम तौर पर WHERE से कम कुशल होता है—हालाँकि एग्रीगेट फ़ंक्शंस से जुड़ी शर्तों के लिए यह आवश्यक है।

आइए इस क्वेरी को देखें:

SELECT city, COUNT(*)
FROM rentals
GROUP BY city
HAVING rental_price < 2700;

यह क्वेरी अक्षम है क्योंकि rental_price की शर्त किसी एग्रीगेशन पर निर्भर नहीं करती—यह व्यक्तिगत पंक्तियों को फ़िल्टर करती है। यह क्वेरी पहले सभी रेंटल्स को शहर के अनुसार समूहित करेगी, उनकी गिनती करेगी, और फिर परिणाम को फ़िल्टर करेगी—जो गैर-ज़रूरी पंक्तियों को प्रोसेस करने के कारण अक्षम है। इसी कारण, यह क्वेरी तेज़ होगी:

SELECT city, COUNT(*)
FROM rentals
WHERE rental_price < 2700
GROUP BY city;

WHERE और HAVING के अनुकूलन के सुझाव

उपरोक्त के आधार पर, हम कुछ अच्छी प्रथाएँ देख सकते हैं जो WHERE और HAVING के उपयोग को अनुकूलित कर सकती हैं। यदि आपके पास बड़े डेटासेट हैं, तो यह विशेष रूप से महत्वपूर्ण है।

  1. उच्च चयनात्मक रहें: केवल उन्हीं मानों के अनुसार फ़िल्टर करें जिनकी आपको आवश्यकता है—और उससे ज़्यादा नहीं। इससे व्यू में पंक्तियों की संख्या घटेगी और क्वेरी की दक्षता बढ़ेगी।

  2. सरल रखें: किसी भी अनावश्यक कंडीशन, एग्रीगेशन और टाइप-कास्ट को हटा दें। ये सारे ऐड-ऑन गणनात्मक लागत के साथ आते हैं।

  3. जल्दी फ़िल्टर करें: यदि आप समूह-स्तर एग्रीगेशन कर रहे हैं, तो समूह बनाने की प्रक्रिया तेज़ करने के लिए पहले WHERE से पंक्तियों को प्री-फ़िल्टर करें। ऐसा करके, आप समूह में प्रोसेस होने वाली पंक्तियों की संख्या घटाएँगे।

तुलनात्मक तालिका

आइए अपनी बातों को एक सुविधाजनक तालिका में समेटें:

तुलनाWHEREHAVING
मुख्य उद्देश्यपंक्ति-स्तर फ़िल्टरिंगसमूह-स्तर फ़िल्टरिंग
बुनियादी सिंटैक्स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 क्लॉज़ एग्रीगेशन के बाद समूहित डाटा को फ़िल्टर करता है। हमने कुछ कम चर्चित अंतरों पर भी चर्चा की, जैसे कि WHERE SELECT, UPDATE, और DELETE स्टेटमेंट्स के साथ काम कर सकता है, लेकिन HAVING केवल SELECT के साथ काम करता है। हमने प्रदर्शन से जुड़ी बातों पर भी संक्षेप में चर्चा की।

DataCamp का SQL Basics Cheat Sheet WHERE और HAVING क्लॉज़ का अच्छा सार प्रदान करता है और SQL में फ़िल्टरिंग करने के लिए मार्गदर्शन देता है। साथ ही, यदि आप SQL शुरू कर रहे हैं, तो SQL Fundamentals स्किल ट्रैक और Associate Data Analyst in SQL करियर ट्रैक पर नज़र डालें. 

Islam Salahuddin

लेखक

Islam Salahuddin

इस्लाम 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 के साथ ग्रुपिंग के बाद उपयोग होता है। इसका एक अपवाद है—एक-मूल्य वाले व्यू की फ़िल्टरिंग (जैसे किसी एक मीट्रिक की गणना)।

विषय