Какую функцию выполняет оператор having sql
Для группировки данных в T-SQL применяются операторы GROUP BY и HAVING , для использования которых применяется следующий формальный синтаксис:
GROUP BY
Оператор GROUP BY определяет, как строки будут группироваться.
Например, сгруппируем товары по производителю
Первый столбец в выражении SELECT — Manufacturer представляет название группы, а второй столбец — ModelsCount представляет результат функции Count, которая вычисляет количество строк в группе.

Стоит учитывать, что любой столбец, который используется в выражении SELECT (не считая столбцов, которые хранят результат агрегатных функций), должны быть указаны после оператора GROUP BY. Так, например, в случае выше столбец Manufacturer указан и в выражении SELECT, и в выражении GROUP BY.
И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:
Другой пример, добавим группировку по количеству товаров:
Оператор GROUP BY может выполнять группировку по множеству столбцов.
Если столбец, по которому производится группировка, содержит значение NULL, то строки со значением NULL составят отдельную группу.
Следует учитывать, что выражение GROUP BY должно идти после выражения WHERE , но до выражения ORDER BY :

Фильтрация групп. HAVING
Оператор HAVING определяет, какие группы будут включены в выходной результат, то есть выполняет фильтрацию групп.
Применение HAVING во многом аналогично применению WHERE. Только есть WHERE применяется к фильтрации строк, то HAVING используется для фильтрации групп.
Например, найдем все группы товаров по производителям, для которых определено более 1 модели:

