Чем отличается where от having
Перейти к содержимому

Чем отличается where от having

  • автор:

Используйте предложения HAVING и WHERE в одном запросе (визуальные инструменты базы данных)

В некоторых случаях может потребоваться исключить отдельные строки из групп (с помощью WHERE предложения) перед применением условия к группам в целом (с помощью HAVING предложения).

Предложение HAVING похоже WHERE на предложение, но применяется только к группам в целом (то есть к строкам в результирующем наборе, представляющего группы), в то время WHERE как предложение применяется к отдельным строкам. Запрос может содержать как предложение, WHERE так и HAVING предложение. В этом случае:

  • Предложение WHERE применяется сначала к отдельным строкам в таблицах или табличных объектах на панели диаграммы . Группируются только строки, соответствующие условиям в предложении WHERE .
  • Затем HAVING предложение применяется к строкам в результирующем наборе. В выходных данных запроса отображаются только группы, соответствующие HAVING условиям. Предложение можно применять HAVING только к столбцам, которые также отображаются в предложении GROUP BY или в агрегатной функции.

Указание предложения WHERE и HAVING для двух присоединенных таблиц

База данных, используемая в этой статье, является базой данных, доступной pubs из Northwind и пабов примеры баз данных для Microsoft SQL Server на GitHub.

Например, соединяются таблицы titles и publishers , чтобы создать запрос, показывающий среднюю цену книги для группы издателей. Требуется средняя цена книги только определенной группы издателей — например, только издателей в штате Калифорния. И даже тогда, вы хотите увидеть среднюю цену только в том случае, если это более $ 10,00.

Вы можете установить первое условие, включив WHERE предложение, которое не карта какие-либо издатели, которые не входят в Калифорнию, прежде чем вычислить средние цены. Для второго условия требуется HAVING предложение, так как условие основано на результатах группировки и суммирования данных. Конечная инструкция SQL может выглядеть следующим образом:

SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id HAVING AVG(price) > 10; 

В visual Database Tools of SQL Server Management Studio можно создавать оба HAVING предложения и WHERE предложения в области условий . По умолчанию при указании условия поиска для столбца условие становится частью HAVING предложения. Однако условие можно изменить, чтобы быть предложением WHERE .

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

Указание условия WHERE в агрегатном запросе

  1. Укажите группы для запроса. Дополнительные сведения см. в разделе Группирование строк в результатах запроса (визуальные инструменты для баз данных).
  2. Если он еще не находится в области условий , добавьте столбец, на котором вы хотите создать WHERE условие.
  3. Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.
  4. В столбце «Фильтр« укажите WHERE условие. Конструктор запросов и представлений добавляет условие в HAVING предложение инструкции SQL.

Примечание. В качестве примера данной процедуры показан запрос, соединяющий две таблицы titles и publishers .

На этом этапе запроса инструкция SQL содержит HAVING предложение:

SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA' 
SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id; 

Связанный контент

  • SELECT — НАЛИЧИЕ (Transact-SQL)
  • Результаты запросов сортировки и группирования (визуальные инструменты для баз данных)
  • Резюмирование результатов запросов (визуальные инструменты для баз данных)

Различия между HAVING и WHERE в SQL без GROUP BY

WHERE используется для фильтрации записей до группировки, отсеивая те, которые не удовлетворяют заданному критерию. В свою очередь, HAVING применяется после операции GROUP BY и позволяет отфильтровать группы записей по агрегированным значениям, получаемым с помощью функций SUM, AVG или COUNT.

Пример использования: sql SELECT department, SUM(sales) AS total_sales FROM orders WHERE department <> ‘Returns’ — Исключаем негатив, связанный с возвратами. GROUP BY department HAVING SUM(sales) > 5000 — В отчет включаем только значительные суммы.

Подробнее о WHERE и HAVING

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

HAVING, со своей стороны, действует как определенный контролер, проверяющий уже сгруппированные данные после применения GROUP BY. В отличие от WHERE, HAVING может применяться с агрегационными функциями.

Если GROUP BY не применяется, то HAVING может функционировать как WHERE. Однако это не самый эффективный способ использования HAVING, поскольку его предназначение — фильтрация данных после агрегации.

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

Распространенные ловушки и методы их устранения

