В чем разница между обладанием и где?



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



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



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




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




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



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

889   20  

20 ответов:

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

источник

наличие: используется для проверки условий после агрегация происходит.
Где: используется для проверки условий до агрегация происходит.

этот код:

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 у нас есть много агрегатных функций. примеры

  1. Count()
  2. Sum()
  3. avg()
  4. Min()
  5. 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 оценивает наличие после него групп записей.

select statement diagram

ссылки

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

    Ничего не найдено.