Можно ли вмсето where использовать having?
WHERE — применяется для каждого значения
HAVING — для группы
В целом похожи и можно заменить одно на другое.
П.С. Ориентироваться надо на тот смысл в запросе, который ты вкладываешь.
Текст запроса обязан соответствовать логике получения результата. Исходя из этого — условие должно быть либо во WHERE, либо в HAVING. Есть отдельные случаи, когда можно от этого отойти — но только когда реализуемая логика позволяет подобное.
Реально перемещение условия отбора из WHERE в HAVING используют только в негруппирующих запросах, и только в том случае, когда в условии нужно сослаться на поле выходного набора. Ибо это позволяет не дублировать вычисляющее выражение.
Фильтрация c помощью оператора HAVING — Основы SQL
Иногда встречаются задачи, в которых требуется отфильтровать записи после группировки.
Для примера представим, что нам нужно вывести суммарное время, проведенное на платформе каждым пользователем:
SELECT user_id, SUM(spent_minutes) FROM course_reviews GROUP BY user_id ORDER BY user_id;
Мы видим, что кто-то из пользователей провел много времени, а кто-то — совсем мало. Мы можем выбрать пользователей, которые провели на платформе меньше 30 минут, а затем связаться с ними и узнать, что именно им не понравилось.
Подобные условия невозможно задать с помощью WHERE , потому что они применяются к выборке до момента группировки. У нас немного другой случай — мы хотим задать условие на результат агрегатной функции после проведения группировки.
В этой задаче понадобится дополнение к GROUP BY , которое называется HAVING . Именно его мы изучим в этом уроке.
Ключевое слово HAVING
С помощью ключевого слова HAVING мы можем задать условия на строки выборки после группировки данных.
Попробуем найти пользователей, которые потратили менее 30 минут в онлайн-школе. Для этого напишем такой запрос:
SELECT user_id, SUM(spent_minutes) FROM course_reviews GROUP BY user_id HAVING SUM(spent_minutes) 30 ORDER BY user_id;
Таких пользователей оказалось 6 человек.
Чем HAVING отличается от WHERE
Давайте дополним наш запрос — укажем, что искать пользователей мы будем только среди первых 40 человек. Для этого добавим условие user_id < = 40 :
SELECT user_id, SUM(spent_minutes) FROM course_reviews WHERE user_id 40 GROUP BY user_id HAVING SUM(spent_minutes) 30 ORDER BY user_id;
Обратим внимание на синтаксис запроса. Условия в HAVING проверяются после группировки, поэтому они задаются после предложения GROUP BY . В этом и состоит отличие от условий WHERE , которые применяются к строкам исходной таблицы до группировки.
Таким образом, сначала мы убрали из исходной таблицы всех пользователей с user_id > 40 , затем провели группировку и посчитали суммарное время, а после этого отсеяли тех, кто пользовался платформой дольше 30 минут.
В этой ситуации мы могли бы добавить условие на user_id и в HAVING и получили бы тот же результат:
SELECT user_id, SUM(spent_minutes) FROM course_reviews GROUP BY user_id HAVING SUM(spent_minutes) 30 AND user_id 40 ORDER BY user_id;
Чем отличается where от having в sql
This article is about SQL’s WHERE and HAVING clauses. Both clauses are part of the foundations of the SQL SELECT command. They have similar uses, but there are also important differences that every person who uses SQL should know. Let’s see what’s behind the HAVING vs. WHERE debate.
In this article, we’ll suppose we work for a government social agency supporting people or families whose income is below a certain threshold. This agency uses several metrics to identify people or families needing help.
First, let’s look at the sample dataset. Then, in the rest of the article, we’ll create queries based on this dataset.
Sample Dataset
This dataset describes persons belonging to four families that live in two cities. For simplicity’s sake, we will assume that last_name identifies the family. The idea is to obtain metrics at the person level and at the family level.
TABLE Persons
| name | last_name | birth_date | year_income | city |
|---|---|---|---|---|
| Mary | Roberts | 1964-01-11 | 78000 | Oklahoma |
| Peter | Roberts | 1962-09-25 | 86500 | Oklahoma |
| John | Roberts | 1999-06-03 | 0 | Oklahoma |
| Sue | Roberts | 1996-03-06 | 0 | Oklahoma |
| Melinda | Roberts | 1998-04-04 | 0 | Oklahoma |
| George | Hudson | 1953-02-23 | 48000 | Oklahoma |
| Nancy | Hudson | 1958-12-06 | 65000 | Oklahoma |
| Ann | Hudson | 1979-04-02 | 35000 | Oklahoma |
| Carl | Gibson | 1963-04-03 | 102800 | Phoenix |
| Li | Gibson | 1963-12-27 | 96000 | Phoenix |
| Kate | Bishop | 1994-07-10 | 920000 | Phoenix |
| Mark | Bishop | 2018—9-13 | 0 | Phoenix |
Okay. Now that we’ve seen the dataset, let’s get started!
WHERE and HAVING: Simple Examples
In simple words, the WHERE and HAVING clauses act as filters; they remove records or data that don’t meet certain criteria from the final result of a query. However, they are applied to different sets of data. That’s the important point to understand about WHERE vs. HAVING: WHERE filters at the record level, while HAVING filters at the «group of records» level.
Let’s see some examples.
Here is a sample query that uses the WHERE clause: Suppose we want to obtain the names of people with an annual income greater than $100,000. We need to filter (or discard) at the record level, so we will use the WHERE clause instead of the HAVING clause for this query:
Query text for copy-paste purposes:
Now let’s try a similar query, but this time with the HAVING clause: Suppose we want to obtain the last_name of families having a household income (i.e. the summed income of all family members) over $100,000. This is a clear case for using the HAVING clause, as we don’t need to filter by record. (We are not going to discard a person’s record because they make less than $100,000.) The idea is to filter based on family income, so we need to group persons by last_name and use HAVING to filter the groups of persons, as shown below:
Query text for copy-paste purposes:
COMPLEX HAVING CLAUSES
We can use as many aggregate functions as we wish in the condition of the HAVING clause. Let’s go further with our analysis of family incomes and calculate the average income per member for each family. We want to identify families that make less than 50,000 per person. From an economic point of view, this analysis can show more about family incomes than the previous one. Here’s the query:
Query text for copy-paste purposes:
Note: The HAVING clause has some restrictions; one of them is that record-level columns in the HAVING condition must also appear in the GROUP BY clause.
Using WHERE and HAVING in the Same SQL Query
It is very common to use WHERE and HAVING in the same query. Let’s do a query to obtain the total family income and the income per member for families in Oklahoma that have more than four members:
Query text for copy-paste purposes:
WHERE and HAVING in Complex Queries
To close the article, we’ll build a query that returns families with a household income lower than the average income in their cities. The tricky part is the subquery that obtains the average income for a given city. Please note that we use a different query because this is the average income per city; it’s not based on the number of members per family, but on the number of families in that city, as calculated with count(distinct last_name) .
Query text for copy-paste purposes:
Solved: WHERE vs. HAVING in SQL
We’ve reviewed several different queries that use SQL’s WHERE and HAVING clauses. As we mentioned, both clauses work as filters, but each applies to a different data level. The WHERE clause filters at the record level, while the HAVING clause filters at the group level.
SQL is a super flexible language, and you can create millions of combinations using the WHERE and HAVING clauses. At this point, I would like to mention a great course related to the topics in this article: LearnSQL’s Creating Basic SQL Reports in SQL. It benefits people who know SQL basics and would like to improve their skills in creating using meaningful SQL reports. Go further – explore SQL!
Использование предложения HAVING и WHERE в одном запросе (визуальные инструменты для баз данных)
В некоторых экземплярах может понадобиться исключить отдельные строки из групп (с использованием предложения WHERE) до того, как применять условие к группе как к целому (с использованием предложения HAVING).
Предложение HAVING подобно предложению WHERE, но применимо только к целым группам (то есть к строкам в результирующем наборе, представляющим собой группы), тогда как предложение WHERE применимо к отдельным строкам. В запросе могут содержаться оба предложения: WHERE и HAVING. В этом случае:
Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов на панели диаграмм. Группируются только строки, которые удовлетворяют условиям в предложении WHERE.
Затем предложение HAVING применяется к строкам в результирующем наборе. Только строки, которые удовлетворяют условиям HAVING, появляются в результирующем запросе. Можно применить предложение HAVING только к тем столбцам, которые появляются в предложении GROUP BY или агрегатной функции.
Например, соединяются таблицы titles и publishers , чтобы создать запрос, показывающий среднюю цену книги для группы издателей. Требуется средняя цена книги только определенной группы издателей — например, только издателей в штате Калифорния. При этом нужно показать только те средние цены, которые превышают $10,00.
Первое условие можно задать с помощью предложения WHERE, которое устраняет всех издателей не из Калифорнии перед тем, как начать вычисление средней цены. Второе условие требует предложения HAVING, так как условие основано на результатах группирования и сводных данных. Конечная инструкция SQL может выглядеть следующим образом:
В визуальных инструментах базы данных в SQL Server Management Studio можно создать оба предложения HAVING и WHERE на панели условий. По умолчанию любое заданное условие поиска для столбца становится частью предложения HAVING. Однако можно изменить условие, сделав его предложением WHERE.
Можно создать предложение WHERE и HAVING для одного и того же столбца. Для этого необходимо дважды добавить столбец в области критериев, затем указать один экземпляр как часть предложения HAVING и другой экземпляр как часть предложения WHERE.
Задание условия WHERE в статистическом запросе
Укажите группы для запроса. Дополнительные сведения см. в статье о группировании строк в результатах запроса.
Если столбца, на котором основывается условие WHERE, нет на панели критериев, то добавьте его.
Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.
В столбце Фильтр укажите условие WHERE. Конструктор запросов и представлений добавляет условие в предложение HAVING инструкции SQL.
В качестве примера данной процедуры показан запрос, соединяющий две таблицы titles и publishers .
В этой точке в запросе инструкции SQL содержится предложение HAVING:
В столбце Группировать выберите Where из списка параметров группировки и сводки. Конструктор запросов и представлений удаляет условие из предложения HAVING инструкции SQL и добавляет его в предложение WHERE.
Чем отличается WHERE от HAVING?

