Ответ 1
HAVING определяет условие поиска для группы или агрегатной функции, используемой в инструкции SELECT.
Я, должно быть, ошибаюсь в googling или у меня есть глупый момент времени.
Какая разница между HAVING
и WHERE
в выражении SQL SELECT
?
EDIT: я отметил, что Стивен ответил как правильный, поскольку в нем содержится ключевой бит информации по ссылке:
Если
GROUP BY
не используется,HAVING
ведет себя как предложениеWHERE
Ситуация, в которой я видел WHERE
in, не имела GROUP BY
, и именно там началось мое замешательство. Конечно, пока вы не знаете этого, вы не можете указать его в вопросе.
Большое спасибо за все ответы, которые были очень полезными.
HAVING определяет условие поиска для группы или агрегатной функции, используемой в инструкции SELECT.
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 адресами и количеством адресов в каждом городе.
Разница между предложением 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 у нас есть множество агрегатных функций. Примеры
Count()
Sum()
avg()
Min()
Max()
Единственное различие для меня: если 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
, иначе результат будет пустым.
Предложение 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;
Разница между ними заключается в отношении к предложению GROUP BY:
ГДЕ до GROUP BY; SQL оценивает предложение WHERE перед группированием записей.
HAVING появляется после GROUP BY; SQL оценивает HAVING после того, как он группирует записи.
Ссылки
HAVING
используется, когда вы используете агрегат, например GROUP BY
.
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
WHERE применяется как ограничение на набор, возвращаемый SQL; он использует встроенные настройки SQL и индексы SQL и, следовательно, является самым быстрым способом фильтрации наборов результатов. Всегда используйте ГДЕ, когда это возможно.
HAVING необходим для некоторых агрегатных фильтров. Он фильтрует запрос ПОСЛЕ того, как sql извлек, собрал и отсортировал результаты. Поэтому он намного медленнее, чем WHERE, и его следует избегать, за исключением тех ситуаций, которые его требуют.
SQL Server позволит вам избежать использования HAVING, даже если WHERE будет намного быстрее. Не делайте этого.
Предложение 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
Если GROUP BY
не используется, предложения WHERE
и HAVING
по существу эквивалентны.
Однако, когда используется GROUP BY
:
WHERE
используется для фильтрации записей из результата.
фильтрация происходит до того, как будут сделаны какие-либо группировки.HAVING
используется для фильтрации значений из группы (т.е. для
проверьте условия после агрегации в группы).Ресурс Здесь
Разница b/w WHERE
и HAVING
:
Основное отличие между WHERE
и HAVING
заключается в том, что WHERE
используется для операций с строками и HAVING
используется для операций столбца.
Почему нам нужно предложение HAVING
?
Как известно, агрегатные функции могут выполняться только в столбцах, поэтому мы не можем использовать агрегированные функции в WHERE
. Поэтому мы используем агрегатные функции в разделе HAVING
.
У меня возникла проблема и выяснилось другое различие между WHERE
и HAVING
. Он не действует одинаково на индексированных столбцах.
WHERE my_indexed_row = 123
отобразит строки и автоматически выполнит "ORDER ASC" в других индексированных строках.
HAVING my_indexed_row = 123
показывает все, начиная с самой старой "вставленной" строки до самой новой, без упорядочения.
В запросе Aggregate (любой запрос, в котором используется агрегатная функция) Предикаты в предложении where вычисляются до генерирования агрегированного промежуточного результирующего набора,
Предикаты в предложении Have применяются к совокупному результирующему набору ПОСЛЕ того, как он был сгенерирован. Именно поэтому предикатные условия для совокупных значений должны быть помещены в предложение "Не", а не в предложение "Где", и почему вы можете использовать псевдонимы, определенные в предложении "Выбор" в разделе "Заявление", но не в разделе "Где".
Предложение WHERE используется для сравнения значений в базовой таблице, тогда как предложение HAVING может использоваться для фильтрации результатов агрегатных функций в результирующем наборе запроса Нажмите here!
Один из способов подумать о том, что предложение having является дополнительным фильтром для предложения where.
A Предложение WHERE используется для фильтрации записей из результата. Фильтр возникает до того, как будут сделаны какие-либо группировки. Предложение HAVING используется для фильтрации значений из группы
Предложение WHERE оценивается до того, как строки сгруппированы и, следовательно, оценивается в каждой строке.
Предложение HAVING оценивается после группировки строк и, следовательно, оценивается для каждой группы.
Я использую HAVING для ограничения запроса на основе результатов агрегатной функции. НАПРИМЕР. выберите * in blahblahblah group by SOMETHING со счетом (SOMETHING) > 0
Из здесь.
стандарт SQL требует, чтобы должны ссылаться только на столбцы в Предложение GROUP BY или столбцы, используемые в совокупные функции
в отличие от предложения WHERE, которое применяется к строкам базы данных
Во время работы над проектом это тоже мой вопрос. Как указано выше, 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
Возможно, что тема "where" - это строка, тогда как субъект "наличия" - это группа. Я прав?