GROUP BY और HAVING
Grouped Query कैसे चलती है
Useful logical sequence: FROM → WHERE → GROUP BY → aggregate calculations → HAVING → SELECT → ORDER BY → LIMIT। Optimizer execution बदल सकता है, result semantics यही रहती हैं।
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;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;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;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 न करें।
अभ्यास
- हर status का count निकालें।
- Average कम से कम 82 वाली classes दिखाएँ।
- Active averages निकालकर 2+ active students वाले groups रखें।
- Class/status groups बनाएँ।
- 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 किए गए।