Какая разница между ИМ и ГДЕ? - PullRequest
250 голосов
/ 13 ноября 2008

Я, должно быть, неправильно гуглю, или у меня тупой момент времени.

В чем разница между HAVING и WHERE в выражении SQL SELECT?

РЕДАКТИРОВАТЬ: я пометил ответ Стивена как правильный, поскольку он содержал ключевой бит информации по ссылке:

Когда GROUP BY не используется, HAVING ведет себя как WHERE предложение

Ситуация, в которой я видел WHERE, не имела GROUP BY, и именно здесь началось мое замешательство. Конечно, пока вы не знаете это, вы не можете указать это в вопросе.

Большое спасибо за все ответы, которые были очень поучительными.

Ответы [ 18 ]

2 голосов
/ 09 марта 2011

У меня была проблема, и я обнаружил другую разницу между WHERE и HAVING. Он не действует одинаково на индексированные столбцы.

WHERE my_indexed_row = 123 покажет строки и автоматически выполнит «ЗАКАЗ АСК» для других проиндексированных строк.

HAVING my_indexed_row = 123 показывает все от самой старой «вставленной» строки до самой новой, без упорядочения.

1 голос
/ 31 декабря 2016

Можно подумать, что предложение has является дополнительным фильтром к предложению where.

A WHERE * Предложение 1004 * используется для фильтрации записей из результата. Фильтр срабатывает до создания каких-либо группировок. Предложение HAVING используется для фильтрации значений из группы

1 голос
/ 29 января 2013

Предложение WHERE используется для сравнения значений в базовой таблице, тогда как предложение HAVING может использоваться для фильтрации результатов агрегатных функций в наборе результатов запроса. Нажмите здесь !

1 голос
/ 13 ноября 2008

В агрегированном запросе (любой запрос, в котором используется агрегатная функция) Предикаты в предложении where оцениваются перед созданием агрегированного промежуточного набора результатов,

Предикаты в условии Имеются применяются к совокупному результирующему набору ПОСЛЕ его создания. Вот почему предикатные условия для агрегатных значений должны быть помещены в предложение Have, а не в предложение Where, и поэтому вы можете использовать псевдонимы, определенные в предложении Select в предложении Have, но не в предложении Where.

0 голосов
/ 17 октября 2013

Может быть, просто тема «где» - это строка, а тема «наличия» - это группа Я прав?

0 голосов
/ 13 ноября 2008

Я использую HAVING для ограничения запроса на основе результатов статистической функции. НАПРИМЕР. выберите * в группе бла-бла, ЧТО-ТО, ЧТО (ЧТО-ТО)> 0

0 голосов
/ 06 июня 2012

Во время работы над проектом это тоже был мой вопрос. Как указано выше, HAVING проверяет условие для результата запроса, который уже найден. Но WHERE предназначен для проверки условия во время выполнения запроса.

Позвольте мне привести пример, чтобы проиллюстрировать это. Предположим, у вас есть таблица базы данных, подобная этой.

usertable {int userid, date datefield, int dailyincome}

Предположим, в таблице есть следующие строки:

1, 2011-05-20, 100

1, 2011-05-21, 50

1, 2011-05-30, 10

2, 2011-05-30, 10

2, 2011-05-20, 20

Теперь мы хотим получить userid s и sum(dailyincome), чей sum(dailyincome)>100

Если мы напишем:

ВЫБЕРИТЕ ИД пользователя, сумма (ежедневный доход) ОТ пользователя ГДЕ сумма (ежедневный доход)> 100 GROUP BY ID пользователя

Это будет ошибкой. Правильный запрос будет:

ВЫБЕРИТЕ идентификатор пользователя, сумму (dailyincome) ИЗ ГРУППЫ, доступной для пользователя. сумма (dailyincome)> 100

0 голосов
/ 13 ноября 2008

С здесь .

стандарт SQL требует, чтобы должны ссылаться только на столбцы в Предложение или столбцы GROUP BY, используемые в агрегатные функции

в отличие от предложения WHERE, которое применяется к строкам базы данных

...