Richard C.
—In SQL, what exactly does GROUP BY
do? How does it work when applied to multiple columns instead of just one?
Let’s use an example table of people with names and ages. (All commands in this article work on MySQL, PostgreSQL, and MS SQL Server.)
CREATE TABLE Person ( Id INT PRIMARY KEY, Name VARCHAR(255), Age INT ); INSERT INTO Person (Id, Name, Age) VALUES (1, 'Amir', 25), (2, 'Amir', 25), (3, 'Aya', 2), (4, 'Aya', 30), (5, 'Leila', 8), (6, 'Leila', 35), (7, 'Ndidi', 12), (8, 'Ndidi', 12), (9, 'Ndidi', 25), (10, 'Sofia', 42), (11, 'Mateo', 8), (12, 'Mateo', 67), (13, 'Yara', 35), (14, 'Yara', 35), (15, 'Yara', 4), (16, 'Yara', 35);
First, let’s select Name
from the table:
SELECT Name FROM Person; -- Name -- Amir -- Amir -- Aya -- Aya -- Leila -- Leila -- Ndidi -- Ndidi -- Ndidi -- Sofia -- Mateo -- Mateo -- Yara -- Yara -- Yara -- Yara
Sixteen rows are returned because there are 16 people in the table.
If you want to remove duplicates you can either use DISTINCT
or GROUP BY
:
SELECT DISTINCT Name FROM Person; -- Name -- Amir -- Aya -- Leila -- Mateo -- Ndidi -- Sofia -- Yara
SELECT Name FROM Person GROUP BY Name; -- Name -- Amir -- Aya -- Leila -- Mateo -- Ndidi -- Sofia -- Yara
GROUP BY
merges all identical values in a column into a single row, effectively making it return unique values for a column. Unlike DISTINCT
, GROUP BY
allows you to calculate information related to each group. The functions that do this are called aggregate functions. They are COUNT
, SUM
, AVG
, MIN
, and MAX
. For example:
SELECT Name, COUNT(Name) FROM Person GROUP BY Name; -- Name COUNT(Name) -- Amir 2 -- Aya 2 -- Leila 2 -- Ndidi 3 -- Sofia 1 -- Mateo 2 -- Yara 4
If you use GROUP BY
on two or more columns, it will merge all pairs of values that are the same in both columns into a single row. In our example, if we group by both Name
and Age
, then one row will be returned for every person that has the same name and the same age. Here’s the query:
SELECT Name, Age, COUNT(1) FROM Person GROUP BY Name, Age; -- Name Age COUNT(1) -- Amir 25 2 -- Aya 2 1 -- Aya 30 1 -- Leila 8 1 -- Leila 35 1 -- Mateo 8 1 -- Mateo 67 1 -- Ndidi 12 2 -- Ndidi 25 1 -- Sofia 42 1 -- Yara 4 1 -- Yara 35 3
You can see that there are seven people with the same name, but there are only three people with the same name and age.
Using GROUP BY Name, Age
as opposed to GROUP BY Age, Name
will make no difference to the results returned (except for the column order).
Do not write GROUP BY Name AND Age
instead of GROUP BY Age, Name
. Even if your database server accepts this syntax, you will likely get incorrect results.
Tasty treats for web developers brought to you by Sentry. Get tips and tricks from Wes Bos and Scott Tolinski.
SEE EPISODESConsidered “not bad” by 4 million developers and more than 100,000 organizations worldwide, Sentry provides code-level observability to many of the world’s best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.
Here’s a quick look at how Sentry handles your personal information (PII).
×We collect PII about people browsing our website, users of the Sentry service, prospective customers, and people who otherwise interact with us.
What if my PII is included in data sent to Sentry by a Sentry customer (e.g., someone using Sentry to monitor their app)? In this case you have to contact the Sentry customer (e.g., the maker of the app). We do not control the data that is sent to us through the Sentry service for the purposes of application monitoring.
Am I included?We may disclose your PII to the following type of recipients:
You may have the following rights related to your PII:
If you have any questions or concerns about your privacy at Sentry, please email us at compliance@sentry.io.
If you are a California resident, see our Supplemental notice.