Используйте предложения 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 в sql
Как большинство других серверов реляционных баз данных, PostgreSQL поддерживает агрегатные функции. Агрегатная функция вычисляет единственное значение, обрабатывая множество строк. Например, есть агрегатные функции, вычисляющие: count (количество), sum (сумму), avg (среднее), max (максимум) и min (минимум) для набора строк.
К примеру, мы можем найти самую высокую из всех минимальных дневных температур:
SELECT max(temp_lo) FROM weather;
max ----- 46 (1 row)
Если мы хотим узнать, в каком городе (или городах) наблюдалась эта температура, можно попробовать:
SELECT city FROM weather WHERE temp_lo = max(temp_lo); НЕВЕРНО
но это не будет работать, так как агрегатную функцию max нельзя использовать в предложении WHERE . (Это ограничение объясняется тем, что предложение WHERE должно определить, для каких строк вычислять агрегатную функцию, так что оно, очевидно, должно вычисляться до агрегатных функций.) Однако как часто бывает, запрос можно перезапустить и получить желаемый результат, применив подзапрос:
SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
city --------------- San Francisco (1 row)
Теперь всё в порядке — подзапрос выполняется отдельно и результат агрегатной функции вычисляется вне зависимости от того, что происходит во внешнем запросе.
Агрегатные функции также очень полезны в сочетании с предложением GROUP BY . Например, мы можем получить максимум минимальной дневной температуры в разрезе городов:
SELECT city, max(temp_lo) FROM weather GROUP BY city;
city | max ---------------+----- Hayward | 37 San Francisco | 46 (2 rows)
Здесь мы получаем по одной строке для каждого города. Каждый агрегатный результат вычисляется по строкам таблицы, соответствующим отдельному городу. Мы можем отфильтровать сгруппированные строки с помощью предложения HAVING :
SELECT city, max(temp_lo) FROM weather GROUP BY city HAVING max(temp_lo) < 40;
city | max ---------+----- Hayward | 37 (1 row)
Мы получаем те же результаты, но только для тех городов, где все значения temp_lo меньше 40. Наконец, если нас интересуют только города, названия которых начинаются с « S » , мы можем сделать:
SELECT city, max(temp_lo) FROM weather WHERE city LIKE 'S%' (1) GROUP BY city HAVING max(temp_lo) < 40;
Важно понимать, как соотносятся агрегатные функции и SQL -предложения WHERE и HAVING . Основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций. Как следствие, предложение WHERE не должно содержать агрегатных функций; не имеет смысла использовать агрегатные функции для определения строк для вычисления агрегатных функций. Предложение HAVING , напротив, всегда содержит агрегатные функции. (Строго говоря, вы можете написать предложение HAVING , не используя агрегаты, но это редко бывает полезно. То же самое условие может работать более эффективно на стадии WHERE .)
В предыдущем примере мы смогли применить фильтр по названию города в предложении WHERE , так как названия не нужно агрегировать. Такой фильтр эффективнее, чем дополнительное ограничение HAVING , потому что с ним не приходится группировать и вычислять агрегаты для всех строк, не удовлетворяющих условию WHERE .
| Пред. | Наверх | След. |
| 2.6. Соединения таблиц | Начало | 2.8. Изменение данных |
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,287 11 11 золотых знаков 58 58 серебряных знаков 116 116 бронзовых знаков
с таким успехом мы можем всю документацию переписать на 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 придётся писать то же выражение ещё раз.
