Должно быть, я неправильно гуглю или у меня тупой момент времени.
Какая разница между HAVING
и WHERE
в SQL SELECT
утверждении?
РЕДАКТИРОВАТЬ: я пометил ответ Стивена как правильный, поскольку он содержал ключевой бит информации по ссылке:
Когда
GROUP BY
не используется,HAVING
ведет себя какWHERE
предложение
Ситуация, в которой я видел ситуацию, не возникла WHERE
, GROUP BY
и именно здесь началось мое замешательство. Конечно, пока вы не знаете это, вы не можете указать это в вопросе.
HAVING
фильтр постагрегации , тогда как фильтр предагрегированияWHERE
.Ответы:
Источник
источник
HAVING: используется для проверки условий после агрегации.
WHERE: используется для проверки условий перед агрегацией.
Этот код:
Дает вам таблицу всех городов в МА и количество адресов в каждом городе.
Этот код:
Дает вам таблицу городов в МА с более чем 5 адресами и количеством адресов в каждом городе.
источник
Разница в номер один для меня: если бы он
HAVING
был удален из языка SQL, жизнь продолжалась бы более или менее так же, как и раньше. Конечно, запросы меньшинства должны были бы быть переписаны с использованием производной таблицы, CTE и т. Д., Но в результате их было бы легче понять и поддерживать. Может быть, код оптимизатора продавцов нужно будет переписать, чтобы учесть это, опять же возможность для улучшения в отрасли.Теперь рассмотрим на минуту удаление
WHERE
из языка. На этот раз большинство существующих запросов нужно было бы переписать без очевидной альтернативной конструкции. Кодировщики должны проявить творческий подход, например, внутреннее объединение с таблицей, которая, как известно, содержит ровно одну строку (например,DUAL
в Oracle), используяON
предложение для имитации предыдущегоWHERE
предложения. Такие конструкции будут изобретены; было бы очевидно, что в языке чего-то не хватает, и в результате ситуация будет еще хуже.TL; DR, мы можем проиграть
HAVING
завтра, и все будет не хуже, возможно, лучше, но этого нельзя сказатьWHERE
.Из ответов здесь, кажется, что многие люди не понимают, что
HAVING
пункт может быть использован безGROUP BY
пункта. В этом случаеHAVING
предложение применяется ко всему табличному выражению и требует, чтобы в предложении присутствовали только константыSELECT
. Как правило,HAVING
пункт будет включать в себя агрегаты.Это полезнее, чем кажется. Например, рассмотрим этот запрос, чтобы проверить,
name
является ли столбец уникальным для всех значений вT
:Возможны только два результата: если
HAVING
предложение имеет значение true, то результатом будет одна строка, содержащая значение1
, в противном случае результатом будет пустой набор.источник
Предложение HAVING было добавлено в SQL, поскольку ключевое слово WHERE не может использоваться с агрегатными функциями.
Проверьте эту ссылку w3schools для получения дополнительной информации
Синтаксис:
Запрос, такой как этот:
... может быть переписан с использованием производной таблицы (и пропуская
HAVING
) следующим образом:источник
HAVING
был добавлен, потому что производные таблицы не были добавлены в язык, и до тех пор, пока они не стали SQL, они не были реляционно полными, и как только они неизбежноHAVING
стали избыточными.Разница между ними заключается в отношении к предложению GROUP BY:
ГДЕ предшествует GROUP BY; SQL оценивает предложение WHERE перед группированием записей.
HAVING следует за GROUP BY; SQL оценивает HAVING после группировки записей.
Ссылки
Синтаксис оператора SQLite SELECT / железнодорожная диаграмма
Синтаксис оператора Informix SELECT / железнодорожная диаграмма
источник
SELECT 1 AS result FROM T HAVING...
- на вашей диаграмме я не могу обойтисьHAVING
без прохождения,GROUP BY
но мой совершенно правильный и полезный запрос не имеетGROUP BY
. Незначительный момент: у вас нет возможности включить литеральные значения вSELECT
предложение.WHERE->HAVING
часть, поэтому я думаю, что заслуживает пристального внимания к деталям. Если вы считаете, что мой ответ неправильный, отредактируйте его или опубликуйте предложенное исправление в комментариях.HAVING
используется, когда вы используете агрегат, такой какGROUP BY
.источник
ГДЕ применяется как ограничение на множество, возвращаемое SQL; он использует встроенные в SQL операции и индексы и поэтому является самым быстрым способом фильтрации наборов результатов. Всегда используйте ГДЕ, когда это возможно.
ЕСТЬ необходима для некоторых совокупных фильтров. Он фильтрует запрос ПОСЛЕ того, как sql извлек, собрал и отсортировал результаты. Следовательно, он намного медленнее, чем WHERE, и его следует избегать, за исключением тех ситуаций, которые требуют этого.
SQL Server позволит вам обойтись без использования HAVING, даже если ГДЕ будет намного быстрее. Не делай этого.
источник
Предложение WHERE не работает для агрегатных функций
означает: вы не должны использовать, как этот бонус: имя таблицы
ЗДЕСЬ Вместо использования предложения WHERE вы должны использовать HAVING ..
без использования предложения GROUP BY предложение HAVING просто работает как предложение WHERE
источник
Разница ч / б
WHERE
иHAVING
оговорка:Основное различие между предложением
WHERE
иHAVING
выражением заключается в том, чтоWHERE
он используется для операций со строками иHAVING
для операций со столбцами.Зачем нам нужна
HAVING
оговорка?Как мы знаем, агрегатные функции могут выполняться только над столбцами, поэтому мы не можем использовать агрегатные функции в
WHERE
предложении. Поэтому мы используем агрегатные функции вHAVING
предложении.источник
Когда
GROUP BY
не используются,WHERE
иHAVING
положение, по существу , эквивалентны.Однако когда
GROUP BY
используется:WHERE
используется для фильтрации записей из результата. Фильтрация происходит до создания каких-либо группировок.HAVING
используется для фильтрации значений из группы (т. Е. Для проверки условий после агрегирования в группы).Ресурс отсюда
источник
Один способ думать об этом состоит в том, что предложение has является дополнительным фильтром к предложению where.
Предложение WHERE используется для фильтрации записей из результата. Фильтр срабатывает до создания каких-либо группировок. Предложение HAVING используется для фильтрации значений из группы
источник
В агрегированном запросе (любой запрос, в котором используется агрегатная функция) предикаты в предложении where оцениваются перед созданием агрегированного промежуточного набора результатов,
Предикаты в условии Имеются применяются к совокупному результирующему набору ПОСЛЕ его создания. Вот почему условия предикатов для агрегатных значений должны быть помещены в предложение «В наличии», а не в предложение «Где», и поэтому вы можете использовать псевдонимы, определенные в предложении «Выбор» в предложении «Наличие», но не в предложении «Где».
источник
У меня была проблема, и я обнаружил другую разницу между
WHERE
иHAVING
. Он не действует одинаково на индексированные столбцы.WHERE my_indexed_row = 123
покажет строки и автоматически выполнит «ORDER ASC» для других проиндексированных строк.HAVING my_indexed_row = 123
показывает все от самой старой «вставленной» строки до самой новой, без упорядочивания.источник
От сюда .
в отличие от предложения WHERE, которое применяется к строкам базы данных
источник
HAVING
десятилетия после того, как он «устарел» производными таблицами.SELECT 1 FROM T HAVING COUNT(*) >= 1;
- не ссылаются на столбцы вGROUP BY
предложении (их нет) и столбцы в агрегатных функциях (запрос не ссылается на столбцы вообще).Во время работы над проектом это был и мой вопрос. Как указано выше, HAVING проверяет условие для результата запроса, который уже найден. Но ГДЕ предназначен для проверки условия во время выполнения запроса.
Позвольте мне привести пример, чтобы проиллюстрировать это. Предположим, у вас есть таблица базы данных, как эта.
Предположим, в таблице есть следующие строки:
Теперь мы хотим получить
userid
S иsum(dailyincome)
чейsum(dailyincome)>100
Если мы напишем:
Это будет ошибкой. Правильный запрос будет:
источник
Предложение WHERE используется для сравнения значений в базовой таблице, а предложение HAVING может использоваться для фильтрации результатов агрегатных функций в наборе результатов запроса. Нажмите здесь !
источник
Когда GROUP BY не используется, предложения WHERE и HAVING по существу эквивалентны.
Однако, когда используется GROUP BY:
источник
Я использую HAVING для ограничения запроса на основе результатов статистической функции. Например, выберите * в группе бла-бла, ЧТО-ТО, ЧТО (ЧТО-ТО)> 0
источник
Может быть просто, что предмет «где» - это строка, тогда как предмет «наличия» - это группа. Я прав?
источник