MySql - HAVING vs. WHERE
В чем разница между этими двумя запросами?
SELECT f.name,
u.name,
u.id
FROM families f
JOIN units u
ON f.unit_id = u.id
HAVING u.id IN( 43, 413, 22 )
и
SELECT f.name,
u.name,
u.id
FROM families f
JOIN units u
ON f.unit_id = u.id
WHERE u.id IN( 43, 413, 22 )
Результат этих двух запросов точно такой же. Итак, где разница?
Ответы
Ответ 1
Разница между предложением having и where в sql заключается в том, что предложение where не может использоваться с агрегатами, но предложение having может. Один из способов подумать о том, что предложение having является дополнительным фильтром для предложения where.
Что лучше: нажмите
Ответ 2
WHERE
используется для выбора данных в обрабатываемых исходных таблицах.
HAVING
используется для фильтрации данных в наборе результатов, созданных запросом. Это означает, что он может ссылаться на совокупные значения и псевдонимы в предложении SELECT
.
Например, можно написать:
SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
HAVING diff > 10
Это не сработает с использованием WHERE
, потому что diff
является псевдонимом, а не одним из исходных столбцов таблицы. Вместо этого вы можете написать:
SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
WHERE t1.val - t2.val > 10
но тогда, возможно, придется выполнить все вычитания дважды: один раз для выбора и снова создать набор результатов.
Ответ 3
В этих запросах ничего. Но если бы вы использовали GROUP BY
, вы увидели бы разницу. Если бы вы использовали GROUP BY
, то к группе будет применен HAVING
, тогда как WHERE
будет применен к SELECT
перед группировкой данных.