В чем разница между обладанием и где?
должно быть, я гуглю не так, или у меня есть глупый момент времени.
в чем разница между HAVING и WHERE на SQL SELECT заявление?
EDIT: я отметил ответ Стивена как правильный, поскольку он содержал ключевой бит информации по ссылке:
, когда
GROUP BYне используется,HAVINGведет себя какWHEREп.
ситуация, которую я видел WHERE не было GROUP BY и вот где началось мое замешательство. Конечно, пока вы не знаете этого, вы не можете указать это в вопросе.
большое спасибо за все ответы, которые были очень поучительно.
20 ответов:
наличие: используется для проверки условий после агрегация происходит.
Где: используется для проверки условий до агрегация происходит.этот код:
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.где пункт можно использовать с инструкциями-Select, Insert и Update, где as предложение having может использоваться только с оператором Select.
2.здесь фильтрует строки перед агрегацией (группировкой), где as,С фильтры группы, после выполнения агрегации.
3. агрегатные функции не могут быть использованы в где пункт, если он не находится в подзапросе, содержащемся в предложение having, тогда как агрегатные функции могут использоваться в предложении Having.
Фильтрация Групп:
where предложение используется для фильтрации строк перед агрегацией, где as 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.
из ответов здесь, кажется, что многие люди не понимают, что a
HAVINGпредложение может быть использовано безGROUP BYпредложения. В этом случае применяется ко всему табличному выражению и требует, чтобы вSELECTпредложения. Как правило,HAVINGпункт будет включать инертные материалы.это более полезно, чем кажется. Например, рассмотрим этот запрос, чтобы проверить, является ли
nameстолбец уникален для всех значений вT:SELECT 1 AS result FROM T HAVING COUNT( DISTINCT name ) = COUNT( name );есть только два возможных результата: если
HAVINGпредложение истинно, то результат будет одной строкой, содержащей значение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:
WHERE comes before GROUP BY; SQL оценивает предложение WHERE перед тем, как он группирует записи.
HAVING приходит после GROUP BY; SQL оценивает наличие после него групп записей.
ссылки
HAVINGиспользуется, когда вы используете агрегат, такой какGROUP BY.SELECT edc_country, COUNT(*) FROM Ed_Centers GROUP BY edc_country HAVING COUNT(*) > 1 ORDER BY edc_country;
где применяется в качестве ограничения на набор, возвращаемый SQL; он использует встроенный набор oeprations и индексов SQL и поэтому является самым быстрым способом фильтрации результирующих наборов. Всегда используйте там, где это возможно.
наличие необходимо для некоторых агрегатных фильтров. Он фильтрует запрос после того, как sql извлек, собрал и отсортировал результаты. Таким образом, это гораздо медленнее, чем где и следует избегать, за исключением тех ситуаций, которые требуют этого.
SQL Server позволит вам уйти с помощью имея даже тогда, когда где было бы намного быстрее. Не делай этого.
где предложение не работает для агрегатных функций
значит : вы не должны использовать вот так бонус : имя таблицыSELECT name FROM bonus GROUP BY name WHERE sum(salary) > 200вот вместо того, чтобы использовать предложение where, вы должны использовать имеющие..
без использования предложения GROUP BY, предложение HAVING просто работает как предложение WHERE
SELECT name FROM bonus GROUP BY name HAVING sum(salary) > 200
, когда
, когдаGROUP BYне используется,WHEREиHAVINGположения, по существу, эквивалентны.GROUP BYиспользуется:
- The
WHEREпункт используется для фильтрации записей из результата. Этот фильтрация происходит до создания группировок.- The
HAVINGпункт используется для фильтрации значений из группы (т. е. проверка условий после выполнения агрегации в группы).ресурс здесь
разница в/ч
WHEREиHAVINGстатья:основное различие между
WHEREиHAVINGпредложенияWHEREиспользуется для операций со строками иHAVINGиспользуется для операций со столбцами.зачем нам это нужно
HAVINGпредложения?как мы знаем, агрегатные функции могут выполняться только на столбцы, поэтому мы не можем использовать агрегатные функции в
WHEREпредложения. Поэтому мы используем агрегатные функции вHAVINGпредложения.
у меня была проблема, и я обнаружил еще одну разницу между
WHEREиHAVING. Он не действует таким же образом на индексированные столбцы.
WHERE my_indexed_row = 123покажет строки и автоматически выполнит "ORDER ASC" на других индексированных строках.
HAVING my_indexed_row = 123показывает все от самой старой "вставленной" строки до самой новой, без заказа.
в агрегированном запросе (любой запрос, в котором используется агрегатная функция) предикаты в предложении where вычисляются до создания агрегированного промежуточного результирующего набора,
предикаты в предложении Having применяются к совокупному результирующему набору после его создания. Вот почему условия предиката для агрегатных значений должны быть помещены в предложение Having, а не в предложение Where, и поэтому вы можете использовать псевдонимы, определенные в предложении Select в предложении Having, но не в предложение WHERE.
предложение WHERE используется для сравнения значений в базовой таблице, тогда как предложение HAVING может использоваться для фильтрации результатов агрегатных функций в результирующем наборе запроса Нажмите здесь!
один из способов думать об этом заключается в том, что предложение having является дополнительным фильтром к предложению where.
A здесь предложение используется фильтры записей из результата. Фильтр выполняется до создания каких-либо группировок. А С пункт используется для фильтрации значений из группы
The здесь вычисляется перед группировкой строк и, следовательно, вычисляется для каждой строки.
The С предложение вычисляется после группирования строк, и поэтому оценивается по группам.
Я использую HAVING для ограничения запроса, основанного на результатах агрегатной функции. Например, выберите * в группе blahblahblah чем-то, имеющим count(SOMETHING)>0
с здесь.
стандарт SQL требует, чтобы иметь должны ссылаться только на столбцы в Сгруппировать по предложению или столбцам, используемым в агрегатные функции
в отличие от предложения WHERE, которое применяется к строкам базы данных
во время работы над проектом, это был мой вопрос. Как указано выше,С проверяет условие для уже найденного результата запроса. Но здесь предназначен для проверки состояния при выполнении запроса.
позвольте мне привести пример, чтобы проиллюстрировать это. Предположим, у вас есть таблица базы данных, как это.
usertable{ 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
Теперь мы хотим получить
userids иsum(dailyincome)чейsum(dailyincome)>100Если мы пишем:
выберите userid, sum (dailyincome) из таблицы пользователей, где sum (dailyincome)>100 GROUP BY userid
Это будет ошибка. Правильный запрос будет:
выберите имя пользователя, сумма(dailyincome) от usertable группы по имени пользователя, имея сумма(dailyincome)>100
может быть просто, что субъект " где "- это строка, тогда как субъект" иметь " - это группа. Я прав?

Comments