При работе с SQL существуют ошибки, в которые легко вляпаться:

  1. Применение HAVING без использования GROUP BY может привести к снижению производительности базы данных.
  2. Попытка использования агрегатных функций с WHERE приведет к ошибке, т.к. WHERE функционирует до стадии агрегации.
  3. Заблуждения о порядке выполнения условий могут сказаться на корректности результатов. Важно помнить, что WHERE идет до GROUP BY, а HAVING следует после.

Чтобы избежать этих проблем:

  • Используйте WHERE для уменьшения объема данных до их агрегации.
  • Применяйте HAVING для фильтрации результатов после группировки.
  • Всегда проверяйте логику запроса на небольшой выборке данных перед его выполнением на полном объеме данных.

Визуализация

Для более понятного представления разницы между HAVING и WHERE:

Проверка на входе (WHERE): ����

  • Ваш пропуск на «праздник» данных. WHERE фильтрует данные до начала этого мероприятия.

Пропуск в VIP-зону (HAVING): ��️��

  • Вы уже на «празднике», но получите ли доступ к VIP-зоне? HAVING – это фильтр для данных, которые уже «потусили» на «празднике» данных.

Таким образом, WHERE – это Чекпоинт ��, а HAVING – это Пропуск в VIP-зону ��️��.

Оптимизация SQL-запросов: улучшаем производительность

Правильное применение WHERE и HAVING может значительно улучшить производительность запросов. Вот несколько рекомендаций:

  • Индексация: Создание индексов для полей в условии WHERE может существенно ускорить выполнение запросов.
  • Сложные условия в HAVING: Если условия в HAVING слишком сложные, это может замедлить обработку запроса.
  • Временные таблицы: Возможность создания временных таблиц для выполнения сложных запросов стоит рассмотреть. Применяйте HAVING уже после агрегации данных в этих таблицах.

Коррелированные подзапросы: Where и Having

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

Полезные материалы

  1. SQL HAVING Clause – освойте азы и поймите разницу между HAVING и WHERE.
  2. В чем разница между HAVING и WHERE в SQL? – Stack Overflow – обсуждение на Stackoverflow с множеством реальных примеров.
  3. Oracle / PLSQL: HAVING Clause – подробное рассмотрение использования HAVING в Oracle.
  4. Использование GROUP BY, HAVING и WHERE вместе – Essential SQL – описание применения комбинации этих команд в SQL-запросах.

HAVING

HAVING — применяется для фильтрации функций и столбцов сгруппированных при помощи GROUP BY указанных в SELECT.

Другими словами применяется для агрегатных функций(COUNT(), MAX() . ) и столбцов указанных в выражении SELECT и обработанных GROUP BY. Если нужно использовать что-то, что не указанно в SELECT, то лучше использовать WHERE.

Порядок выполнения такой:
1. В SELECT указываем нужные столбцы или агрегатные функции(то с чем будем работать в GROUP BY и HAVING)
2. В GROUP BY пишем по какому столбцу или функции их группируем
3. В HAVING пишем условие фильтровки результата GROUP BY

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

SELECT COUNT(*) AS `c`, `title` FROM `razdel` GROUP BY `sort` HAVING `c` > 1;

Здесь мы создаём псевдоним:

COUNT(*) AS `c`

который в дальнейшем используем в выражении:

HAVING `c` > 1;

// идентично:
// HAVING COUNT(*) > 1;

В чем разница между WHERE и HAVING в PostgreSQL?

Какая разница в поведении при использовании в запросе к таблице PostgreSQL ключевых слов WHERE и HAVING?

Отслеживать
user181100
задан 19 мая 2017 в 7:54
5,327 11 11 золотых знаков 58 58 серебряных знаков 117 117 бронзовых знаков

с таким успехом мы можем всю документацию переписать на SO! Вы искать пробовали? вторая ссылка по запросу where having sql

19 мая 2017 в 8:00

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций. Как следствие, предложение WHERE не должно содержать агрегатных функций; не имеет смысла использовать агрегатные функции для определения строк для вычисления агрегатных функций. Предложение HAVING, напротив, всегда содержит агрегатные функции. (Строго говоря, вы можете написать предложение HAVING, не используя агрегаты, но это редко бывает полезно. То же самое условие может работать более эффективно на стадии WHERE.)

Отслеживать
ответ дан 19 мая 2017 в 8:02
user181100 user181100

вы можете написать предложение HAVING, не используя агрегаты, но это редко бывает полезно Это полезно, когда нужно выполнять отбор по выражению выходного набора — в HAVING можно ссылаться на поля выходного набора по их именам, а вот во WHERE придётся писать то же выражение ещё раз.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *