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

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

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

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

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

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

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

Ответы [ 18 ]

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

HAVING: используется для проверки условий после агрегации.
WHERE: используется для проверки условий до агрегации.

Этот код:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City

Дает вам таблицу всех городов в МА и количество адресов в каждом городе.

Этот код:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5

Предоставляет вам таблицу городов в МА с более чем 5 адресами и количеством адресов в каждом городе.

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

HAVING указывает условие поиска для группа или агрегатная функция, используемая в операторе SELECT.

Источник

26 голосов
/ 28 ноября 2011

Разница номер один для меня: если бы HAVING был удален из языка SQL, то жизнь продолжалась бы более или менее так же, как и раньше. Конечно, запросы меньшинства должны были бы быть переписаны с использованием производной таблицы, CTE и т. Д., Но в результате их было бы легче понять и поддерживать. Возможно, код оптимизатора продавцов нужно будет переписать, чтобы учесть это, что снова дает возможность для улучшения в отрасли.

Теперь рассмотрим на минуту удаление WHERE из языка. На этот раз большинство существующих запросов необходимо будет переписать без очевидной альтернативной конструкции. Программистам придется проявить творческий подход, например внутреннее соединение с таблицей, которая, как известно, содержит ровно одну строку (например, DUAL в Oracle), используя предложение ON для имитации предыдущего предложения WHERE. Такие конструкции будут изобретены; было бы очевидно, что в языке чего-то не хватает, и в результате ситуация будет еще хуже.

TL; DR, мы можем потерять HAVING завтра, и все будет не хуже, возможно, лучше, но этого нельзя сказать о WHERE.


Из ответов здесь, кажется, что многие люди не понимают, что предложение HAVING может быть использовано без предложения GROUP BY. В этом случае предложение HAVING применяется ко всему табличному выражению и требует, чтобы в предложении SELECT присутствовали только константы. Обычно предложение HAVING включает агрегаты.

Это полезнее, чем кажется. Например, рассмотрим этот запрос, чтобы проверить, является ли столбец name уникальным для всех значений в T:

SELECT 1 AS result
  FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );

Возможны только два результата: если условие HAVING имеет значение true, то результатом будет одна строка, содержащая значение 1, в противном случае результатом будет пустой набор.

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

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

Проверьте эту ссылку w3schools для получения дополнительной информации

Синтаксис:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

Запрос, такой как этот:

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP 
    BY column_name
HAVING COUNT( column_name ) >= 3;

... может быть переписано с использованием производной таблицы (и без HAVING), например:

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP 
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;
21 голосов
/ 29 августа 2012

Разница между ними заключается в отношении к предложению GROUP BY:

  • ГДЕ предшествует GROUP BY; SQL оценивает предложение WHERE перед группированием записей.

  • ИМЕТЬ после GROUP BY; SQL оценивает HAVING после группировки записей.

select statement diagram

Ссылки

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

HAVING используется, когда вы используете агрегат, например GROUP BY.

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
8 голосов
/ 13 ноября 2008

ГДЕ применяется как ограничение на набор, возвращаемый SQL; он использует встроенные в SQL операции и индексы и поэтому является самым быстрым способом фильтрации наборов результатов. Всегда используйте ГДЕ, когда это возможно.

ЕСТЬ необходима для некоторых агрегатных фильтров. Он фильтрует запрос ПОСЛЕ того, как sql извлек, собрал и отсортировал результаты. Следовательно, он намного медленнее, чем WHERE, и его следует избегать, за исключением тех случаев, когда это требуется.

SQL Server позволит вам избежать использования HAVING, даже если ГДЕ будет намного быстрее. Не делай этого.

6 голосов
/ 17 марта 2016

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

SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

ЗДЕСЬ Вместо использования предложения WHERE вы должны использовать HAVING ..

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

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200  
4 голосов
/ 31 декабря 2016

Разница ч / б WHERE и HAVING условие:

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

Зачем нам нужна HAVING оговорка?

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

3 голосов
/ 02 октября 2016

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

Однако, когда используется GROUP BY:

  • Предложение WHERE используется для фильтрации записей из результата. фильтрация происходит перед созданием любых группировок.
  • Предложение HAVING используется для фильтрации значений из группы (т. Е. Для проверить условия после объединения в группы).

Ресурс от Здесь

...