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 серебряных знаков 118 118 бронзовых знаков
с таким успехом мы можем всю документацию переписать на 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 придётся писать то же выражение ещё раз.
Используйте предложения 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 в агрегатном запросе
- Укажите группы для запроса. Дополнительные сведения см. в разделе Группирование строк в результатах запроса (визуальные инструменты для баз данных).
- Если он еще не находится в области условий , добавьте столбец, на котором вы хотите создать WHERE условие.
- Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.
- В столбце «Фильтр« укажите 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?
Почему данную выборку нельзя переписать с использованием WHERE?
SELECT StudentId FROM EXAM_RESULT GROUP BY StudentID HAVING MIN(Mark) = 5
- Вопрос задан более трёх лет назад
- 21319 просмотров
Комментировать
Решения вопроса 3
Сергей Горностаев @sergey-gornostaev Куратор тега SQL
Седой и строгий
Основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций. Как следствие, предложение WHERE не должно содержать агрегатных функций; не имеет смысла использовать агрегатные функции для определения строк для вычисления агрегатных функций. Предложение HAVING, напротив, всегда содержит агрегатные функции. (Строго говоря, вы можете написать предложение HAVING, не используя агрегаты, но это редко бывает полезно. То же самое условие может работать более эффективно на стадии WHERE.)
Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать
maksfedorov.ru
Чтобы понять, что у студента Mark=5 — минимальный, нужно сгруппировать значения, вдруг не минимальный (помимо проверки — есть он или нет).
То есть чтобы полностью ваше условие проверить, нужно точно группировать, WHERE просто проверит — есть такое значение или нет и выведет студентов, у которых есть
WHERE же используется движком на момент выборки, физически не возможно узнать минимальное значение
HAVING же уже работает с агрегирующими функциями, то есть мы сгруппировали, посчитали нужной функцией (минимальное значение в вашем случае), а HAVING уже выдал с условием этого подсчета
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Готовые решения — не подаю, но.
Можно и переписать. но в виде извращенного каскада вложенных селектов:
— внутренний будет вываливать сгруппированные StudentId и MIN(Mark)
— внешний будет селектить StudentId с условие where
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- SQL
Как правильно решить задачу?
- нет подписчиков
- вчера
- 77 просмотров
- PHP
- +2 ещё
Как правильно задать запрос UPDATE где название столбца переменная?
- 2 подписчика
- вчера
- 230 просмотров