As always, the documentation is an excellent reference. In here, it shows
WHERE condition and condition is defined (further down the page) as
where condition is any expression that evaluates to a result of type boolean. Any row that does not satisfy this condition will be eliminated from the output. A row satisfies the condition if it returns true when the actual row values are substituted for any variable references.
HAVING, as John pointed out in a comment, is for filtering on aggregates after they have been calculated, while
WHERE is for filtering the rows that are gathered at the start. For example:
GROUP BY type
HAVING COUNT(type) > 1
would return a set of rows where the COUNT(type) result ended up being more than 1.. The filtering done by
HAVING takes place after the DB has already grouped the entire table by TYPE and calculated all
COUNT() values. On the other hand
WHERE type = 'EXAMPLE'
GROUP BY type
would return one row (where type is EXAMPLE) and the count of how many rows contained that type. The filtering here takes place AS THE DB COLLECTS THE ROWS up front .. Any row that doesn't have type 'EXAMPLE' is thrown out. Only one COUNT() is calculated in this instance.
One more complex example to show that the two are evaluated separately and can be combined in any query.
col_1, col_2, col_3, SUM(col_4), COUNT(col_4), AVG(col_4)
WHERE col_2 IN ('A', 'B', 'C')
AND col_3 > 3
GROUP BY col_1, col_2, col_3
HAVING COUNT(col_4) > 2
AND AVG(col_4) > 10.5