Какая разница между HAVING и WHERE?

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

Какая разница между HAVING и WHERE в выражении SQL SELECT?

EDIT: я отметил, что Стивен ответил как правильный, поскольку в нем содержится ключевой бит информации по ссылке:

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

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

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

Ответ 1

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

Источник

Ответ 2

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

Этот код:

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 адресами и количеством адресов в каждом городе.

Ответ 3

Разница между предложением WHERE и HAVING:

1. Предложение WHERE может использоваться с операторами - Select, Insert и Update, где в качестве предложения HAVING может использоваться только оператор Select.

2. WHERE фильтрует строки до агрегации (GROUPING), где as, HAVING фильтрует группы после выполнения агрегаций.

3. Агрегатные функции не могут использоваться в предложении WHERE, если только он не находится в подчиненном запросе, содержащемся в предложении HAVING, тогда как агрегированные функции могут использоваться в предложении Have.

Фильтрация групп:

Предложение WHERE используется для фильтрации строк перед агрегацией, где в качестве предложения HAVING используется фильтрация групп после агрегации

Select City, SUM(Salary) as TotalSalary
from tblEmployee
Where Gender = 'Male'
group by City
Having City = 'London'

В SQL Server у нас есть множество агрегатных функций. Примеры

  1. Count()
  2. Sum()
  3. avg()
  4. Min()
  5. Max()

Ответ 4

Единственное различие для меня: если 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, иначе результат будет пустым.

Ответ 5

Предложение 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;

Ответ 6

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

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

  • HAVING появляется после GROUP BY; SQL оценивает HAVING после того, как он группирует записи.

select statement diagram

Ссылки

Ответ 7

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

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

Ответ 8

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

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

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

Ответ 9

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

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  

Ответ 10

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

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

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

Ресурс Здесь

Ответ 11

Разница b/w WHERE и HAVING:

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

Почему нам нужно предложение HAVING?

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

Ответ 12

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

WHERE my_indexed_row = 123 отобразит строки и автоматически выполнит "ORDER ASC" в других индексированных строках.

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

Ответ 13

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

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

Ответ 14

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

Ответ 15

Один из способов подумать о том, что предложение having является дополнительным фильтром для предложения where.

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

Ответ 16

Предложение WHERE оценивается до того, как строки сгруппированы и, следовательно, оценивается в каждой строке.

Предложение HAVING оценивается после группировки строк и, следовательно, оценивается для каждой группы.

Ответ 17

Я использую HAVING для ограничения запроса на основе результатов агрегатной функции. НАПРИМЕР. выберите * in blahblahblah group by SOMETHING со счетом (SOMETHING) > 0

Ответ 18

Из здесь.

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

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

Ответ 19

Во время работы над проектом это тоже мой вопрос. Как указано выше, 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 и sum(dailyincome), чей sum(dailyincome)>100

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

SELECT userid, sum (dailyincome) FROM usertable WHERE sum (dailyincome) > 100 GROUP BY userid

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

SELECT userid, sum (dailyincome) FROM usertable GROUP BY userid HAVING сумма (dailyincome) > 100

Ответ 20

Возможно, что тема "where" - это строка, тогда как субъект "наличия" - это группа. Я прав?