В чем разница между HAVING и WHERE в MySQL Query? - PullRequest
5 голосов
/ 16 сентября 2011

У меня есть представление (viewX) на основе объединений некоторых таблиц:

Когда я использую WHERE, запрос задерживается, загрузка процессора достигает 50%, и, наконец, мне нужно закрыть службу mysqld.exe и перезапустить, чтобы попытаться решить проблему снова.

Когда я использую HAVING, запрос выполняется отлично и быстро, я получаю результаты, и все готово.

Запрос похож на этот:

SELECT * FROM viewX WHERE column_of_view = 'foo'

SELECT * FROM viewX HAVING column_of_view = 'foo'

Что происходит?

Я нашел решение сделать что-то вроде этого:

SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo'

SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo'

ОБА ЗАПРОСОВ РАБОТАЕТ ХОРОШО, НО, Я думаю, что это ПЛОХО! (ВЫБРАТЬ * ИЗ (... viewX) ????)

Ответы [ 4 ]

5 голосов
/ 16 сентября 2011

WHERE - для фильтрации результатов запроса на основе условия.

HAVING - для применения фильтра к результатам агрегатной функции.В отсутствие агрегатной функции она работает так же, как ГДЕ.

http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

1 голос
/ 19 февраля 2016

Наличие используется для агрегатных функций, таких как sum, avg и т. Д., И может использоваться только в операторе select. Предложение where не будет работать в условиях агрегирования. Например: где сумма (оценка)> 300 // это не так

0 голосов
/ 03 апреля 2012

ГДЕ используется при перечислении, а имена ALIAS пока недоступны

HAVING фильтрует строки после перечисления всех возможных строк, чтобы генерировались имена ALIAS

При фильтрации строк в строке должна возникнуть проблема.

0 голосов
/ 16 сентября 2011

Это зависит от определения представления - условие наличия должно применяться только к агрегированному запросу и применяется после группировки. Вы смотрели на два плана запроса (с объяснением)?

...