Обсудим такой популярный вопрос на собеседовании, как «Чем отличается WHERE от HAVING»?
Ой, скажет кто-то, зачем же спрашивать такие банальности? Как ни странно, довольно много разработчиков даже с сертификатами по SQL quering не понимают, что происходит в HAVING.
Давайте разберёмся. В сущности, HAVING очень похож на WHERE — это тоже фильтр. Вы можете написать в HAVING name = ‘Anna’, как и в WHERE, и ошибки не будет.
В чём же ключевое различие?
Во-первых, в HAVING и только в нём можно писать условия по агрегатным функциям (SUM, COUNT, MAX, MIN и т. д.). То есть если вы хотите сделать что-то вроде COUNT(*) > 10, то это возможно сделать только в HAVING.
«Почему бы не оставить только HAVING?» — спросите вы. Всё кроется в том, как SQL Server выполняет запрос, в каком порядке происходит его разбор и работа с данными. WHERE выполняется до формирования групп GROUP BY. Это нужно для того, чтобы можно было оперировать как можно меньшим количеством данных и сэкономить ресурсы сервера и время пользователя.
Следующим этапом формируются группы, которые указаны в GROUP BY. После того как сформированы группы, можно накладывать условия на результаты агрегатных функций. И тут как раз наступает очередь HAVING: выполняются условия, которые вы задали.
Главное отличие HAVING от WHERE в том, что в HAVING можно наложить условия на результаты группировки, потому что порядок исполнения запроса устроен таким образом, что на этапе, когда выполняется WHERE, ещё нет групп, а HAVING выполняется уже после формирования групп.
В чем разница между WHERE и HAVING в PostgreSQL?
Какая разница в поведении при использовании в запросе к таблице PostgreSQL ключевых слов WHERE и HAVING?
Основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций. Как следствие, предложение WHERE не должно содержать агрегатных функций; не имеет смысла использовать агрегатные функции для определения строк для вычисления агрегатных функций. Предложение HAVING, напротив, всегда содержит агрегатные функции. (Строго говоря, вы можете написать предложение HAVING, не используя агрегаты, но это редко бывает полезно. То же самое условие может работать более эффективно на стадии WHERE.)
Похожие публикации:
- Где выполняются программные модули написанные на процедурных расширениях sql входящих в состав субд
- Для чего нужен sql аналитикам
- Как в sql server management studio создать бд
- Как в sql
Чем having отличается от where в sql

