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 перед группировкой данных.