MySQL GROUP BY और HAVING क्लॉज़ उदाहरण सहित
⚡ स्मार्ट सारांश
SQL में GROUP BY और HAVING क्लॉज़ विस्तृत पंक्तियों को सारांश रिपोर्ट में बदल देते हैं। GROUP BY समान मानों वाली पंक्तियों को एक समूह में एक पंक्ति में समेकित करता है, जबकि HAVING COUNT जैसे एग्रीगेट फ़ंक्शन लागू होने के बाद उन समूहों को फ़िल्टर करता है।

SQL में GROUP BY क्लॉज़ क्या है?
GROUP BY क्लॉज एक SQL कमांड है जिसका उपयोग निम्न के लिए किया जाता है समान मान वाली पंक्तियों को समूहीकृत करेंइसे SELECT स्टेटमेंट के अंदर लिखा जाता है, और आमतौर पर इसका उपयोग डेटाबेस से सारांश रिपोर्ट तैयार करने के लिए एग्रीगेट फ़ंक्शंस के साथ किया जाता है।
यह वही करता है: डेटा का सारांश प्रस्तुत करता है डेटाबेस में संग्रहीत। GROUP BY क्लॉज़ वाले प्रश्नों को समूहीकृत प्रश्न कहा जाता है, और वे प्रत्येक समूहीकृत आइटम के लिए एक ही पंक्ति लौटाते हैं।
SQL ग्रुप बाय सिंटैक्स
अब जबकि इस वाक्य का उद्देश्य स्पष्ट हो गया है, तो एक बुनियादी समूहीकृत क्वेरी के सिंटैक्स को देखें।
SELECT statements... GROUP BY column_name1[, column_name2, ...] [HAVING condition];
यहाँ
- "SELECT कथन…"मानक है एसक्यूएल चयन कमांड क्वेरी।
- "समूह द्वारा कॉलम_नाम1"यह वह खंड है जो समूह को निष्पादित करता है।ping कॉलम_नाम1 के आधार पर।
- "[, कॉलम_नाम2, …]" वैकल्पिक है और समूह में अन्य कॉलम नामों को दर्शाता है।ping यह प्रक्रिया एक से अधिक कॉलम पर की जाती है।
- "[स्थिति होना]" वैकल्पिक है और इसका उपयोग GROUP BY क्लॉज़ से प्रभावित पंक्तियों को सीमित करने के लिए किया जाता है। यह इसके समान है। कहां कारणसिवाय इसके कि इसे समूह के बाद लागू किया जाता है।ping.
Grouping एकल स्तंभ का उपयोग करना
SQL GROUP BY क्लॉज़ के प्रभाव को देखने का सबसे तेज़ तरीका है एक अनग्रुप्ड क्वेरी की तुलना एक ग्रुप्ड क्वेरी से करना। एक सरल क्वेरी से शुरुआत करें जो मेंबर्स टेबल में मौजूद सभी जेंडर एंट्रीज़ को लौटाती है।
SELECT `gender` FROM `members`;
| लिंग |
|---|
| महिला |
| महिला |
| नर |
| महिला |
| नर |
| नर |
| नर |
| नर |
| नर |
नौ पंक्तियाँ प्राप्त होती हैं, और प्रत्येक मान दोहराया जाता है। मान लीजिए कि हमें लिंग के लिए अद्वितीय मान चाहिए। नीचे दी गई क्वेरी में GROUP BY क्लॉज़ जोड़ा गया है।
SELECT `gender` FROM `members` GROUP BY `gender`;
उपरोक्त स्क्रिप्ट को निष्पादित करना MySQL कार्यक्षेत्र myflixdb के विरुद्ध हमें निम्नलिखित परिणाम प्राप्त होते हैं।
| लिंग |
|---|
| महिला |
| नर |
ध्यान दें कि केवल दो पंक्तियाँ ही प्राप्त हुई हैं, क्योंकि तालिका में केवल दो लिंग प्रकार हैं। GROUP BY क्लॉज़ ने सभी "पुरुष" सदस्यों को एक साथ समूहित किया और उनके लिए एक ही पंक्ति लौटाई, और "महिला" सदस्यों के साथ भी ऐसा ही किया।
Grouping एकाधिक कॉलम का उपयोग करना
Grouping किसी रिपोर्ट के लिए एक ही कॉलम का उपयोग करना अक्सर बहुत ही सामान्य होता है। 'ग्रुप बाय' कॉमा से अलग किए गए कॉलम की सूची स्वीकार करता है, और उनके मानों का संयोजन प्रत्येक समूह को परिभाषित करता है।
मान लीजिए कि हमें मूवी कैटेगरी_आईडी वैल्यू की एक सूची और उन फिल्मों के रिलीज होने के संबंधित वर्ष चाहिए। सबसे पहले इस सरल क्वेरी के आउटपुट को देखें।
SELECT `category_id`, `year_released` FROM `movies`;
| श्रेणी_आईडी | वर्ष_रिलीज़ |
|---|---|
| 1 | 2011 |
| 2 | 2008 |
| नल | 2008 |
| नल | 2010 |
| 8 | 2007 |
| 6 | 2007 |
| 6 | 2007 |
| 8 | 2005 |
| नल | 2012 |
| 7 | 1920 |
| 8 | नल |
| 8 | 1920 |
हाइलाइट की गई पंक्तियाँ दर्शाती हैं कि परिणाम में डुप्लिकेट हैं। GROUP BY का उपयोग करके उसी क्वेरी को चलाने से वे हट जाते हैं।
SELECT `category_id`, `year_released` FROM `movies` GROUP BY `category_id`, `year_released`;
उपरोक्त स्क्रिप्ट को निष्पादित करना MySQL myflixdb के विरुद्ध वर्कबेंच चलाने पर हमें नीचे दिखाए गए परिणाम प्राप्त होते हैं।
| श्रेणी_आईडी | वर्ष_रिलीज़ |
|---|---|
| नल | 2008 |
| नल | 2010 |
| नल | 2012 |
| 1 | 2011 |
| 2 | 2008 |
| 6 | 2007 |
| 7 | 1920 |
| 8 | 1920 |
| 8 | 2005 |
| 8 | 2007 |
GROUP BY क्लॉज़ category_id और year_released दोनों पर काम करता है ताकि पहचान की जा सके अद्वितीय पंक्तियाँ। श्रेणी 6 के लिए 2007 में मौजूद दो दोहराई गई पंक्तियों को एक में मिला दिया गया।
अंगूठे का नियम: यदि श्रेणी आईडी समान है लेकिन प्रकाशन वर्ष भिन्न है, तो पंक्ति को अद्वितीय माना जाता है। यदि श्रेणी आईडी और प्रकाशन वर्ष एक से अधिक पंक्तियों में समान हैं, तो पंक्तियाँ डुप्लिकेट मानी जाती हैं और उनमें से केवल एक ही प्रदर्शित की जाती है।
Grouping और एग्रीगेट फ़ंक्शन
डुप्लिकेट हटाना उपयोगी है, लेकिन समूह की असली शक्ति...ping यह तब प्रकट होता है जब इसे इसके साथ जोड़ा जाता है समग्र कार्यएक एग्रीगेट फ़ंक्शन प्रत्येक समूह के लिए एक मान की गणना करता है: COUNT पंक्तियों की गणना करता है, SUM मानों को जोड़ता है, और AVG, MIN और MAX स्प्रेड का वर्णन करते हैं।
मान लीजिए कि हमें डेटाबेस में मौजूद पुरुष और महिला सदस्यों की कुल संख्या चाहिए। नीचे दिया गया स्क्रिप्ट यही काम करता है।
SELECT `gender`, COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
उपरोक्त स्क्रिप्ट को निष्पादित करना MySQL myflixdb के विरुद्ध वर्कबेंच चलाने पर हमें निम्नलिखित परिणाम प्राप्त होते हैं।
| लिंग | COUNT(`सदस्यता_संख्या`) |
|---|---|
| महिला | 3 |
| नर | 6 |
पंक्तियों को प्रत्येक अद्वितीय लिंग मान के आधार पर समूहीकृत किया जाता है, और प्रत्येक समूह के भीतर पंक्तियों की संख्या की गणना COUNT एग्रीगेट फ़ंक्शन द्वारा की जाती है। नौ सदस्य रिकॉर्ड दो सारांश पंक्तियों में समेकित हो जाते हैं।
HAVING क्लॉज़ का उपयोग करके क्वेरी परिणामों को सीमित करना
Groupingतालिका की प्रत्येक पंक्ति के लिए हमेशा 'हैविंग' क्लॉज़ की आवश्यकता नहीं होती है। कभी-कभी रिपोर्ट को किसी विशिष्ट मानदंड तक सीमित रखना आवश्यक होता है, और यही कार्य 'हैविंग' क्लॉज़ द्वारा किया जाता है।
मान लीजिए कि हम फिल्म श्रेणी आईडी 8 के लिए सभी रिलीज वर्ष जानना चाहते हैं। नीचे दी गई स्क्रिप्ट यह परिणाम प्राप्त करती है।
SELECT * FROM `movies` GROUP BY `category_id`, `year_released` HAVING `category_id` = 8;
उपरोक्त स्क्रिप्ट को निष्पादित करना MySQL myflixdb के विरुद्ध वर्कबेंच चलाने पर हमें नीचे दिखाए गए परिणाम प्राप्त होते हैं।
| मूवी_आईडी | शीर्षक | निदेशक | वर्ष_रिलीज़ | श्रेणी_आईडी |
|---|---|---|---|---|
| 9 | Honey moonनेताओं | जॉन शुल्त्ज़ | 2005 | 8 |
| 5 | डैडीज लिटिल गर्ल्स | नल | 2007 | 8 |
HAVING शर्त के तहत केवल श्रेणी आईडी 8 वाली फिल्मों को ही रखा गया है।
चेतावनी: MySQL 5.7 और उसके बाद के संस्करणों में ONLY_FULL_GROUP_BY मोड डिफ़ॉल्ट रूप से सक्षम होता है, और इस मोड के तहत GROUP BY क्लॉज़ के साथ SELECT * को अस्वीकार कर दिया जाता है, क्योंकि movie_id, title और director न तो समूहीकृत हैं और न ही एकत्रित। उत्पादन में, समूहीकृत कॉलमों को स्पष्ट रूप से नाम दें, उदाहरण के लिए SELECT category_id, year_released FROM movies GROUP BY category_id, year_released HAVING category_id = 8;
WHERE vs Having vs GROUP BY vs ORDER BY
शुरुआती लोग अक्सर इन चारों वाक्यों को आपस में मिला देते हैं, क्योंकि ये सभी परिणाम सेट को आकार देते हैं। अंतर इसमें निहित है: कब MySQL इन नियमों का प्रयोग इस प्रकार किया जाता है: WHERE नियम पंक्तियों के समूहीकरण से पहले चलता है, HAVING नियम बाद में चलता है, और ORDER BY नियम सबसे अंत में चलता है।
| धारा | यह क्या करता है | जब यह चलता है | एग्रीगेट फ़ंक्शन स्वीकार करता है |
|---|---|---|---|
| कहां | किसी भी समूह से पहले व्यक्तिगत पंक्तियों को फ़िल्टर करता हैping. | ग्रुप बाय से पहले | नहीं |
| समूह द्वारा | समान मान साझा करने वाली पंक्तियों को प्रति समूह एक पंक्ति में समेकित करता है। | कहाँ के बाद | लागू नहीं होता |
| होने | GROUP BY द्वारा निर्मित समूहों को फ़िल्टर करता है। | ग्रुप बाय के बाद | हां, उदाहरण के लिए HAVING COUNT(*) > 2 |
| द्वारा आदेश | यह पिछली शर्तों के बाद बची हुई पंक्तियों को क्रमबद्ध करता है। | पिछली बार | हां, एग्रीगेट एलियास को सॉर्ट किया जा सकता है। |
इसका व्यावहारिक परिणाम प्रदर्शन पर पड़ता है। WHERE का उपयोग करके फ़िल्टर करने से समूह से पहले की पंक्तियाँ हट जाती हैं।ping कार्य शुरू होता है, इसलिए एक ऐसी स्थिति जो समग्र परिणाम पर निर्भर नहीं करती है, वह HAVING के बजाय WHERE में होनी चाहिए।
