в чем разница между where и having sql
What is the difference between HAVING and WHERE in SQL?
What is the difference between HAVING and WHERE in an SQL SELECT statement?
EDIT: I have marked Steven’s answer as the correct one as it contained the key bit of information on the link:
When GROUP BY is not used, HAVING behaves like a WHERE clause
The situation I had seen the WHERE in did not have GROUP BY and is where my confusion started. Of course, until you know this you can’t specify it in the question.
18 Answers 18
HAVING: is used to check conditions after the aggregation takes place.
WHERE: is used to check conditions before the aggregation takes place.
Gives you a table of all cities in MA and the number of addresses in each city.
Gives you a table of cities in MA with more than 5 addresses and the number of addresses in each city.
HAVING specifies a search condition for a group or an aggregate function used in SELECT statement.
Number one difference for me: if HAVING was removed from the SQL language then life would go on more or less as before. Certainly, a minority queries would need to be rewritten using a derived table, CTE, etc but they would arguably be easier to understand and maintain as a result. Maybe vendors’ optimizer code would need to be rewritten to account for this, again an opportunity for improvement within the industry.
Now consider for a moment removing WHERE from the language. This time the majority of queries in existence would need to be rewritten without an obvious alternative construct. Coders would have to get creative e.g. inner join to a table known to contain exactly one row (e.g. DUAL in Oracle) using the ON clause to simulate the prior WHERE clause. Such constructions would be contrived; it would be obvious there was something was missing from the language and the situation would be worse as a result.
From the answers here, it seems that many folk don’t realize that a HAVING clause may be used without a GROUP BY clause. In this case, the HAVING clause is applied to the entire table expression and requires that only constants appear in the SELECT clause. Typically the HAVING clause will involve aggregates.
This is more useful than it sounds. For example, consider this query to test whether the name column is unique for all values in T :
Использование предложения HAVING и WHERE в одном запросе (визуальные инструменты для баз данных)
В некоторых экземплярах может понадобиться исключить отдельные строки из групп (с использованием предложения WHERE) до того, как применять условие к группе как к целому (с использованием предложения HAVING).
Предложение HAVING подобно предложению WHERE, но применимо только к целым группам (то есть к строкам в результирующем наборе, представляющим собой группы), тогда как предложение WHERE применимо к отдельным строкам. В запросе могут содержаться оба предложения: WHERE и HAVING. В этом случае:
Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов на панели диаграмм. Группируются только строки, которые удовлетворяют условиям в предложении WHERE.
Затем предложение HAVING применяется к строкам в результирующем наборе. Только строки, которые удовлетворяют условиям HAVING, появляются в результирующем запросе. Можно применить предложение HAVING только к тем столбцам, которые появляются в предложении GROUP BY или агрегатной функции.
Первое условие можно задать с помощью предложения WHERE, которое устраняет всех издателей не из Калифорнии перед тем, как начать вычисление средней цены. Второе условие требует предложения HAVING, так как условие основано на результатах группирования и сводных данных. Конечная инструкция SQL может выглядеть следующим образом:
Можно создать оба предложения HAVING и WHERE на панели критериев. По умолчанию любое заданное условие поиска для столбца становится частью предложения HAVING. Однако можно изменить условие, сделав его предложением WHERE.
Можно создать предложение WHERE и HAVING для одного и того же столбца. Для этого необходимо дважды добавить столбец на панели критериев, затем указать один экземпляр как часть предложения HAVING и другой экземпляр как часть предложения WHERE.
Задание условия WHERE в статистическом запросе
Укажите группы для запроса. Дополнительные сведения см. в статье о группировании строк в результатах запроса.
Если столбец, на котором основывается условие WHERE, находится не на панели критериев, то добавьте его на панель критериев.
В столбце Фильтр укажите условие WHERE. Конструктор запросов и представлений добавляет условие в предложение HAVING инструкции SQL.
В этой точке в запросе инструкции SQL содержится предложение HAVING:
В столбце Группировать выберите Where из списка параметров группировки и сводки. Конструктор запросов и представлений удаляет условие из предложения HAVING инструкции SQL и добавляет его в предложение WHERE.
Инструкция SQL изменяется, теперь она содержит предложение WHERE:
Чем отличается HAVING от WHERE?
Почему данную выборку нельзя переписать с использованием WHERE?
Основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций. Как следствие, предложение WHERE не должно содержать агрегатных функций; не имеет смысла использовать агрегатные функции для определения строк для вычисления агрегатных функций. Предложение HAVING, напротив, всегда содержит агрегатные функции. (Строго говоря, вы можете написать предложение HAVING, не используя агрегаты, но это редко бывает полезно. То же самое условие может работать более эффективно на стадии WHERE.)
WHERE же используется движком на момент выборки, физически не возможно узнать минимальное значение
HAVING же уже работает с агрегирующими функциями, то есть мы сгруппировали, посчитали нужной функцией (минимальное значение в вашем случае), а HAVING уже выдал с условием этого подсчета
Можно и переписать. но в виде извращенного каскада вложенных селектов:
— внутренний будет вываливать сгруппированные StudentId и MIN(Mark)
— внешний будет селектить StudentId с условие where
В чем разница между обладанием и где?
должно быть, я гуглю не так, или у меня есть глупый момент времени.
в чем разница между HAVING и WHERE на SQL SELECT заявление?
EDIT: я отметил ответ Стивена как правильный, поскольку он содержал ключевой бит информации по ссылке:
, когда GROUP BY не используется, HAVING ведет себя как WHERE п.
ситуация, которую я видел WHERE не было GROUP BY и вот где началось мое замешательство. Конечно, пока вы не знаете этого, вы не можете указать это в вопросе.
большое спасибо за все ответы, которые были очень поучительно.
20 ответов:
HAVING задает условие поиска для a группа или агрегатная функция, используемая в инструкции SELECT.
наличие: используется для проверки условий после агрегация происходит.
Где: используется для проверки условий до агрегация происходит.
дает вам таблицу всех городов в МА и количеству адресов в каждом городе.
дает вам таблицу городов в МА с более чем 5-адресов и количество адресов в каждом городе.
разница между WHERE и HAVING предложение:
1.где пункт можно использовать с инструкциями-Select, Insert и Update, где as предложение having может использоваться только с оператором Select.
2.здесь фильтрует строки перед агрегацией (группировкой), где as,С фильтры группы, после выполнения агрегации.
3. агрегатные функции не могут быть использованы в где пункт, если он не находится в подзапросе, содержащемся в предложение having, тогда как агрегатные функции могут использоваться в предложении Having.
Фильтрация Групп:
where предложение используется для фильтрации строк перед агрегацией, где as HAVING предложение используется для фильтрации групп после агрегации
в SQL Server у нас есть много агрегатных функций. примеры
разница номер один для меня: если HAVING был удален из языка SQL, то жизнь будет продолжаться более или менее, как и раньше. Конечно, миноритарные запросы должны быть переписаны с использованием производной таблицы, CTE и т. д., Но они, возможно, будут легче понять и поддерживать в результате. Возможно, код оптимизатора поставщиков нужно будет переписать, чтобы учесть это, снова возможность для улучшения в отрасли.
теперь рассмотрим на мгновение удаление WHERE от языка. На этот раз большинство существующих запросов необходимо будет переписать без очевидной альтернативной конструкции. Кодеры должны были бы получить творческое, например, внутреннее соединение с таблицей, которая, как известно, содержит ровно одну строку (например, DUAL в Oracle) с помощью ON предложение для имитации предыдущего WHERE предложения. Такие конструкции были бы надуманными; было бы очевидно, что в языке чего-то не хватает, и ситуация была бы хуже в целом результат.
из ответов здесь, кажется, что многие люди не понимают, что a HAVING предложение может быть использовано без GROUP BY предложения. В этом случае применяется ко всему табличному выражению и требует, чтобы в SELECT предложения. Как правило, HAVING пункт будет включать инертные материалы.
это более полезно, чем кажется. Например, рассмотрим этот запрос, чтобы проверить, является ли name столбец уникален для всех значений в T :
предложение HAVING было добавлено в SQL, потому что ключевое слово WHERE не могло использоваться с агрегатными функциями.
зацените w3schools ссылке для получения дополнительной информации
. может быть переписан с использованием производной таблицы (и опуская HAVING ) такой:
разница между ними заключается в отношении к предложению GROUP BY:
WHERE comes before GROUP BY; SQL оценивает предложение WHERE перед тем, как он группирует записи.
HAVING приходит после GROUP BY; SQL оценивает наличие после него групп записей.
ссылки
где применяется в качестве ограничения на набор, возвращаемый SQL; он использует встроенный набор oeprations и индексов SQL и поэтому является самым быстрым способом фильтрации результирующих наборов. Всегда используйте там, где это возможно.
наличие необходимо для некоторых агрегатных фильтров. Он фильтрует запрос после того, как sql извлек, собрал и отсортировал результаты. Таким образом, это гораздо медленнее, чем где и следует избегать, за исключением тех ситуаций, которые требуют этого.
SQL Server позволит вам уйти с помощью имея даже тогда, когда где было бы намного быстрее. Не делай этого.
где предложение не работает для агрегатных функций
значит : вы не должны использовать вот так бонус : имя таблицы
вот вместо того, чтобы использовать предложение where, вы должны использовать имеющие..
без использования предложения GROUP BY, предложение HAVING просто работает как предложение WHERE
, когда GROUP BY не используется, WHERE и HAVING положения, по существу, эквивалентны.
разница в/ч WHERE и HAVING статья:
основное различие между WHERE и HAVING предложения WHERE используется для операций со строками и HAVING используется для операций со столбцами.
зачем нам это нужно 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, которое применяется к строкам базы данных
во время работы над проектом, это был мой вопрос. Как указано выше,С проверяет условие для уже найденного результата запроса. Но здесь предназначен для проверки состояния при выполнении запроса.
позвольте мне привести пример, чтобы проиллюстрировать это. Предположим, у вас есть таблица базы данных, как это.
предположим, что следующие строки находятся в таблица:
Теперь мы хотим получить userid s и sum(dailyincome) чей sum(dailyincome)>100
выберите userid, sum (dailyincome) из таблицы пользователей, где sum (dailyincome)>100 GROUP BY userid
Это будет ошибка. Правильный запрос будет:
выберите имя пользователя, сумма(dailyincome) от usertable группы по имени пользователя, имея сумма(dailyincome)>100
В чем разница между обладанием и где?
должно быть, я гуглю неправильно, или у меня глупый момент во времени.
в чем разница между HAVING и WHERE на SQL SELECT заявление?
EDIT: я отметил ответ Стивена как правильный, поскольку он содержал ключевой бит информации по ссылке:
, когда GROUP BY не используется, HAVING ведет себя как WHERE п.
ситуацию я видел WHERE не было GROUP BY и где моя катавасия началась. Конечно, пока вы не знаете этого, вы не можете указать это в вопросе.
большое спасибо за все ответы, которые были очень поучительно.
20 ответов
HAVING задает условие поиска для группа или агрегатная функция, используемая в инструкции SELECT.
наличие: используется для проверки условий после агрегация происходит.
Где: используется для проверки условий до агрегация происходит.
дает вам таблицу всех городов в МА и количеству адресов в каждом городе.
дает вам таблицу городов в МА с более чем 5 адресами и количеством адресов в каждом городе.
разница между WHERE и HAVING предложение:
1. где пункт может использоваться с-Select, Insert и Update операторы, где as имея пункт можно использовать только с инструкцией Select.
2. здесь фильтрует строки перед агрегацией (группировкой), где as,С фильтры группы, после выполнения агрегаций.
3. агрегатные функции нельзя использовать в где пункт, если он не находится в подзапросе, содержащемся в имея пункт, тогда как агрегатные функции могут использоваться в предложении Having.
Фильтрация Групп:
where предложение используется для фильтрации строк перед агрегацией, где as HAVING предложение используется для фильтрации групп после агрегации
в SQL Server у нас есть много агрегатных функций. примеры
разница номер один для меня: если HAVING был удален из языка SQL, тогда жизнь продолжалась бы более или менее, как и раньше. Конечно, запросы меньшинства должны быть переписаны с использованием производной таблицы, CTE и т. д., Но они, возможно, будут легче понять и поддерживать в результате. Возможно, код оптимизатора поставщиков нужно будет переписать, чтобы учесть это, снова возможность для улучшения в отрасли.
Теперь рассмотрим на мгновение удаление WHERE от языка. На этот раз большинство существующих запросов необходимо будет переписать без очевидной альтернативной конструкции. Кодеры должны были бы получить творческое, например, внутреннее соединение с таблицей, содержащей ровно одну строку (например, DUAL в Oracle) с помощью ON предложение для имитации предыдущего WHERE предложения. Такие конструкции были бы надуманными; было бы очевидно, что в языке чего-то не хватает, и ситуация была бы хуже, чем результат.
TL; DR мы можем потерять WHERE.
из ответов здесь, кажется, что многие люди не понимают, что HAVING предложение может использоваться без GROUP BY предложения. В этом случае HAVING предложение применяется ко всему выражению таблицы и требует, чтобы в SELECT предложения. Обычно HAVING пункт будет включать инертные материалы.
это более полезно, чем кажется. Например, рассмотрим этот запрос, чтобы проверить, является ли name столбец уникален для всех значений в T :
предложение HAVING было добавлено в SQL, поскольку ключевое слово WHERE не может использоваться с агрегатными функциями.
зацените w3schools ссылке для получения дополнительной информации
. может быть переписан с использованием производной таблицы (и опуская HAVING ) такой:
разница между ними заключается в отношении к предложению GROUP BY:
WHERE предшествует GROUP BY; SQL оценивает предложение WHERE перед группированием записей.
наличие приходит после GROUP BY; SQL оценивает наличие после него групп записей.