Обсудим такой популярный вопрос на собеседовании, как «Чем отличается WHERE от HAVING»?
Ой, скажет кто-то, зачем же спрашивать такие банальности? Как ни странно, довольно много разработчиков даже с сертификатами по SQL quering не понимают, что происходит в HAVING.
Давайте разберёмся. В сущности, HAVING очень похож на WHERE — это тоже фильтр. Вы можете написать в HAVING name = ‘Anna’, как и в WHERE, и ошибки не будет.
В чём же ключевое различие?
Во-первых, в HAVING и только в нём можно писать условия по агрегатным функциям (SUM, COUNT, MAX, MIN и т. д.). То есть если вы хотите сделать что-то вроде COUNT(*) > 10, то это возможно сделать только в HAVING.
«Почему бы не оставить только HAVING?» — спросите вы. Всё кроется в том, как SQL Server выполняет запрос, в каком порядке происходит его разбор и работа с данными. WHERE выполняется до формирования групп GROUP BY. Это нужно для того, чтобы можно было оперировать как можно меньшим количеством данных и сэкономить ресурсы сервера и время пользователя.
Следующим этапом формируются группы, которые указаны в GROUP BY. После того как сформированы группы, можно накладывать условия на результаты агрегатных функций. И тут как раз наступает очередь HAVING: выполняются условия, которые вы задали.
Главное отличие HAVING от WHERE в том, что в HAVING можно наложить условия на результаты группировки, потому что порядок исполнения запроса устроен таким образом, что на этапе, когда выполняется WHERE, ещё нет групп, а HAVING выполняется уже после формирования групп.
Использование предложения HAVING и WHERE в одном запросе (визуальные инструменты для баз данных)
В некоторых экземплярах может понадобиться исключить отдельные строки из групп (с использованием предложения WHERE) до того, как применять условие к группе как к целому (с использованием предложения HAVING).
Предложение HAVING подобно предложению WHERE, но применимо только к целым группам (то есть к строкам в результирующем наборе, представляющим собой группы), тогда как предложение WHERE применимо к отдельным строкам. В запросе могут содержаться оба предложения: WHERE и HAVING. В этом случае:
Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов на панели диаграмм. Группируются только строки, которые удовлетворяют условиям в предложении WHERE.
Затем предложение HAVING применяется к строкам в результирующем наборе. Только строки, которые удовлетворяют условиям HAVING, появляются в результирующем запросе. Можно применить предложение HAVING только к тем столбцам, которые появляются в предложении GROUP BY или агрегатной функции.
Например, соединяются таблицы titles и publishers , чтобы создать запрос, показывающий среднюю цену книги для группы издателей. Требуется средняя цена книги только определенной группы издателей — например, только издателей в штате Калифорния. При этом нужно показать только те средние цены, которые превышают $10,00.
Первое условие можно задать с помощью предложения WHERE, которое устраняет всех издателей не из Калифорнии перед тем, как начать вычисление средней цены. Второе условие требует предложения HAVING, так как условие основано на результатах группирования и сводных данных. Конечная инструкция SQL может выглядеть следующим образом:
В визуальных инструментах базы данных в SQL Server Management Studio можно создать оба предложения HAVING и WHERE на панели условий. По умолчанию любое заданное условие поиска для столбца становится частью предложения HAVING. Однако можно изменить условие, сделав его предложением WHERE.
Можно создать предложение WHERE и HAVING для одного и того же столбца. Для этого необходимо дважды добавить столбец в области критериев, затем указать один экземпляр как часть предложения HAVING и другой экземпляр как часть предложения WHERE.
Задание условия WHERE в статистическом запросе
Укажите группы для запроса. Дополнительные сведения см. в статье о группировании строк в результатах запроса.
Если столбца, на котором основывается условие WHERE, нет на панели критериев, то добавьте его.
Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.
В столбце Фильтр укажите условие WHERE. Конструктор запросов и представлений добавляет условие в предложение HAVING инструкции SQL.
В качестве примера данной процедуры показан запрос, соединяющий две таблицы titles и publishers .
В этой точке в запросе инструкции SQL содержится предложение HAVING:
В столбце Группировать выберите Where из списка параметров группировки и сводки. Конструктор запросов и представлений удаляет условие из предложения HAVING инструкции SQL и добавляет его в предложение WHERE.
В чем разница между WHERE и HAVING в PostgreSQL?
Какая разница в поведении при использовании в запросе к таблице PostgreSQL ключевых слов WHERE и HAVING?
Основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций. Как следствие, предложение WHERE не должно содержать агрегатных функций; не имеет смысла использовать агрегатные функции для определения строк для вычисления агрегатных функций. Предложение HAVING, напротив, всегда содержит агрегатные функции. (Строго говоря, вы можете написать предложение HAVING, не используя агрегаты, но это редко бывает полезно. То же самое условие может работать более эффективно на стадии WHERE.)
В чем разница между обладанием и где?
должно быть, я гуглю не так, или у меня есть глупый момент времени.
в чем разница между HAVING и WHERE на SQL SELECT заявление?
EDIT: я отметил ответ Стивена как правильный, поскольку он содержал ключевой бит информации по ссылке:
, когда GROUP BY не используется, HAVING ведет себя как WHERE п.
ситуация, которую я видел WHERE не было GROUP BY и вот где началось мое замешательство. Конечно, пока вы не знаете этого, вы не можете указать это в вопросе.
большое спасибо за все ответы, которые были очень поучительно.
20 ответов:
HAVING задает условие поиска для a группа или агрегатная функция, используемая в инструкции SELECT.
наличие: используется для проверки условий после агрегация происходит.
Где: используется для проверки условий до агрегация происходит.этот код:
дает вам таблицу всех городов в МА и количеству адресов в каждом городе.
этот код:
дает вам таблицу городов в МА с более чем 5-адресов и количество адресов в каждом городе.
разница номер один для меня: если HAVING был удален из языка SQL, то жизнь будет продолжаться более или менее, как и раньше. Конечно, миноритарные запросы должны быть переписаны с использованием производной таблицы, CTE и т. д., Но они, возможно, будут легче понять и поддерживать в результате. Возможно, код оптимизатора поставщиков нужно будет переписать, чтобы учесть это, снова возможность для улучшения в отрасли.
теперь рассмотрим на мгновение удаление WHERE от языка. На этот раз большинство существующих запросов необходимо будет переписать без очевидной альтернативной конструкции. Кодеры должны были бы получить творческое, например, внутреннее соединение с таблицей, которая, как известно, содержит ровно одну строку (например, DUAL в Oracle) с помощью ON предложение для имитации предыдущего WHERE предложения. Такие конструкции были бы надуманными; было бы очевидно, что в языке чего-то не хватает, и ситуация была бы хуже в целом результат.
TL; DR мы можем потерять HAVING завтра и все будет не хуже, возможно лучше, но то же самое нельзя сказать о WHERE .
из ответов здесь, кажется, что многие люди не понимают, что a HAVING предложение может быть использовано без GROUP BY предложения. В этом случае применяется ко всему табличному выражению и требует, чтобы в SELECT предложения. Как правило, HAVING пункт будет включать инертные материалы.
это более полезно, чем кажется. Например, рассмотрим этот запрос, чтобы проверить, является ли name столбец уникален для всех значений в T :
есть только два возможных результата: если HAVING предложение истинно, то результат будет одной строкой, содержащей значение 1 , в противном случае результатом будет пустое множество.
предложение HAVING было добавлено в SQL, потому что ключевое слово WHERE не могло использоваться с агрегатными функциями.
зацените w3schools ссылке для получения дополнительной информации
синтаксис:
такой запрос:
. может быть переписан с использованием производной таблицы (и опуская HAVING ) такой:
- WHERE comes before GROUP BY; SQL оценивает предложение WHERE перед тем, как он группирует записи.
- HAVING приходит после GROUP BY; SQL оценивает наличие после него групп записей.
- оператор SQLite SELECT Синтаксис / Схема Железной Дороги
- Informix SELECT оператор синтаксис / схема железной дороги
HAVING используется, когда вы используете агрегат, такой как GROUP BY .
где применяется в качестве ограничения на набор, возвращаемый SQL; он использует встроенный набор oeprations и индексов SQL и поэтому является самым быстрым способом фильтрации результирующих наборов. Всегда используйте там, где это возможно.
наличие необходимо для некоторых агрегатных фильтров. Он фильтрует запрос после того, как sql извлек, собрал и отсортировал результаты. Таким образом, это гораздо медленнее, чем где и следует избегать, за исключением тех ситуаций, которые требуют этого.
SQL Server позволит вам уйти с помощью имея даже тогда, когда где было бы намного быстрее. Не делай этого.
где предложение не работает для агрегатных функций
значит : вы не должны использовать вот так бонус : имя таблицывот вместо того, чтобы использовать предложение where, вы должны использовать имеющие..
без использования предложения GROUP BY, предложение HAVING просто работает как предложение WHERE
Похожие публикации:
- Где изучить sql
- Для чего нужен курсор sql
- Как в sql выбрать все столбцы кроме одного
- Как в таблицу добавить столбец sql
