Почему необходимо поместить столбцы, которые Вы создаете сами (например, select 1 as "number"
) после HAVING
и нет WHERE
в MySQL?
И есть ли любые оборотные стороны вместо выполнения WHERE 1
(запись целого определения вместо имени столбца)?
Почему в MySQL нужно помещать столбцы, которые вы создаете сами (например, "select 1 as number") после HAVING, а не WHERE?
WHERE
применяется перед GROUP BY
, HAVING
применяется после (и может фильтровать по агрегатам).
Вообще, вы можете ссылаться на псевдонимы ни в одном из этих пунктов, но MySQL
позволяет ссылаться на псевдонимы уровня SELECT
в GROUP BY
, ORDER BY
и HAVING
.
И есть ли какие-нибудь минусы вместо того, чтобы делать "WHERE 1" (писать все определение вместо имени столбца)
Если ваше вычисляемое выражение не содержит агрегатов, то поместить его в предложение WHERE
, скорее всего, будет более эффективно.
HAVING
используется для фильтрации агрегатов в вашей GROUP BY
.
Например, чтобы проверить повторяющиеся имена:
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
Основное отличие состоит в том, что WHERE
нельзя использовать для сгруппированного элемента (например, SUM (число)
), тогда как HAVING
может.
Причина в том, что ГДЕ
выполняется до группировки и HAVING
выполняется после группировки.