Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 57

GROUP BY और HAVING

Grouped Query कैसे चलती है

Useful logical sequence: FROM → WHERE → GROUP BY → aggregate calculations → HAVING → SELECT → ORDER BY → LIMIT। Optimizer execution बदल सकता है, result semantics यही रहती हैं।

Verified dataset: Aarav (X-A, 86.50, Active), Meera (X-A, 91.00, Active), Kabir (X-B, 74.00, Inactive) और Sana (X-B, 88.50, Active)। Total marks = 340.00 और overall average = 85.00।

GROUP BY: हर Class का Summary

SELECT class_name,
       COUNT(*) AS students,
       SUM(marks) AS total_marks,
       ROUND(AVG(marks), 2) AS average_marks
FROM students
GROUP BY class_name
ORDER BY class_name;
X-A | 2 | 177.50 | 88.75 X-B | 2 | 162.50 | 81.25

Same class_name वाली rows one group बनती हैं। Grouping automatic sort नहीं करता; ORDER BY explicit है।

HAVING Completed Groups Filter करता है

SELECT class_name,
       ROUND(AVG(marks), 2) AS average_marks
FROM students
GROUP BY class_name
HAVING AVG(marks) >= 85
ORDER BY class_name;
X-A | 88.75

HAVING group aggregates बनने के बाद चलता है। Portable clarity के लिए aggregate repeat करें; MySQL कई select aliases भी HAVING में allow करता है।

WHERE और HAVING Together

SELECT class_name,
       COUNT(*) AS active_students,
       ROUND(AVG(marks), 2) AS active_average
FROM students
WHERE status = 'Active'
GROUP BY class_name
HAVING COUNT(*) >= 2
ORDER BY class_name;
X-A | 2 | 88.75

WHERE पहले inactive Kabir हटाता है। X-B में केवल Sana बचती है, इसलिए HAVING one-student group हटा देता है।

Multiple Columns और ROLLUP

SELECT class_name, status, COUNT(*) AS students
FROM students
GROUP BY class_name, status
ORDER BY class_name, status;

SELECT class_name, COUNT(*) AS students
FROM students
GROUP BY class_name WITH ROLLUP;

पहली query हर class/status combination का group बनाती है। WITH ROLLUP overall summary row जोड़ता है। Real NULL और rollup NULL अलग करने के लिए GROUPING() लें।

ONLY_FULL_GROUP_BY और Correct Results

-- Ambiguous और normally rejected
SELECT class_name, full_name, AVG(marks)
FROM students
GROUP BY class_name;

Class को कौन-सा full_name represent करे? Correct single answer नहीं। full_name group करें, intentionally aggregate करें या हटाएँ। Ambiguous query चलाने के लिए strict mode disable न करें।

हर selected expression aggregate, grouping expression या group key पर functionally dependent होना चाहिए।

अभ्यास

  1. हर status का count निकालें।
  2. Average कम से कम 82 वाली classes दिखाएँ।
  3. Active averages निकालकर 2+ active students वाले groups रखें।
  4. Class/status groups बनाएँ।
  5. ROLLUP total जोड़कर GROUPING() से label करें।

त्वरित सारांश

  • GROUP BY हर grouping combination का result देता है।
  • WHERE rows पहले और HAVING groups बाद में filter करता है।
  • ORDER BY grouping से अलग है।
  • ONLY_FULL_GROUP_BY ambiguous results रोकता है।
  • WITH ROLLUP higher-level summary जोड़ता है।

Official संदर्भ

References 14 August 2026 को review किए गए।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

GROUP BY क्या करता है?
यह filtered rows को same grouping values वाले groups में बाँटता और aggregate functions हर group का summary देते हैं।
WHERE और HAVING में क्या अंतर है?
WHERE grouping से पहले rows filter करता है। HAVING aggregates calculate होने के बाद grouped results filter करता है।
क्या HAVING GROUP BY बिना उपयोग हो सकता है?
हाँ। पूरा filtered input one group हो सकता है, पर HAVING तभी लें जब post-aggregation condition real intent हो।
ONLY_FULL_GROUP_BY query reject क्यों करता है?
Selected nonaggregate column GROUP BY में नहीं और grouped columns पर functionally dependent नहीं, इसलिए उसकी value ambiguous है।
WITH ROLLUP क्या करता है?
यह grouped result में super-aggregate summary rows जोड़ता है, जैसे class totals के बाद overall total।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.