GROUP BY
Last updated
Last updated
The GROUP BY
clause groups a set of rows into a set of summary rows by values of columns or expressions. The GROUP BY
clause returns one row for each group. In other words, it reduces the number of rows in the result set.
You often use the GROUP BY
clause with aggregate functions such as SUM
, AVG
, MAX
, MIN
, and COUNT
. The aggregate function that appears in the SELECT
clause provides information about each group.
The GROUP BY
clause is an optional clause of the SELECT
statement. The following illustrates the GROUP BY
clause syntax:
The GROUP BY
clause must appear after the FROM
and WHERE
clauses. Following the GROUP BY
keywords is a list of comma-separated columns or expressions that you want to use as criteria to group rows.
MySQL evaluates the GROUP BY
clause after the FROM
, WHERE
and SELECT
clauses and before the HAVING
, ORDER BY
and LIMIT
clauses:
GROUP BY
examplesLet’s take some example of using the GROUP BY
clause.
GROUP BY
exampleLet’s take a look at the orders
table in the sample database.
Suppose you want to group values of the order’s status into subgroups, you use the GROUP BY
clause with the status
column as the following query:
As you can see, the GROUP BY
clause returns unique occurrences of status
values. It works like the DISTINCT
operator as shown in the following query:
GROUP BY
with aggregate functionsThe aggregate functions allow you to perform the calculation of a set of rows and return a single value. The GROUP BY
clause is often used with an aggregate function to perform calculation and return a single value for each subgroup.
For example, if you want to know the number of orders in each status, you can use the COUNT
function with the GROUP BY
clause as follows:
See the following orders
and orderdetails
table.
To get the total amount of all orders by status, you join the orders
table with the orderdetails
table and use the SUM
function to calculate the total amount. See the following query:
Similarly, the following query returns the order numbers and the total amount of each order.
GROUP BY
with expression exampleIn addition to columns, you can group rows by expressions. The following query gets the total sales for each year.
In this example, we used the YEAR
function to extract year data from order date ( orderDate
). We included only orders with shipped
status in the total sales. Note that the expression which appears in the SELECT
clause must be the same as the one in the GROUP BY
clause.
GROUP BY
with HAVING
clause exampleTo filter the groups returned by GROUP BY
clause, you use a HAVING
clause. The following query uses the HAVING
clause to select the total sales of the years after 2003.
GROUP BY
clause: MySQL vs. standard SQLStandard SQL does not allow you to use an alias in the GROUP BY
clause, however, MySQL supports this.
For example, the following query extracts the year from the order date. It first uses year
as an alias of the expression YEAR(orderDate)
and then uses the year
alias in the GROUP BY
clause. This query is not valid in standard SQL.
MySQL also allows you to sort the groups in ascending or descending orders while the standard SQL does not. The default order is ascending. For example, if you want to get the number of orders by status and sort the status in descending order, you can use the GROUP BY
clause with DESC
as the following query:
Notice that we used DESC
in the GROUP BY
clause to sort the status
in descending order. We could also specify explicitly ASC
in the GROUP BY
clause to sort the groups by status in ascending order.
In this tutorial, we have shown you how to use the MySQL GROUP BY
clause to group rows into subgroups based on values of columns or expressions.