Step 7
5 min read

GROUP BY

Learn how to group data and calculate aggregates for each group.

What is GROUP BY?

Sample Students Table
IDNameGrade
1JohnA
2MaryB
3PeterA
4SarahB
5TomA
5 rows
Original Employees Table
NameDepartmentSalary
AliceSales60000
BobIT80000
CarolSales70000
DaveIT90000
4 rows
WHERE vs HAVING
AspectWHEREHAVING
FiltersIndividual rowsGroups
Used withAny queryGROUP BY queries
TimingBefore groupingAfter grouping
Can use aggregatesNoYes
ExampleWHERE age > 18HAVING COUNT(*) > 5
5 rows

GROUP BY groups rows that have the same values into summary rows. It's like sorting items into categories and counting each category.

Real-life example: Imagine you have a list of students. GROUP BY helps you count how many students are in each grade (A, B, C).

Simple Example

Sample Students Table
IDNameGrade
1JohnA
2MaryB
3PeterA
4SarahB
5TomA
5 rows
Original Employees Table
NameDepartmentSalary
AliceSales60000
BobIT80000
CarolSales70000
DaveIT90000
4 rows
WHERE vs HAVING
AspectWHEREHAVING
FiltersIndividual rowsGroups
Used withAny queryGROUP BY queries
TimingBefore groupingAfter grouping
Can use aggregatesNoYes
ExampleWHERE age > 18HAVING COUNT(*) > 5
5 rows

Without GROUP BY (shows all students):

SELECT grade FROM students; -- Result: A, B, A, B, A

With GROUP BY (counts each grade):

SELECT grade, COUNT(*) AS total FROM students GROUP BY grade; -- Result: -- A: 3 students -- B: 2 students

Basic Syntax

Sample Students Table
IDNameGrade
1JohnA
2MaryB
3PeterA
4SarahB
5TomA
5 rows
Original Employees Table
NameDepartmentSalary
AliceSales60000
BobIT80000
CarolSales70000
DaveIT90000
4 rows
WHERE vs HAVING
AspectWHEREHAVING
FiltersIndividual rowsGroups
Used withAny queryGROUP BY queries
TimingBefore groupingAfter grouping
Can use aggregatesNoYes
ExampleWHERE age > 18HAVING COUNT(*) > 5
5 rows
SELECT column, COUNT(*) FROM table GROUP BY column;

Easy Examples

Sample Students Table
IDNameGrade
1JohnA
2MaryB
3PeterA
4SarahB
5TomA
5 rows
Original Employees Table
NameDepartmentSalary
AliceSales60000
BobIT80000
CarolSales70000
DaveIT90000
4 rows
WHERE vs HAVING
AspectWHEREHAVING
FiltersIndividual rowsGroups
Used withAny queryGROUP BY queries
TimingBefore groupingAfter grouping
Can use aggregatesNoYes
ExampleWHERE age > 18HAVING COUNT(*) > 5
5 rows

Count by Category

SELECT grade, COUNT(*) AS student_count FROM students GROUP BY grade;

Sum by Group

SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department;

Average by Group

SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;

Important Rule

Sample Students Table
IDNameGrade
1JohnA
2MaryB
3PeterA
4SarahB
5TomA
5 rows
Original Employees Table
NameDepartmentSalary
AliceSales60000
BobIT80000
CarolSales70000
DaveIT90000
4 rows
WHERE vs HAVING
AspectWHEREHAVING
FiltersIndividual rowsGroups
Used withAny queryGROUP BY queries
TimingBefore groupingAfter grouping
Can use aggregatesNoYes
ExampleWHERE age > 18HAVING COUNT(*) > 5
5 rows

Every column in SELECT must be either:

  1. In the GROUP BY clause, OR
  2. Inside an aggregate function (COUNT, SUM, AVG, etc.)

Wrong ❌:

SELECT name, department, COUNT(*) FROM employees GROUP BY department; -- Error! name is not grouped

Correct ✅:

SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;

Summary

Sample Students Table
IDNameGrade
1JohnA
2MaryB
3PeterA
4SarahB
5TomA
5 rows
Original Employees Table
NameDepartmentSalary
AliceSales60000
BobIT80000
CarolSales70000
DaveIT90000
4 rows
WHERE vs HAVING
AspectWHEREHAVING
FiltersIndividual rowsGroups
Used withAny queryGROUP BY queries
TimingBefore groupingAfter grouping
Can use aggregatesNoYes
ExampleWHERE age > 18HAVING COUNT(*) > 5
5 rows
  • GROUP BY organizes data into groups
  • Use with COUNT(), SUM(), AVG() to calculate for each group
  • Every SELECT column must be grouped or aggregated
  • Perfect for reports and summaries
SQL Editor
Loading...

Count students in each grade

Output

Click "Run Query" to see results

SQL Editor
Loading...

Average age per grade, sorted

Output

Click "Run Query" to see results

SQL Editor
Loading...

Grades with 2 or more students

Output

Click "Run Query" to see results

SQL Editor
Loading...

Complete GROUP BY with all clauses

Output

Click "Run Query" to see results

Finished this topic?

Mark it complete to track your progress and maintain your streak!

SkillsetMaster - AI, Web Development & Data Analytics Courses