Ответ 1
Несмотря на результат Mimer Validator, я не считаю ваш действительным стандартный SQL.
ПредложениеA HAVING
без предложения GROUP BY
является допустимым и (возможно) полезным синтаксисом в стандартном SQL. Поскольку он работает с табличным выражением all-at-once в качестве набора, так сказать, действительно имеет смысл использовать агрегатные функции. В вашем примере:
Book HAVING NumberOfPages = MAX(NumberOfPages)
недействителен, так как при рассмотрении всей таблицы, к которой относится строка NumberOfPages
? Точно так же имеет смысл использовать литеральные значения в предложении SELECT
.
Рассмотрим этот пример, который действителен. Стандартный SQL:
SELECT 'T' AS result
FROM Book
HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
Несмотря на отсутствие ключевого слова DISTINCT
, запрос никогда не вернет более одной строки. Если условие HAVING
выполнено, то результатом будет одна строка с одним столбцом, содержащим значение "T" (указывающее, что у нас есть книги с разным количеством страниц), иначе результатом будет пустое множество, то есть нулевые строки с один столбец.
Я думаю, что причина, по которой запрос не вызывает ошибку в mySQL, объясняется наличием приватных расширений, которые приводят к тому, что предложение HAVING
(логически) возникает после предложения SELECT
(стандартное поведение - это наоборот), в сочетании с неявным предложением GROUP BY
, упомянутым в других ответах.