Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

  

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

Источник

Другие советы

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

Разница в номер один для меня: если бы 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:

  • ЧТО происходит перед ГРУППОЙ ПО;SQL оценивает предложение WHERE перед тем, как группировать записи.

  • НАЛИЧИЕ приходит после ГРУППЫ ПО;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; он использует встроенные в SQL операции и индексы и поэтому является самым быстрым способом фильтрации наборов результатов. Всегда используйте ГДЕ, когда это возможно.

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

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

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

Различие между ч / б WHERE и HAVING :

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

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

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

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

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

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

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

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

WHERE my_indexed_row = 123 покажет строки и автоматически выполнит " ЗАКАЗАТЬ ASC " в других проиндексированных строках.

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

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

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

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

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

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

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

С здесь .

  

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

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

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

Позвольте мне привести пример, чтобы проиллюстрировать это. Предположим, у вас есть таблица базы данных, подобная этой.

  

usertable {int userid, дата 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

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

  

ВЫБЕРИТЕ ИДЕНТИФИКАТОР, sum (dailyincome) ИЗ ГЛАВНОЙ   сумма (dailyincome) > 100 GROUP BY идентификатор пользователя

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

  

ВЫБЕРИТЕ идентификатор пользователя, сумма (dailyincome) ИЗ ГРУППЫ, доступной для пользователя.   сумма (dailyincome) & GT; 100

Может быть, просто тема "где" является строкой, в то время как объект "имеющий" это группа. Я прав?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top