GROUP BY and HAVING
GROUP BY
GROUP BYclause divide the rows returned fromSELECTstatement into groups- For each group, you can apply aggregate functions like
COUNT,SUM,MIN,MAXetc.
Syntax
Group BY
Group the data in column and pass it to aggregate function
Group BY with count
SELECT
movie_lang,
COUNT(movie_lang) as count
FROM
movies
GROUP BY
movie_lang
ORDER BY
count ASC;
movie_lang | count
------------+-------
Swedish | 1
German | 1
Korean | 1
Spanish | 1
Portuguese | 2
Japanese | 4
Chinese | 5
English | 38
Group BY with SUM
SELECT
age_certificate,
SUM(movie_length)
FROM
movies
GROUP BY
age_certificate;
age_certificate | sum
-----------------+------
PG | 1462
15 | 2184
12 | 1425
18 | 994
U | 620
Group BY with MIN, MAX
SELECT movie_lang,
MIN(movie_length),
MAX(movie_length)
FROM movies
GROUP BY movie_lang
movie_lang | min | max
------------+-----+-----
Portuguese | 140 | 145
German | 165 | 165
Chinese | 99 | 139
English | 87 | 168
Swedish | 128 | 128
Spanish | 98 | 98
Korean | 130 | 130
Japanese | 107 | 120
SELECT
movie_lang,
MIN(movie_length),
MAX(movie_length)
FROM
movies
GROUP BY
movie_lang
ORDER BY MAX(movie_length) DESC;
movie_lang | min | max
------------+-----+-----
English | 87 | 168
German | 165 | 165
Portuguese | 140 | 145
Chinese | 99 | 139
Korean | 130 | 130
Swedish | 128 | 128
Japanese | 107 | 120
Spanish | 98 | 98
HAVING
- We use
HAVINGclause to specify a search condition for a group or an aggregate - The
HAVINGclause is often used with theGROUP BYclause to filter rows based on filter condition - cannot use column alias with having clause because it is evaluated before the
SELECTstatement
HAVING AGGREGATE_FUNCTION(column2) = valueHAVING AGGREGATE_FUNCTION(column2) >= value
SELECT
movie_lang,
SUM(movie_length)
FROM
movies
GROUP BY
movie_lang
HAVING SUM(movie_length) > 200
ORDER BY SUM(movie_length);
movie_lang | sum
------------+------
Portuguese | 285
Japanese | 446
Chinese | 609
English | 4824
HAVING vs WHERE
HAVINGworks on result groupWHEREworks onSELECTcolumns and not on the result group