Group BY Clause¶
The GROUP BY clause allows grouping the results of a query by the
values of the attributes of the view and/or expressions, generating a
row for each group. The attributes and expressions with which the group
by operation is performed are specified in the GROUP BY clause.
If the query does not have the GROUP BY clause, but its SELECT
clause uses aggregation functions, all the results obtained by the
SELECT statement would form one single group.
When a query has the GROUP BY clause, the content of the SELECT
clause is restricted: only the attributes specified in the GROUP BY
clause can be specified in it. The other attributes of the view can be
used only as parameters of aggregation functions. When an aggregation
function is specified in the SELECT clause, you should indicate and
alias for the new attribute. Otherwise the Server generates an alias
automatically.
In a group-by view, derived attribute functions can also appear in the
SELECT clause, although only applied to aggregation fields or
functions.
Use of Aggregation Functions¶
An aggregation function is applied to the tuples belonging to a group
resulting from a GROUP BY operation and calculates an aggregated
value from same. The section Aggregation Functions lists the aggregation functions.
The aggregation functions follow the general syntax of the predefined functions (see section Syntax Conventions), but only the name of the attribute subject to alteration is admitted as a parameter (nested functions are not admitted either).
The modifiers ALL and DISTINCT can also be specified.
One exception is the COUNT() aggregation function that can receive
as a parameter the special character * to indicate that it
should return the number of tuples that belong to each group.
For example, given a relation emp representing the employees of a
company that contains an attribute department which indicates to
which department each employee belongs, to obtain the different
departments together with the number of employees that belong to each
one of them, the following query would be executed:
SELECT count(*) AS numOfWorkers, department
FROM emp
GROUP BY department;
Or, using the alias of the field:
SELECT count(*) AS numOfWorkers, department AS dept_name
FROM emp
GROUP BY dept_name;
