Despite the Mimer Validator result, I don't believe yours is valid Standard SQL.
A HAVING
clause without a GROUP BY
clause is valid and (arguably) useful syntax in Standard SQL. Because it operates on the table expression all-at-once as a set, so to speak, it only really makes sense to use aggregate functions. In your example:
Book HAVING NumberOfPages = MAX(NumberOfPages)
is not valid because when considering the whole table, which row does NumberOfPages
refer to? Likewise, it only makes sense to use literal values in the SELECT
clause.
Consider this example, which is valid Standard SQL:
SELECT 'T' AS result
FROM Book
HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
Despite the absence of the DISTINCT
keyword, the query will never return more than one row. If the HAVING
clause is satisfied then the result will be a single row with a single column containing the value 'T' (indicating we have books with differing numbers of pages), otherwise the result will be the empty set i.e. zero rows with a single column.
I think the reason why the query does not error in mySQL is due to propritary extensions that cause the HAVING
clause to (logically) come into existence after the SELECT
clause (the Standard behaviour is the other way around), coupled with the implicit GROUP BY
clause mentioned in other answers.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…