При этом в одной команде мы можем использовать выражения WHERE и HAVING:
То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары группируются по производителям. И далее фильтруются сами группы — выбираются те группы, которые содержат больше 1 модели.
Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:
В данном случае группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models) и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.
Coding Bootcamp: Advanced queries
A HAVING clause specifies that an SQL SELECT statement should only return rows where aggregate values meet the specified conditions.
It was added to the SQL language because the WHERE keyword could not be used with aggregate functions
Remember, WHERE for conditions before grouping, HAVING for conditions after grouping.
SQL HAVING clause example
SQL LIKE Operator & Wildcards
The LIKE operator is used to search for a specified pattern in a column.
Wildcard characters are used with the SQL LIKE operator.
We will need the following:
- % A substitute for zero or more characters
- _ A substitute for a single character
Examples
SQL ROUND function
The ROUND() function is used to round a numeric field to the number of decimals specified.
SQL SELECT TOP Clause
The SELECT TOP clause is used to specify the number of records to return.
SQL SELECT TOP Equivalent in MySQL
SQL ISNULL Function
Replaces NULL with the specified replacement value.
SQL ISNULL Examples
SQL Variables
Object that holds a single data value of a specified type
- Holds data for later use
- Counters
- As inputs or outputs to stored procedures, functions
SQL Variables examples
SQL Variables Assigning Values
Used to set a value to a scalar (not table) variable.
Syntax:
SQL Variables Assigning Values
SELECT
- Used to set a value to a scalar variable
- Can be also used for setting values to multiple variables at once
SET vs SELECT for setting values to variables
- SET is the ANSI standard for variable assignment, SELECT is not
- SET can only assign one variable at a time, SELECT can make multiple assignments at once
- If assigning from a query, SET can only assign a scalar value. If the query returns multiple values/rows then SET will raise an error. SELECT will assign one of the values to the variable and hide the fact that multiple values were returned
- When assigning from a query if there is no value returned then SET will assign NULL, where SELECT will not make the assignment at all (so the variable will not be changed from its previous value)
- As far as speed differences — there are no direct differences between SET and SELECT. However SELECT’s ability to make multiple assignments in one shot does give it a slight speed advantage over SET.
Temporary tables
Can be used as a workspace for intermediate results.
- Local temporary tables (starting with #)
- Global temporary tables (starting with ##)
- Table variables (starting with @)
- Other (not in our lesson’s scope)
TABLE Variables
- Used in the scope of the routine or batch within they are defined
- Cause less recompiles
- Not affected by rollbacks
Temporary tables
- Support every single feature a database table can feature
- Can be altered after creation
- Can have multiple indexes
- Can be used with Dynamic SQL
- Can be local (#) or global (##)
Remember, we may have to drop it manually!
SELECT INTO
We can take the results of a query and insert them into a NEW temporary table.
The result set must have uniquely named columns that will be the new temporary table’s columns.
SQL IN Operator
The IN operator allows you to specify multiple values in a WHERE clause.
SQL IN Operator example
Subqueries
Queries embedded in queries.
Better example why to use a subquery:
VIEWS
A view is a virtual table. A view is nothing more than a SQL statement that is stored in the database
with an associated name. A view is actually a composition of a table in the form of a predefined SQL query.
Оператор SQL HAVING — интересующие значения агрегатных функций
Оператор SQL HAVING наиболее часто применяется вместе с оператором GROUP BY для получения данных из таблицы базы, соответствующих определённым значениям результатов, возвращаемых агрегатными функциями. В случае такого применения HAVING результатом будут строки, соответствующие всем группам, в которых выполняется условие сравнения со значением агрегатной функции.
Оператор SQL HAVING и сравнение с заданным числом
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке .
В первых примерах работаем с базой данных «Портал объявлений — 1». Скрипт для создания этой базы данных, её таблицы и заполения таблицы данных — в файле по этой ссылке.
В этой базе данных есть таблица Ads, содержащая данные об объявлениях, поданных за неделю. Столбец Category содержит данные о больших категориях объявлений (например, Недвижимость), а столбец Parts — о более мелких частях, входящих в категории (например, части Квартиры и Дачи являются частями категории Недвижимость). Столбец Units содержит данные о количестве поданных объявлений, а столбец Money — о денежных суммах, вырученных за подачу объявлений.
| Category | Part | Units | Money |
| Транспорт | Автомашины | 110 | 17600 |
| Недвижимость | Квартиры | 89 | 18690 |
| Недвижимость | Дачи | 57 | 11970 |
| Транспорт | Мотоциклы | 131 | 20960 |
| Стройматериалы | Доски | 68 | 7140 |
| Электротехника | Телевизоры | 127 | 8255 |
| Электротехника | Холодильники | 137 | 8905 |
| Стройматериалы | Регипс | 112 | 11760 |
| Досуг | Книги | 96 | 6240 |
| Недвижимость | Дома | 47 | 9870 |
| Досуг | Музыка | 117 | 7605 |
| Досуг | Игры | 41 | 2665 |
Пример 1. Используя операторы SQL HAVING и GROUP BY, определить категории, в которых за подачу объявлений выручено более 20000. Пишем следующий запрос:
Результатом выполнения запроса будет следующая таблица:
| Category | Money |
| Недвижимость | 40530 |
| Транспорт | 38560 |
Пример 2. База данных и таблица — те же, что и в примере 1.
Используя операторы SQL HAVING и GROUP BY, требуется вывести категории, в какой-либо части которых минимальное количество поданных объявлений не превышает 100. Для этого пишем следующий запрос:
Результатом будет следующая таблица:
| Category | Part |
| Досуг | Книги |
| Досуг | Музыка |
| Досуг | Игры |
| Недвижимость | Квартиры |
| Недвижимость | Дачи |
| Недвижимость | Дома |
Примеры запросов к базе данных «Портал объявлений-1» есть также в уроках об операторах INSERT, UPDATE, DELETE и UNION.
Написать запросы с оператором SQL HAVING самостоятельно, а затем посмотреть решения
Самостоятельно поработайте с таблицей Staff (штатные сотрудники) базы данных фирмы. В ней есть столбцы Name (фамилия), Dept (номер отдела), Years (длительность трудового стажа) и Salary (размер заработной платы). Примеры для самостоятельного решения со ссылками для проверки решения — после таблицы.
| Name | Dept | Years | Salary |
| Sanders | 20 | 7 | 18357.5 |
| Junkers | 15 | 6 | 16232.8 |
| Moonlight | 15 | 8 | 21500.6 |
| Pernal | 20 | 8 | 18171.2 |
| Aisen | 15 | 7 | 19540.7 |
| McGregor | 15 | 7 | 15790.8 |
| Marenghi | 38 | 5 | 17506.8 |
| Doctor | 20 | 5 | 12322.4 |
| Factor | 38 | 8 | 16228.7 |
Пример 4. Определить номера отделов, в которых средний размер заработной платы больше 18000.
Пример 5. Определить номера отделов, в которых средний трудовой стаж сотрудников больше 6.5 лет.
Пример 6. Определить номера отделов, в которых число сотрудников меньше 3.
Оператор SQL HAVING и сравнение со значением, возвращаемым квантором ALL или ANY (SOME)
Пример 7. Есть база данных «Театр». В ней есть таблица Play, содержащая данные о постановках в театре. В этой таблице есть поля PlayID (идентификатор), Name (название), Genre (жанр), Author (автор), Dir_ID (внешний ключ — идентификатор режиссёра), PremiereDate (дата премьеры), LastDate (дата окончания). Требуется определить самый популярный жанр театра, то есть жанр, в котором поставлено наибольшее количество постановок.
Используя операторы SQL HAVING и GROUP BY, пишем первую часть запроса к таблице Play, которая задаёт сравнение числа строк, сгруппированных по жанру:
Теперь нужно определить, с чем сравнивать. Это максимальное число записей в той же таблице, сгруппированных по жанру. Поэтом нам понадобиться квантор ALL. Пишем вторую часть запроса:
Весь запрос для определения самого популярного жанра в театре будет следующим:
Оператор SQL HAVING в соединениях таблиц
Пример 8. Продолжаем работать с базой данных «Театр». Нам понадобятся таблицы Play, содержащая данные о постановках в театре и Team, содержащая данные о ролях актёров. Требуется вывести список моноспектаклей (спектаклей с одним актёром). Ниже приведена схема базы данных «Театр» (для увеличения рисунка нажать на него левой кнопкой мыши).

Если ещё точнее, нам нужно выбрать спектакли, в которых лишь одна роль. Среди полей в таблице Team есть PlayID — внешний ключ, ссылающийся на таблицу Play. В каждой записи таблицы Team этот внешний ключ определяет постановку, в которой исполняется данная роль. Если мы соединим таблицы Play и Team по ключу PlayID, то мы сможем определить количество ролей в постановках. Так как мы соединяем две таблицы, а не больше, то для простоты можем использовать соединение без оператора JOIN, перечисляя таблицы через запятую, а для обозначения условия соединения используя слово WHERE.
C оператором HAVING используем агрегатную функцию COUNT — для подсчёта числа ролей в каждой постановке. Весь запрос для определения спектаклей с одной ролью, а следовательно, с одним актёром будет следующим:
Написать запросы с оператором SQL HAVING самостоятельно, а затем посмотреть решения
Пример 9. Продолжаем работать с базой данных «Театр». Вывести список актеров, которые в одном спектакле играют более одной роли, и количество их ролей.
Использовать оператор JOIN. Естественно, использовать HAVING, GROUP BY.
Пример 10. Вывести спектакли, в которых средний возраст актеров от 20 до 30 (использовать BETWEEN, Group by, Having, AVG, перекрестное соединение таблиц (CROSS JOIN), удобнее без слова JOIN, а с перечислением таблиц через запятую).
Оператор HAVING в SQL
Оператор HAVING в SQL используется, когда нужно отфильтровать данные на основе агрегатных функций, таких как MIN() и MAX(), SUM() и AVG() и COUNT().
Здесь мы подсчитываем количество клиентов (customer_id), группируя их по странам (country), а затем возвращаем результат, если на страну имеется больше 1 клиента.

Примечание: Оператор HAVING добавили из-за того, что оператор WHERE не поддерживает агрегатные функции. Кроме того, перед оператором HAVING необходимо использовать GROUP BY.
HAVING против WHERE в SQL
| Оператор HAVING | Оператор WHERE |
| Проверяет условие для группы строк. | Проверяет условие для каждой строки отдельно. |
| Используется с агрегатными функциями. | Нельзя использовать с агрегатными функциями. |
| Выполняется после оператора GROUP BY. | Выполняется перед оператором GROUP BY. |
Давайте рассмотрим пример. Если мы хотим выбрать все заказы, сумма (amount) которых меньше 500, мы можем сделать следующее: