HAVING (Transact-SQL) — SQL Server
- Чтение занимает 2 мин
В этой статье
Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Параллельное хранилище данных
Определяет условие поиска для группы или статистического выражения. Предложение HAVING можно использовать только в инструкции SELECT. HAVING обычно используется с предложением GROUP BY. Если предложение GROUP BY не используется, имеется одна неявная агрегированная группа.
Синтаксические обозначения в Transact-SQL
Синтаксис
[ HAVING <search condition> ]
Аргументы
<search_condition> задает один предикат или несколько, которые должны выполняться для групп или агрегатов. Дополнительные сведения об условиях поиска и предикатах см. в статье Условие поиска (Transact-SQL).
Типы данных text, image и ntext нельзя использовать в предложении HAVING.
Примеры
В следующем примере, который использует простое предложение HAVING
, из таблицы SalesOrderID
извлекается сумма всех полей SalesOrderDetail
, значение которых превышает $100000.00
.
USE AdventureWorks2012 ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
HAVING SUM(LineTotal) > 100000.00
ORDER BY SalesOrderID ;
Примеры: Azure Synapse Analytics и Параллельное хранилище данных
В приведенном ниже примере предложение HAVING
используется с целью получения общей суммы SalesAmount
, превышающей 80000
для каждого OrderDateKey
из таблицы FactInternetSales
.
-- Uses AdventureWorks
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING SUM(SalesAmount) > 80000
ORDER BY OrderDateKey;
См. также:
GROUP BY (Transact-SQL)
WHERE (Transact-SQL)
SQL HAVING — интересующие значения агрегатных функций
SELECT ИМЕНА_СТОЛБЦОВ FROM ИМЯ_ТАБЛИЦЫ GROUP BY ИМЯ_СТОЛБЦА HAVING АГРЕГАТНАЯ_ФУНКЦИЯ(ИМЯ СТОЛБЦА) ОПЕРАТОР_СРАВНЕНИЯ ЗАДАННОЕ ЧИСЛО
Следует особо заметить, что оператор HAVING всегда находится в запросе после оператора GROUP BY.
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.
В первых примерах работаем с базой данных «Портал объявлений — 1». Скрипт для создания этой базы данных, её таблицы и заполения таблицы данных — в файле по этой ссылке.
В этой базе данных есть таблица Ads, содержащая данные об объявлениях, поданных за неделю. Столбец Category содержит данные о больших категориях объявлений (например, Недвижимость), а столбец Parts — о более мелких частях, входящих в категории (например, части Квартиры и Дачи являются частями категории Недвижимость). Столбец Units содержит данные о количестве поданных объявлений, а столбец Money — о денежных суммах, вырученных за подачу объявлений.
Пример 1. Используя операторы SQL HAVING и GROUP BY, определить категории, в которых за подачу объявлений выручено более 20000. Пишем следующий запрос:
SELECT Category, SUM(Money) AS Money FROM Ads GROUP BY Category HAVING SUM(Money)>20000
Результатом выполнения запроса будет следующая таблица:
Category | Money |
Недвижимость | 40530 |
Транспорт | 38560 |
Пример 2. База данных и таблица — те же, что и в примере 1.
Используя операторы SQL HAVING и GROUP BY, требуется вывести категории, в какой-либо части которых минимальное количество поданных объявлений не превышает 100. Для этого пишем следующий запрос:
SELECT Category, Units, MIN(Units) AS Minimum FROM Ads GROUP BY Category HAVING MIN(Units)Результатом будет следующая таблица:
Category | Part | Minimum |
Досуг | Игры | 41 |
Недвижимость | Дома | 47 |
Стройматериалы | 68 |
Пример 3. База данных и таблица — те же, что и в предыдущих примерах.
Используя операторы SQL HAVING и GROUP BY, требуется вывести категории объявлений, в которых более двух частей. Пишем следующий запрос:
SELECT Category, Part FROM Ads GROUP BY Category HAVING COUNT(*)>2
Результатом будет следующая таблица:
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 | |
Factor | 38 | 8 | 16228.7 |
Оператор SQL HAVING можно использовать для выборки данных, соответствующим результатам сравнения не только с заданным числом, но и со значением, возвращаемым квантором ALL или ANY (SOME). Квантор ALL возвращает из запроса, к которому он применяется, максимальное значение и тогда при помощи оператора HAVING происходит сравнение с максимальным значением. Например, ALL(10, 15, 20) вернёт 20. Квантор ANY (и его аналог SOME) возвращает минимальное значение и тогда при помощи оператора HAVING происходит сравнение с минимальным значением. Синтаксис запроса с оператором SQL HAVING, определяющий сравнение со значением, возвращаемым квантором ALL или ANY (SOME) выглядит следующим образом:.
SELECT ИМЕНА_СТОЛБЦОВ FROM ИМЯ_ТАБЛИЦЫ GROUP BY ИМЯ_СТОЛБЦА HAVING АГРЕГАТНАЯ_ФУНКЦИЯ(ИМЯ СТОЛБЦА) ОПЕРАТОР_СРАВНЕНИЯ КВАНТОР (SELECT АГРЕГАТНАЯ_ФУНКЦИЯ(ИМЯ СТОЛБЦА) FROM ИМЯ_ТАБЛИЦЫ GROUP BY ИМЯ_СТОЛБЦА)
Пример 7. Есть база данных «Театр». В ней есть таблица Play, содержащая данные о постановках в театре. В этой таблице есть поля PlayID (идентификатор), Name (название), Genre (жанр), Author (автор), Dir_ID (внешний ключ — идентификатор режиссёра), PremiereDate (дата премьеры), LastDate (дата окончания). Требуется определить самый популярный жанр театра, то есть жанр, в котором поставлено наибольшее количество постановок.
Используя операторы SQL HAVING и GROUP BY, пишем первую часть запроса к таблице Play, которая задаёт сравнение числа строк, сгруппированных по жанру:
SELECT Genre FROM Play GROUP BY Genre HAVING COUNT(*) >=
Теперь нужно определить, с чем сравнивать. Это максимальное число записей в той же таблице, сгруппированных по жанру. Поэтом нам понадобиться квантор ALL. Пишем вторую часть запроса:
ALL(SELECT COUNT(*) FROM PLAY GROUP BY Genre)
Весь запрос для определения самого популярного жанра в театре будет следующим:
SELECT Genre FROM Play GROUP BY Genre HAVING COUNT(*) >= ALL(SELECT COUNT(*) FROM PLAY GROUP BY Genre)
Вернёмся к запросам с оператором SQL HAVING, в которых сравнение проводится с заданным числом, как в первом параграфе. Но усложним задачу. На практике часто число строк в результате запроса определяется внешним ключом, ссылающимся на другую таблицу..
Пример 8. Продолжаем работать с базой данных «Театр». Нам понадобятся таблицы Play, содержащая данные о постановках в театре и Team, содержащая данные о ролях актёров. Требуется вывести список моноспектаклей (спектаклей с одним актёром). Ниже приведена схема базы данных «Театр» (для увеличения рисунка нажать на него левой кнопкой мыши).
Если ещё точнее, нам нужно выбрать спектакли, в которых лишь одна роль. Среди полей в таблице Team есть PlayID — внешний ключ, ссылающийся на таблицу Play. В каждой записи таблицы Team этот внешний ключ определяет постановку, в которой исполняется данная роль. Если мы соединим таблицы Play и Team по ключу PlayID, то мы сможем определить количество ролей в постановках. Так как мы соединяем две таблицы, а не больше, то для простоты можем использовать соединение без оператора JOIN, перечисляя таблицы через запятую, а для обозначения условия соединения используя слово WHERE.
C оператором HAVING используем агрегатную функцию COUNT — для подсчёта числа ролей в каждой постановке. Весь запрос для определения спектаклей с одной ролью, а следовательно, с одним актёром будет следующим:
SELECT Play.Name AS pname FROM Play, Team WHERE Team.PLAY_ID = Play.Play_ID GROUP BY Play.Name HAVING COUNT(Team.PLAY_ID) = 1 ORDER BY Play.Name
Написать запросы с оператором SQL HAVING самостоятельно, а затем посмотреть решения
Пример 9. Продолжаем работать с базой данных «Театр». Вывести список актеров, которые в одном спектакле играют более одной роли, и количество их ролей.
Использовать оператор JOIN. Естественно, использовать HAVING, GROUP BY.
Правильное решение и ответ.
Поделиться с друзьями
Реляционные базы данных и язык SQL
MS SQL Server и T-SQL
Операторы GROUP BY и HAVING
Последнее обновление: 19.07.2017
Для группировки данных в T-SQL применяются операторы GROUP BY и HAVING, для использования которых применяется следующий формальный синтаксис:
SELECT столбцы FROM таблица [WHERE условие_фильтрации_строк] [GROUP BY столбцы_для_группировки] [HAVING условие_фильтрации_групп] [ORDER BY столбцы_для_сортировки]
GROUP BY
Оператор GROUP BY определяет, как строки будут группироваться.
Например, сгруппируем товары по производителю
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer
Первый столбец в выражении SELECT — Manufacturer представляет название группы, а второй столбец — ModelsCount представляет результат функции Count, которая вычисляет количество строк в группе.
Стоит учитывать, что любой столбец, который используется в выражении SELECT (не считая столбцов, которые хранят результат агрегатных функций), должны быть указаны после оператора GROUP BY. Так, например, в случае выше столбец Manufacturer указан и в выражении SELECT, и в выражении GROUP BY.
И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products
Другой пример, добавим группировку по количеству товаров:
SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer, ProductCount
Оператор GROUP BY
может выполнять группировку по множеству столбцов.
Если столбец, по которому производится группировка, содержит значение NULL, то строки со значением NULL составят отдельную группу.
Следует учитывать, что выражение GROUP BY
должно идти после выражения WHERE
, но до выражения
ORDER BY
:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products WHERE Price > 30000 GROUP BY Manufacturer ORDER BY ModelsCount DESC
Фильтрация групп. HAVING
Оператор HAVING определяет, какие группы будут включены в выходной результат, то есть выполняет фильтрацию групп.
Применение HAVING во многом аналогично применению WHERE. Только есть WHERE применяется к фильтрации строк, то HAVING используется для фильтрации групп.
Например, найдем все группы товаров по производителям, для которых определено более 1 модели:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer HAVING COUNT(*) > 1
При этом в одной команде мы можем использовать выражения WHERE и HAVING:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING COUNT(*) > 1
То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары группируются по производителям. И далее фильтруются сами группы — выбираются те группы, которые содержат больше 1 модели.
Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:
SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Units DESC
В данном случае группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models) и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.
Команда SELECT Раздел Раздел HAVING — Условия поиска на группу строк — HAVING COUNT и HAVING MIN
Раздел HAVING
Наконец, последним при вычислении табличного выражения используется раздел HAVING (если он присутствует).
Раздел HAVING может осмысленно появиться в табличном выражении только в том случае, когда в нем присутствует раздел GROUP BY. Условие поиска этого раздела задает условие на группу строк сгруппированной таблицы. Формально раздел HAVING может присутствовать и в табличном выражении, не содержащем GROUP BY. В этом случае полагается, что результат вычисления предыдущих разделов представляет собой сгруппированную таблицу, состоящую из одной группы без выделенных столбцов группирования.
Условие поиска раздела HAVING строится по тем же синтаксическим правилам, что и условие поиска раздела WHERE, и может включать те же самые предикаты. Однако имеются специальные синтаксические ограничения по части использования в условии поиска спецификаций столбцов таблиц из раздела FROM данного табличного выражения. Эти ограничения следуют из того, что условие поиска раздела HAVING задает условие на целую группу, а не на индивидуальные строки.
Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.
Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.
HAVING COUNT
Выбрать коды товаров, покупаемых более чем одним покупателем:
SELECT stock FROM ordsale GROUP BY stock HAVING COUNT(*) > 1;
HAVING MIN
Получить значения минимального и максимального оклада для клерков каждого отдела, где самое низкое жалованье составляет менее $1,000:
SELECT deptno, MIN(sal), MAX(sal) FROM emp WHERE job = ‘CLERK’ GROUP BY deptno HAVING MIN(sal)
Руководство по SQL. Элемент HAVING. – PROSELYTE
Для того, чтобы определить условия, по которым записи будут отфильтрованы после выполнения запроса используется ключевое слово HAVING.
Запрос и использованием данного элемента имеет следующий вид:
SELECT колонка1, колонка2
FROM таблица1, таблица2
WHERE [ условия ]
GROUP BY колонка1, колонка2
HAVING [ условия ]
ORDER BY колонка1, колонка2
Пример:
Предположим, что у нас есть таблица developers, которая содержит следующие данные:
+----+-------------------+-----------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | C++ | 3 | 2500 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
| 7 | Ivan Ivanov | C# | 1 | 900 |
| 8 | Ludmila Geiko | UI/UX | 2 | 1800 |
+----+-------------------+-----------+------------+--------+
Теперь попробуем выполнить следующий запрос:
mysql> SELECT ID, NAME, SPECIALTY, SALARY
FROM developers
GROUP BY SPECIALTY
HAVING COUNT(SPECIALTY) >= 2;
В результате выполнения данного запроса мы получим следующую таблицу:
+----+-------------------+-----------+--------+
| ID | NAME | SPECIALTY | SALARY |
+----+-------------------+-----------+--------+
| 4 | Konstantin Geiko | C# | 2000 |
| 1 | Eugene Suleimanov | Java | 2500 |
| 5 | Asya Suleimanova | UI/UX | 1800 |
+----+-------------------+-----------+--------+
На этом мы заканчиваем изучение элемента HAVING.
В следующей статье мы рассмотрим транзакции.
Использование условия Having SQL для фильтрации и группировки результатов: примеры и синтаксис
От автора: HAVING SQL позволяет указать условия в соответствии с которыми результаты будут фильтроваться и разбиваться на группы для отображения. WHERE устанавливает условия для выбранных столбцов, тогда как HAVING устанавливает условия для групп, созданных в условии GROUP BY.
Синтаксис
В следующем блоке кода показано использование условия HAVING в запросе.
SELECT FROM WHERE GROUP BY HAVING ORDER BY
SELECT FROM WHERE GROUP BY HAVING ORDER BY |
Условие HAVING должно указываться в запросе после условия GROUP BY и перед условием ORDER BY, если оно используется. В следующем блоке кода показан синтаксис запроса SELECT, включающего условие HAVING:
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!SELECT column1, column2 FROM table1, table2 WHERE [ conditions ] GROUP BY column1, column2 HAVING [ conditions ] ORDER BY column1, column2
SELECT column1, column2 FROM table1, table2 WHERE [ conditions ] GROUP BY column1, column2 HAVING [ conditions ] ORDER BY column1, column2 |
Пример
Рассмотрим таблицу CUSTOMERS, содержащую следующие записи.
Ниже приведен пример, в котором будут отображаться записи с возрастом соответствующим условию больше или равно 2.
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM CUSTOMERS GROUP BY age HAVING COUNT(age) >= 2;
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM CUSTOMERS GROUP BY age HAVING COUNT(age) >= 2; |
В результате мы получим следующее:
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!Хотите изучить MySQL?
Посмотрите курс по базе данных MySQL!
СмотретьПредложение SQL HAVING. Язык запросов SQL
Язык запросов SQL. DML.
Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальные суммы приобретений, значения которых выше 90000. Вы не сможете использовать агрегатную функцию в предложении WHERE (если вы не используете подзапрос, описанный ниже), потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. Это означает, что вы не сможете сделать что-нибудь подобно следующему:
SELECT BNum, MAX(SSum) FROM Sells WHERE MAX(SSum)>90000 GROUP BY BNum
Это будет отклонением от правил SQL. Чтобы увидеть максимальную стоимость приобретений свыше 90000, вы можете использовать предложение HAVING. Предложение HAVING определяет критерии, используемые для удаления определенных групп из вывода после группировки точно также, как предложение WHERE делает это для индивидуальных строк. Правильной командой будет следующая:
SELECT BNum, MAX(SSum) FROM Sells GROUP BY BNum HAVING MAX(SSum)>90000
Bnum | MAX OF SSum |
2 | 192000 |
1 | 100000 |
Аргументы в предложении HAVING следуют тем же самым правилам, что и в предложении SELECT, состоящем из команд, использующих GROUP BY, но они должны иметь одно значение на группу вывода. Следующая команда будет запрещена:
SELECT BNum, SDate, MAX(SSum) FROM Sells GROUP BY BNum, SDate HAVING SDate="17.02.01"
Поле SDate не может быть вызвано предложением HAVING, потому что оно может иметь больше чем одно значение на группу вывода. Чтобы избежать такой ситуации, предложение HAVING должно ссылаться только на агрегаты или все множество полей выбранных GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос:
SELECT BNum, MAX(SSum) FROM Sells WHERE SDate="17.02.01" GROUP BY BNum
SQL ИМЕЕТ | МАКС — Завод
ГРУППА SQL ПО ОБЪЯСНЕНИЮ
HAVING похож на WHERE, но работает с сгруппированными записями.
HAVING требует наличия предложения GROUP BY.
Будет возвращеногрупп, соответствующих критериям HAVING.
WHERE и HAVING могут использоваться в одном запросе.
HAVING используются с агрегатами: COUNT, SUM и т. Д.
Задача: Перечислите все страны с более чем 2 поставщиками.
скопировано в буфер обмена
ВЫБРАТЬ страну, COUNT (Id) AS Count ОТ поставщика ГРУППА ПО СТРАНАМ ИМЕЕТ СЧЕТ (Id)> 2
ВЫБРАТЬ страну, COUNT (Id) AS Count
ОТ поставщика
ГРУППА ПО СТРАНАМ
ИМЕЕТ СЧЕТ (Id)> 2
Попробуйте вживую HAVING синтаксис.
ВЫБЕРИТЕ имена столбцов ОТ имя-таблицы ГДЕ условие ГРУППА ПО именам столбцов ИМЕЮЩИЕ условие
HAVING синтаксис с ORDER BY.
ВЫБЕРИТЕ имена столбцов ОТ имя-таблицы ГДЕ условие ГРУППА ПО именам столбцов ИМЕЮЩИЕ условие ЗАКАЗАТЬ ПО именам столбцов
SQL ИМЕЕТ СЧЁТ
КЛИЕНТ |
---|
Идентификатор |
Имя |
Фамилия |
Город |
Страна |
Телефон |
Задача: Укажите количество клиентов в каждой стране.
Включите только страны с более чем 10 клиентами.
скопировано в буфер обмена
ВЫБРАТЬ страну, COUNT (Id) AS Count ОТ Заказчика ГРУППА ПО СТРАНАМ ИМЕЕТ СЧЕТ (Id)> 10
ВЫБРАТЬ страну, COUNT (Id) AS Count
ОТ Заказчика
ГРУППА ПО СТРАНАМ
ИМЕЕТ COUNT (Id)> 10
Попробуйте вживую Результат: 3 записи
Страна | Счетчик |
---|---|
Франция | 11 |
Германия | 11 |
США | 13 |
КЛИЕНТ |
---|
Идентификатор |
Имя |
Фамилия |
Город |
Страна |
Телефон |
Задача: Укажите количество клиентов в каждой стране, кроме США, отсортированных по убыванию.Включите только страны с 9 или более клиентами.
скопировано в буфер обмена
ВЫБРАТЬ страну, COUNT (Id) AS Count ОТ Заказчика ГДЕ Страна <> 'США' ГРУППА ПО СТРАНАМ HAVING COUNT (Id)> = 9 ORDER BY COUNT (Id) DESC
ВЫБРАТЬ страну, COUNT (Id) AS Count
ОТ Заказчика
ГДЕ Страна <> 'США'
ГРУППА ПО СТРАНАМ
HAVING COUNT (Id)> = 9
ORDER BY COUNT (Id) DESC
Попробуйте вживую Результат: 3 записи
Страна | Счетчик |
---|---|
Франция | 11 |
Германия | 11 |
Бразилия | 9 |
ЗАКАЗ |
---|
Id |
OrderDate |
OrderNumber |
CustomerId |
TotalAmount |
CUSTOMER | |
---|---|
Id | |
Город | |
Страна | |
Телефон |
Задача: Перечислите всех клиентов со средним объемом заказов от 1000 до 1200 долларов.
скопировано в буфер обмена
SELECT FirstName, LastName, AVG (TotalAmount) AS Среднее ОТ [Заказ] O ПРИСОЕДИНЯЙТЕСЬ к клиенту C НА O.CustomerId = C.Id ГРУППА ПО ФАМИЛИ И ИМЕНИ ИМЕЕТ СРЕДНЕЕ (TotalAmount) МЕЖДУ 1000 И 1200
SELECT FirstName, LastName, AVG (TotalAmount) AS Среднее
ОТ [Заказ] O
ПРИСОЕДИНЯЙТЕСЬ к клиенту C НА O.CustomerId = C.Id
ГРУППА ПО ФАМИЛИ И ИМЕНИ
ИМЕЕТ СРЕДНЕЕ (TotalAmount) МЕЖДУ 1000 И 1200
Попробуйте вживую Результат: 10 записей
Имя | Фамилия | Среднее значение |
---|---|---|
Мигель | Анхель Паолино | 1081.215000 |
Изабель | де Кастро | 1063.420000 |
Александр | Feuer | 1008.440000 |
Томас | Харди | 1062.038461 |
Pirkko | Коскитало | 1107.806666 |
Janete | Лимейра | 1174.945454 |
Антонио | Морено | 1073.621428 |
Рита | Мюллер | 1065.385000 |
Хосе | Педро Фрейре | 1183.010000 |
Карин | Шмитт | 1057.386666 |
HAVING (Transact-SQL) — SQL Server
- 2 минуты на чтение
В этой статье
Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Параллельное хранилище данных
Задает условие поиска для группы или агрегата.HAVING можно использовать только с оператором SELECT. HAVING обычно используется с предложением GROUP BY. Когда GROUP BY не используется, существует неявная единственная агрегированная группа.
Соглашения о синтаксисе Transact-SQL
Синтаксис
[ИМЕЕТ <условие поиска>]
Аргументы
<условие_поиска> Задает один или несколько предикатов, которым должны соответствовать группы и / или агрегаты. Дополнительные сведения об условиях поиска и предикатах см. В разделе Условия поиска (Transact-SQL).
Типы данных text , image и ntext нельзя использовать в предложении HAVING.
Примеры
В следующем примере, в котором используется простое предложение HAVING
, извлекается сумма для каждого SalesOrderID
из таблицы SalesOrderDetail
, которая превышает $ 100000.00
.
ИСПОЛЬЗОВАТЬ AdventureWorks2012;
ИДТИ
ВЫБЕРИТЕ SalesOrderID, SUM (LineTotal) AS SubTotal
ОТ Sales.SalesOrderDetail
ГРУППА ПО SalesOrderID
ИМЕЮЩАЯ СУММ (LineTotal)> 100000.00
ЗАКАЗ ПО SalesOrderID;
Примеры: Azure Synapse Analytics и хранилище параллельных данных
В следующем примере предложение HAVING
используется для получения общего SalesAmount
, которое превышает 80000
для каждого OrderDateKey
из таблицы FactInternetSales
.
- Использует AdventureWorks
ВЫБЕРИТЕ OrderDateKey, СУММ (SalesAmount) как TotalSales
ОТ ФАКТАИнтернетПродажи
ГРУППА ПО OrderDateKey
ИМЕЮЩАЯ СУММ (SalesAmount)> 80000
ЗАКАЗАТЬ ПО OrderDateKey;
См. Также
ГРУППА ПО (Transact-SQL)
ГДЕ (Transact-SQL)
SQL Server HAVING Clause
Summary : в этом руководстве вы узнаете, как использовать предложение SQL Server HAVING
для фильтрации групп на основе заданных условий.
Введение в SQL Server
Предложение HAVING
Предложение HAVING
часто используется с предложением GROUP BY
для фильтрации групп на основе указанного списка условий. Следующее иллюстрирует синтаксис предложения HAVING
:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT select_list ИЗ table_name ГРУППА ПО group_list ИМЕЮЩИЕ условия;
В этом синтаксисе предложение GROUP BY
объединяет строки в группы, а предложение HAVING
применяет к этим группам одно или несколько условий.В результат включаются только группы, в которых условия оцениваются как ИСТИНА
. Другими словами, группы, для которых условие оценивается как ЛОЖЬ,
или НЕИЗВЕСТНО,
, отфильтровываются.
Поскольку SQL Server обрабатывает предложение HAVING
после предложения GROUP BY
, вы не можете ссылаться на агрегатную функцию, указанную в списке выбора, с помощью псевдонима столбца. Следующий запрос завершится ошибкой:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT column_name1, column_name2, агрегатная_функция (имя_столбца3) псевдоним_столбца ИЗ table_name ГРУППА ПО column_name1, column_name2 ИМЕЮЩИЕ алиас_столбца> значение;
Вместо этого вы должны явно использовать выражение агрегатной функции в предложении HAVING
следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT column_name1, column_name2, aggregate_function (column_name3) псевдоним ИЗ table_name ГРУППА ПО column_name1, column_name2 ИМЕЮЩИЕ агрегатная_функция (имя_столбца3)> значение;
SQL Server
ИМЕЕТ
примеров Давайте рассмотрим несколько примеров, чтобы понять, как работает предложение HAVING
.
SQL Server
HAVING
с функцией COUNT
, пример См. Следующую таблицу заказов
из образца базы данных:
В следующем операторе используется предложение HAVING
для поиска клиентов, разместивших не менее двух заказов на каждую. год:
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ Пользовательский ИД, ГОД (дата_заказа), COUNT (order_id) order_count ИЗ заказы на продажу ГРУППА ПО Пользовательский ИД, ГОД (заказ_дата) ИМЕЮЩИЕ COUNT (order_id)> = 2 СОРТИРОВАТЬ ПО Пользовательский ИД;
В этом примере:
- Во-первых, предложение
GROUP BY
группирует заказ на продажу по клиенту и году заказа.ФункцияCOUNT ()
возвращает количество заказов, размещенных каждым клиентом за год. - Во-вторых, предложение
HAVING
отфильтровало всех клиентов, количество заказов которых меньше двух.
SQL Server
ИМЕЕТ предложение
с функцией SUM ()
, пример Рассмотрим следующую таблицу order_items
:
Следующий оператор находит заказы на продажу, чистая стоимость которых превышает 20 000:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT номер заказа, СУММ ( количество * list_price * (1 - скидка) ) чистая стоимость ИЗ продажи.order_items ГРУППА ПО номер заказа ИМЕЮЩИЕ СУММ ( количество * list_price * (1 - скидка) )> 20000 СОРТИРОВАТЬ ПО чистая стоимость;
В этом примере:
- Во-первых, функция
СУММ ()
возвращает чистые значения заказов на продажу. - Во-вторых, предложение
HAVING
фильтрует заказы на продажу, чистая стоимость которых меньше или равна 20 000.
SQL Server
ИМЕЕТ предложение
с функциями MAX
и MIN
, пример См. Следующую таблицу продуктов
:
Следующий оператор сначала находит максимальные и минимальные цены по прейскуранту в каждой категории продуктов.Затем он отфильтровывает категорию, у которой максимальная прейскурантная цена больше 4000 или минимальная прейскурантная цена меньше 500:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT category_id, MAX (list_price) max_list_price, MIN (list_price) min_list_price ИЗ production.products ГРУППА ПО category_id ИМЕЮЩИЕ MAX (list_price)> 4000 ИЛИ MIN (list_price) <500;
SQL Server
HAVING
clause with AVG ()
function exampleСледующая инструкция находит категории продуктов, средняя цена по прейскуранту которых составляет от 500 до 1000:
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ category_id, AVG (list_price) avg_list_price ИЗ производство.товары ГРУППА ПО category_id ИМЕЮЩИЕ СРЕДНЕЕ (list_price) МЕЖДУ 500 И 1000;
В этом руководстве вы узнали, как использовать предложение SQL Server HAVING
для фильтрации групп на основе заданных условий.
SQL GROUP BY и предложение HAVING с примерами
Что такое SQL Group by Clause?
Предложение GROUP BY - это команда SQL, которая используется для группировки строк с одинаковыми значениями .Предложение GROUP BY используется в операторе SELECT. При желании он используется вместе с агрегатными функциями для создания сводных отчетов из базы данных.
Вот что он делает, суммирует данные из базы данных.
Запросы, содержащие предложение GROUP BY, называются сгруппированными запросами и возвращают только одну строку для каждого сгруппированного элемента.
Синтаксис SQL GROUP BY
Теперь, когда мы знаем, что такое предложение SQL GROUP BY, давайте посмотрим на синтаксис для базовой группы по запросу.
Операторы SELECT ... GROUP BY имя_столбца1 [, имя_столбца2, ...] [условие HAVING];
ЗДЕСЬ
- «Операторы SELECT ...» - это стандартный запрос команды SQL SELECT.
- « GROUP BY имя_столбца1 » - это предложение, которое выполняет группировку на основе имя_столбца1.
- «[, имя_столбца2, ...]» не является обязательным; представляет имена других столбцов, когда группировка выполняется более чем по одному столбцу.
- «[HAVING condition]» не является обязательным; он используется для ограничения строк, затронутых предложением GROUP BY.Это похоже на предложение WHERE.
Группирование с использованием одного столбца
Чтобы помочь понять эффект предложения SQL Group By, давайте выполним простой запрос, который возвращает все записи пола из таблицы members.
ВЫБЕРИТЕ `пол` ИЗ` members`;
пол |
---|
Женский |
Женский |
Мужской |
Женский |
Мужской |
Мужской |
Мужской |
Мужской |
Мужской |
Предположим, мы хотим получить уникальные значения для полов.Мы можем использовать следующий запрос -
SELECT `пол` ИЗ` members` GROUP BY `пол`;
Выполнение вышеуказанного сценария в рабочей среде MySQL для Myflixdb дает следующие результаты.
Обратите внимание, что было возвращено только два результата. Это потому, что у нас есть только два гендерных типа - Мужской и Женский. Предложение GROUP BY в SQL сгруппировало все «мужские» члены вместе и вернуло для него только одну строку. То же самое и с участницами «Женского».
Группирование с использованием
нескольких столбцовПредположим, мы хотим получить список фильмов category_id и соответствующие годы, в которые они были выпущены.
Давайте посмотрим на результат этого простого запроса
SELECT `category_id`,` year_released` FROM `movies`;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 900 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
Приведенный выше результат имеет много дубликатов.
Давайте выполним тот же запрос, используя group by в SQL -
SELECT `category_id`,` year_released` FROM `movies` GROUP BY` category_id`, `year_released`;
Выполнение вышеуказанного сценария в рабочей среде MySQL для myflixdb дает нам следующие результаты, показанные ниже.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 | 900
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Пункт GROUP BY действует на как идентификатор категории, так и год выпуска для идентификации уникальных строк в нашем примере выше.
Если идентификатор категории тот же, но год выпуска отличается, тогда строка рассматривается как уникальная. Если идентификатор категории и год выпуска совпадают для более чем одной строки, то она считается дубликатом и отображается только одна строка.
Группирующие и
агрегатные функцииПредположим, нам нужно общее количество мужчин и женщин в нашей базе данных. Для этого мы можем использовать следующий сценарий, показанный ниже.
ВЫБЕРИТЕ `пол`, COUNT (` членство_число`) ИЗ `members` GROUP BY` пол`;
Выполнение вышеуказанного сценария в рабочей среде MySQL для myflixdb дает следующие результаты.
пол | COUNT ('members_number') |
---|---|
Женский | 3 |
Мужской | 5 |
Результаты, показанные ниже, сгруппированы по каждому уникальному значению пола и количеству сгруппированных количество строк подсчитывается с использованием агрегатной функции COUNT.
Ограничение результатов запроса с помощью предложения
HAVINGНе всегда нам нужно выполнять группировку всех данных в данной таблице.Бывают моменты, когда мы захотим ограничить наши результаты определенными критериями. В таких случаях мы можем использовать предложение HAVING
Предположим, мы хотим знать все годы выпуска для категории фильмов с идентификатором 8. Для достижения наших результатов мы будем использовать следующий сценарий.
ВЫБРАТЬ * ИЗ `movies` ГРУППА ПО` category_id`, `year_released` HAVING` category_id` = 8;
Выполнение вышеуказанного сценария в рабочей среде MySQL для Myflixdb дает нам следующие результаты, показанные ниже.
movie_id | title | Director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | NULL 2007 | 8 |
Обратите внимание, что предложение GROUP BY затронуло только фильмы с идентификатором категории 8.
Сводка
- SQL-запрос GROUP BY используется для группировки строк с одинаковыми значениями.
- Предложение GROUP BY используется вместе с оператором SQL SELECT.
- Оператор SELECT, используемый в предложении GROUP BY, может использоваться только в том случае, если он содержит имена столбцов, агрегатные функции, константы и выражения.
- Предложение SQL Have используется для ограничения результатов, возвращаемых предложением GROUP BY.
- Предложение MYSQL GROUP BY используется для сбора данных из нескольких записей и возвращаемых записей, содержащихся в одном или нескольких столбцах.
SQL COUNT () с HAVING - w3resource
COUNT () с HAVING
Предложение HAVING с функцией SQL COUNT () может использоваться для установки условия с помощью оператора select.Предложение HAVING используется вместо предложения WHERE с функцией SQL COUNT ().
Предложение GROUP BY с предложением HAVING извлекает результат для определенной группы столбца, который соответствует условию, указанному в предложении HAVING.
Пример :
Получить данные о количестве агентов из таблицы «агенты» с условием -
1. количество агентов должно быть больше 3,
можно использовать следующий оператор SQL:
ВЫБРАТЬ СЧЕТЧИК (*)
ОТ агентов
ИМЕЕТ СЧЕТ (*)> 3;
Пример таблицы: агенты
Выход:
СЧЕТЧИК (*) ---------- 12
Изображение для презентации:
SQL COUNT () с использованием и группировкой по
Пример таблицы: агенты
Получить данные о «комиссии» и количестве агентов для этой комиссии из таблицы «агенты» при следующих условиях -
1.количество агентов для конкретного «комиссона»,
2. количество агентов для данной «комиссии» должно быть более 3,
можно использовать следующий оператор SQL:
ВЫБРАТЬ комиссию, СЧЁТ (*)
ОТ агентов
ГРУППА ПО комиссии
ИМЕЕТ СЧЕТ (*)> 3;
Выход:
КОМИССИОННЫЙ СЧЕТ (*) ---------- ---------- .15 4
Примечание: выходные данные указанного оператора SQL, показанного здесь, получены с помощью Oracle Database 10g Express Edition.
Вот слайд-презентация всех агрегатных функций.
Практические упражнения SQL
Хотите улучшить статью выше? Публикуйте свои заметки / комментарии / примеры через Disqus.
Назад: СЧЁТ с группировкой по
Далее: Функция СУММ
GROUP BY и предложение HAVING в SQL
Важный компонент для аналитика, позволяющий суммировать такие данные, как продажи, прибыль, затраты и зарплата.Обобщение данных очень помогает аналитику создавать визуализацию, делать выводы и писать отчеты. В SQL предложение GROUP BY является одним из инструментов для суммирования или агрегирования рядов данных. Например, суммируйте ежедневные продажи, объедините их в один квартал и покажите их высшему руководству. Точно так же, если вы хотите посчитать, сколько сотрудников в каждом отделе компании. Он группирует базы данных на основе одного или нескольких столбцов и объединяет результаты.
После группировки данных вы можете отфильтровать сгруппированную запись с помощью предложения HAVING.Предложение HAVING возвращает сгруппированные записи, соответствующие заданному условию. Вы также можете отсортировать сгруппированные записи с помощью ORDER BY. ORDER BY используется после GROUP BY в агрегированном столбце.
В этом руководстве вы подробно изучите предложение GROUP BY с соответствующими примерами. Вот список тем, которые вы изучите в этом руководстве:
- Группировать по статье
- Оговорка
- Агрегатные функции
- Сравните предложение Have и Where в SQL
- GROUP BY с примером JOIN
- GROUP BY Сравнение с другим пунктом
- Практическое задание
- Заключение
Группировать по пункту
Предложение GROUP BY используется в SQL с оператором SELECT для организации похожих данных в группы.Он объединяет несколько записей в один или несколько столбцов, используя некоторые функции. Как правило, эти функции являются агрегатными функциями, такими как min (), max (), avg (), count () и sum (), для объединения в один или несколько столбцов. Он использует стратегию «разделить-применить-объединить» для анализа данных.
- В разделенной фазе
- В фазе применения
- В фазе объединения
Что следует помнить:
- Предложение GROUP BY используется с оператором SELECT.
- GROUP BY объединяет результаты на основе выбранного столбца: COUNT, MAX, MIN, SUM, AVG и т. Д.
- GROUP BY возвращает только один результат для каждой группы данных. Предложение
- GROUP BY всегда следует за предложением WHERE.
- Предложение GROUP BY всегда предшествует предложению ORDER BY (http: // slideplayer.com / slide / 15440670 /).
В приведенном выше примере таблица сгруппирована на основе столбца DeptID, а зарплата агрегирована по отделам.
Статья
, имеющаяПредложение HAVING используется в SQL как условное предложение с предложением GROUP BY. Это условное предложение возвращает строки, в которых результаты агрегатной функции совпадают только с заданными условиями. Он добавлен в SQL, потому что предложение WHERE нельзя комбинировать с агрегированными результатами, поэтому оно имеет другое назначение. Основная цель предложения WHERE - иметь дело с неагрегированными или отдельными записями.
- Предложение HAVING всегда используется в сочетании с предложением GROUP BY. Предложение
- HAVING ограничивает данные для групповых записей, а не для отдельных записей.
- WHERE и HAVING можно использовать в одном запросе.
В приведенном выше примере таблица сгруппирована на основе столбца DeptID, и эти сгруппированные строки отфильтрованы с использованием предложения HAVING с условием AVG (Salary)> 3000.
Агрегатные функции
Агрегатные функции, используемые для объединения результата группы в один, например COUNT, MAX, MIN, AVG, SUM, STDDEV и VARIANCE.Эти функции также известны как многострочные функции.
-
SUM ()
: возвращает сумму или итог каждой группы. -
COUNT ()
: возвращает количество строк в каждой группе. -
AVG ()
: возвращает среднее и среднее значение для каждой группы. -
MIN ()
: возвращает минимальное значение для каждой группы. -
MAX ()
: возвращает минимальное значение каждой группы.
Сравните предложение Have и Where в SQL
- В некоторых случаях вам нужно отфильтровать отдельные записи.В таких случаях вы можете использовать предложение WHERE, тогда как в других случаях вам нужно отфильтровать группы с определенным условием. В таких случаях вы можете использовать предложение HAVING. Предложение
- WHERE фильтрует кортеж записей по кортежу, а предложение HAVING фильтрует всю группу.
- Запрос может содержать оба предложения (предложение WHERE и HAVING).
- Сначала применяется пункт «Где», а затем пункт «Наличие». Предложение
- WHERE ограничивает записи до предложения GROUP BY, тогда как предложение HAVING ограничивает группы после выполнения предложения GROUP BY. Предложение
- WHERE можно использовать с операторами SELECT, UPDATE, DELETE и INSERT, тогда как HAVING можно использовать только с оператором SELECT.
GROUP BY с примером JOIN
Нормализованная реляционная база данных разбивает сложную таблицу на небольшие таблицы, что помогает устранить избыточность данных, несогласованность и гарантировать отсутствие потери информации. Нормализованные таблицы требуют объединения данных из нескольких таблиц.
В приведенном выше примере сотрудник и отдел объединены с помощью общего столбца DeptID.
В приведенном выше примере оба предложения JOIN и GROUP BY используются вместе в одном запросе. После объединения обеих таблиц (Сотрудник и Отдел) объединенная таблица сгруппирована по названию Отдела.
GROUP BY в сравнении с другим пунктом
Сравнить GROUP BY и DISTINCT
DISTINCT возвращает уникальные значения, представленные в столбце, в то время как GROUP BY возвращает уникальные / отдельные элементы с агрегированным результирующим столбцом. В следующем примере вы можете увидеть значения DISTINCT в таблице dept
.
Сравнить GROUP BY и ORDER BY
ORDER BY возвращает отсортированные элементы в порядке возрастания и убывания, а GROUP BY возвращает уникальные элементы с агрегированным результирующим столбцом. В следующем примере вы можете увидеть ORDER BY или отсортированную таблицу зарплат.
Практическое задание
Название стола: Книги
Столбцы: ISBN, название, дата публикации, цена, издатель
Напишите SQL-запросы для следующих операторов и поделитесь своими ответами в комментариях:
- Определите, сколько книг находится в каждой категории.
- Определите, сколько книг находится в категории «Управление».
- Определите среднюю балансовую стоимость каждой категории.
- Укажите цену самой дешевой книги в каждой категории.
Источник: Это задание основано на книге Джона Кастила «Oracle 11g SQL».
Заключение
Поздравляем, вы дошли до конца этого урока!
В этом руководстве вы рассмотрели много деталей о предложениях GROUP BY и HAVING.Вы узнали, что такое предложение GROUP BY и HAVING, на примерах, сравнение между предложениями HAVING и WHERE в SQL, GROUP BY с JOIN и сравнение GROUP BY с DISTINCT и ORDER BY. В последнем разделе у вас есть практическое задание для оценки ваших знаний.
Надеюсь, теперь вы можете использовать концепцию GROUP BY и HAVING Clause для анализа собственных наборов данных. Спасибо, что прочитали это руководство!
Если вы хотите узнать больше о SQL, воспользуйтесь промежуточным SQL DataCamp. курс.
Предложение SQL HAVING с примерами
Резюме : в этом руководстве вы узнаете, как использовать предложение SQL HAVING , чтобы указать условие поиска для группы строк или агрегата.
Введение в предложение HAVING в SQL
Предложение HAVING
часто используется с предложением GROUP BY в операторе SELECT для фильтрации группы строк на основе указанного условия. Следующее иллюстрирует синтаксис предложения HAVING
:
SELECT столбец1, столбец2, агрегатная функция (выражение) ИЗ Таблица ГРУППА ПО столбцу 1 ИМЕЮЩИЕ состояние;
Предложение HAVING работает так же, как предложение WHERE, если оно не используется с предложением GROUP BY
.Разница между предложением HAVING
и предложением WHERE
состоит в том, что предложение WHERE
используется для фильтрации строк, а предложение HAVING
используется для фильтрации групп строк.
Давайте рассмотрим несколько примеров использования предложения HAVING.
SQL HAVING examples
Давайте взглянем на таблицу orderdetails
:
SQL HAVING with SUM function example
В этом примере мы найдем заказы на продажу, общая сумма продаж которых превышает 12000 долларов.Мы используем предложение HAVING
с предложением GROUP BY
, чтобы выполнить это как следующий запрос:
SELECT заказ, СУММ (unitPrice * количество) Итого ИЗ Информация для заказа ГРУППА ПО заказу ИМЕЕТ всего> 12000;
Как работает запрос.
- Сначала для каждой позиции строки заказа SQL вычисляет общую сумму с помощью функции СУММ. (Псевдоним столбца
Total
используется для форматирования вывода). - Во-вторых, предложение
GROUP BY
группирует выбранные строки поOrderID
.Для каждого заказа, в котором у нас есть только одна группа, содержащаяOrderID
иTotal
- В-третьих, предложение
HAVING
получает группы, у которыхTotal
больше12000
.
Пример функции SQL HAVING с COUNT
Следующий запрос выбирает все заказы, в которых есть не менее 5 позиций. Мы используем функцию COUNT с предложениями HAVING
и GROUP BY
.
ВЫБРАТЬ orderID, COUNT (productID) товаров ИЗ Информация для заказа ГРУППА ПО ИД ЗАКАЗА ИМЕЮЩИЕ продукты> 5;
Предложение SQL HAVING с примерами функций MAX и MIN
Взгляните на приведенную ниже таблицу продуктов :
Чтобы выбрать самый дорогой продукт в каждой категории, используйте следующий запрос:
ВЫБРАТЬ categoryID, productID, productName, MAX (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МАКС (цена за единицу) ИЗ продукты B КУДА Б.categoryId = A.categoryID) ГРУППА ПО идентификатору категории;
Обратите внимание, что в предложении WHERE
оператора используется подзапрос для получения правильного продукта во внешнем запросе. Для каждой категории, чтобы выбрать самый дорогой продукт, цена которого превышает 100 долларов, мы можем использовать функцию MAX
в предложении HAVING
следующим образом:
SELECT categoryID, productID, productName, MAX (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МАКС (цена за единицу) ИЗ продукты B КУДА Б.categoryId = A.categoryID) ГРУППА ПО идентификатору категории ИМЕЮЩИЙ МАКС (цена за единицу)> 100;
Обратите внимание, что выбрана только цена за единицу продукта в целом, превышающую 50 долларов США.
Чтобы выбрать наименее дорогой продукт в каждой категории, мы используем тот же метод, что и самый дорогой продукт в каждой категории, за исключением того, что функция MIN
используется вместо функции MAX
:
SELECT categoryID, productID, productName, MIN (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МИН (цена за единицу) ИЗ продукты B КУДА Б.