In order to use HAVING
in SQL queries , must there be a GROUP BY
to aggregate the column names?
Are there any special cases where it is possible to use HAVING
without a GROUP BY
in SQL queries?
Must they co-exist at the same time?
Database Administrators Stack Exchange is a question and answer site for database professionals who wish to improve their database skills and learn from others in the community. It only takes a minute to sign up.
Sign up to join this communityNo.
They don't have to coexist, as proved by the fact that the following query in Oracle works:
select * from dual having 1 = 1;
Similarly, in PostgreSQL the following query works:
select 1 having 1 = 1;
So having
doesn't require group by
.
Having is applied after the aggregation phase and must be used if you want to filter aggregate results. So the reverse isn't true, and the following won't work:
select a, count(*) as c
from mytable
group by a
where c > 1;
You need to replace where
with having
in this case, as follows:
select a, count(*) as c
from mytable
group by a
having c > 1;
NB The following query form will also work:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
You can see that using having
is simply a shorthand version of this last query.
In summary, having
is applied after the group by
phase whereas where
is applied before the group by
phase.
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
Jan 24, 2014 at 9:16
select 1 having count(*) = 1;
which I have yet to grasp.
Jan 24, 2014 at 9:22
SELECT 1 AS id, 'Colin' AS name;
while others like Oracle have a special dual
table. I don't think that either of these syntaxes is ANSI/ISO SQL (which requires FROM
).
Jan 24, 2014 at 9:23
from
but the reference to count(*)
in the having
clause without any indication as to over which columns this is being aggregated. Presumably it aggregates over all columns in the select
clause.
Jan 24, 2014 at 9:25
Having is used to filter groups .
where clause is used to filter rows.
having
is applied after the aggregation phase so can be used to filter groups.
Jan 24, 2014 at 8:52
In the absence of GROUP BY clause the query considers the whole relation as one group.
e.g.
select count(*)
from dual
having count(*) > 5;
HAVING is filtering the groups. If you have not GROUP BY cause, all rows presents one group. So, if predicate in HAVING evaluates as true, you get one row, otherwise no rows.