Ваш первый запрос просматривает все записей и вычисляет среднюю оценку по идентификатору единицы, а затем предложение HAVING
ограничивает конечный результат записями, где средняя оценка по идентификатору единицы меньше 4.
Ваш второй запрос перечисляет все записи, где рейтинг меньше 4, и это все, что он делает. Это ничего не усредняет.
Вот пара проходимых уроков, которые я нашел с помощью Google:
HAVING
фильтрует агрегированные значения, такие как SUM
, AVG
, MIN
, MAX
и т. Д. Он похож на WHERE
, но WHERE
только фильтры не -агрегированные ценности. Вы можете сделать это:
SELECT UnitId, AVG(Rating)
FROM MyTable
GROUP BY UnitId
HAVING AVG(Rating) < 4 -- Good: HAVING is for filtering on aggregate values
Но вы не можете этого сделать (единственное отличие сверху - WHERE
вместо HAVING
в последней строке):
SELECT UnitId, AVG(Rating)
FROM MyTable
GROUP BY UnitId
WHERE AVG(Rating) < 4 -- Bad: WHERE is for the raw values, before they're aggregated
Продолжай. Вы получите там:)