Having mysql примеры: HAVING оператор MySQL — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Содержание
Команда HAVING — условие для GROUP BY
Команда HAVING позволяет фильтровать результат группировки,
сделанной с помощью команды GROUP BY.
См. также команду WHERE,
которая задает условие на выборку записей.
Синтаксис
GROUP BY поле HAVING условие
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 100 |
2 | Петя | 23 | 200 |
3 | Вася | 23 | 300 |
4 | Коля | 24 | 1000 |
5 | Иван | 24 | 2000 |
6 | Кирилл | 25 | 1000 |
Пример
В данном примере демонстрируется работа GROUP BY без условия HAVING:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
23 | 600 |
24 | 3000 |
25 | 1000 |
А теперь с помощью условия HAVING оставим только те строки, в которых
суммарная зарплата больше или равна 1000:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age HAVING sum>=1000
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
24 | 3000 |
25 | 1000 |
Пример
Подсчитаем с помощью функции COUNT
количество записей в группе (не используя HAVING):
SELECT age, COUNT(*) as count FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | count количество |
---|---|
23 | 3 |
24 | 2 |
25 | 1 |
А теперь с помощью условия HAVING оставим только те группы, в которых
количество строк меньше или равно двум:
SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count
SQL запрос выберет следующие строки:
age возраст | count количество |
---|---|
24 | 2 |
25 | 1 |
Аналогичного эффекта можно достигнуть, если воспользоваться
командой IN:
SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count IN(1,2)
Можно также использовать команду BETWEEN:
SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count BETWEEN 1 AND 2
Как вы видите, в HAVING допустимы все команды,
используемые в условии WHERE.
Оператор SQL HAVING: примеры, синтаксис
Оператор SQL HAVING является указателем на результат выполнения агрегатных функций. Агрегатной функцией в языке SQL называется функция, возвращающая какое-либо одно значение по набору значений столбца. Такими функциями являются: SQL COUNT(), SQL MIN(), SQL MAX(), SQL AVG(), SQL SUM().
Оператор SQL HAVING имеет следующий синтаксис:
HAVING aggregate_function(column_name) operator value
Оператор SQL HAVING аналогичен оператору SQL WHERE за тем исключением, что применяется не для всего набора столбцов таблицы, а для набора созданного оператором SQL GROUP BY и применяется всегда строго после него.
Примеры оператора SQL HAVING. Имеется следующая таблица Artists:
Singer | Album | Year | Sale |
The Prodigy | Invaders Must Die | 2008 | 1200000 |
Drowning Pool | Sinner | 2001 | 400000 |
Massive Attack | Mezzanine | 1998 | 2300000 |
The Prodigy | Fat of the Land | 1997 | 600000 |
The Prodigy | Music For The Jilted Generation | 1994 | 1500000 |
Massive Attack | 100th Window | 2003 | 1200000 |
Drowning Pool | Full Circle | 2007 | 800000 |
Massive Attack | Danny The Dog | 2004 | 1900000 |
Drowning Pool | Resilience | 2013 | 500000 |
Пример 1. Используя оператор SQL HAVING вывести название исполнителей (Singer) число продаж альбомов (Sale) которого больше 2000000:
SELECT Singer, SUM(Sale) FROM Artists GROUP BY Singer HAVING SUM(Sale) > 2000000
Результат:
Singer | Sum(Sale) |
Massive Attack | 54000000 |
The Prodigy | 33000000 |
В результат не попала группа Drowning Pool, так как общее число проданных ею пластинок равняется 1700000
Пример 2. Используя оператор SQL HAVING вывести название исполнителя, который исполнялся еще до 1995 года:
SELECT Singer, MIN(Year) FROM Artists GROUP BY Singer HAVING MIN(Year) < 1995
Результат:
Singer | MIN(Year) |
The Prodigy | 1994 |
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 | 12322.4 |
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
Использование условия 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!
Смотреть
MySQL | Группировка
Группировка
Последнее обновление: 21. 05.2018
Операторы GROUP BY и HAVING позволяют сгруппировать данные. Они употребляются в рамках команды SELECT:
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. Так, следующий пример работать не будет, так как он не содержит выражение группировки:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products
Оператор GROUP BY
может выполнять группировку по множеству столбцов. Так, добавим группировку по количеству товаров:
SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer, ProductCount
Следует учитывать, что выражение 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). В конце группы сортируются по количеству товаров по убыванию.
Использование предложений HAVING и WHERE в одном запросе — Visual Database Tools
-
000Z» data-article-date-source=»ms.date»>01/19/2017 - Чтение занимает 2 мин
В этой статье
Применимо к:Applies to: SQL ServerSQL Server (все поддерживаемые версии) SQL ServerSQL Server (all supported versions) База данных SQL AzureAzure SQL DatabaseБаза данных SQL AzureAzure SQL Database Управляемый экземпляр SQL AzureAzure SQL Managed InstanceУправляемый экземпляр SQL AzureAzure SQL Managed Instance Azure Synapse AnalyticsAzure Synapse AnalyticsAzure Synapse AnalyticsAzure Synapse Analytics Параллельное хранилище данныхParallel Data WarehouseПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: SQL ServerSQL Server (все поддерживаемые версии) SQL ServerSQL Server (all supported versions) База данных SQL AzureAzure SQL DatabaseБаза данных SQL AzureAzure SQL Database Управляемый экземпляр SQL AzureAzure SQL Managed InstanceУправляемый экземпляр SQL AzureAzure SQL Managed Instance Azure Synapse AnalyticsAzure Synapse AnalyticsAzure Synapse AnalyticsAzure Synapse Analytics Параллельное хранилище данныхParallel Data WarehouseПараллельное хранилище данныхParallel Data Warehouse
В некоторых экземплярах может понадобиться исключить отдельные строки из групп (с использованием предложения WHERE) до того, как применять условие к группе как к целому (с использованием предложения HAVING). In some instances, you might want to exclude individual rows from groups (using a WHERE clause) before applying a condition to groups as a whole (using a HAVING clause).
Предложение HAVING подобно предложению WHERE, но применимо только к целым группам (то есть к строкам в результирующем наборе, представляющим собой группы), тогда как предложение WHERE применимо к отдельным строкам.A HAVING clause is like a WHERE clause, but applies only to groups as a whole (that is, to the rows in the result set representing groups), whereas the WHERE clause applies to individual rows. В запросе могут содержаться оба предложения: WHERE и HAVING.A query can contain both a WHERE clause and a HAVING clause. В этом случае:In that case:
Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов на панели диаграмм.The WHERE clause is applied first to the individual rows in the tables or table-valued objects in the Diagram pane. Группируются только строки, которые удовлетворяют условиям в предложении WHERE. Only the rows that meet the conditions in the WHERE clause are grouped.
Затем предложение HAVING применяется к строкам в результирующем наборе.The HAVING clause is then applied to the rows in the result set. Только строки, которые удовлетворяют условиям HAVING, появляются в результирующем запросе.Only the groups that meet the HAVING conditions appear in the query output. Можно применить предложение HAVING только к тем столбцам, которые появляются в предложении GROUP BY или агрегатной функции.You can apply a HAVING clause only to columns that also appear in the GROUP BY clause or in an aggregate function.
Например, соединяются таблицы titles
и publishers
для создания запроса, в котором показана средняя цена книги для группы издателей.For example, imagine that you are joining the titles
and publishers
tables to create a query showing the average book price for a set of publishers. Требуется средняя цена книги только определенной группы издателей — например, только издателей в штате Калифорния. You want to see the average price for only a specific set of publishers — perhaps only the publishers in the state of California. При этом нужно показать только те средние цены, которые превышают $10,00.And even then, you want to see the average price only if it is over $10.00.
Первое условие можно задать с помощью предложения WHERE, которое устраняет всех издателей не из Калифорнии перед тем, как начать вычисление средней цены.You can establish the first condition by including a WHERE clause, which discards any publishers that are not in California, before calculating average prices. Второе условие требует предложения HAVING, так как условие основано на результатах группирования и сводных данных.The second condition requires a HAVING clause, because the condition is based on the results of grouping and summarizing the data. Конечная инструкция SQL может выглядеть следующим образом:The resulting SQL statement might look like this:
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
Можно создать оба предложения HAVING и WHERE на панели критериев.You can create both HAVING and WHERE clauses in the Criteria pane. По умолчанию любое заданное условие поиска для столбца становится частью предложения HAVING.By default, if you specify a search condition for a column, the condition becomes part of the HAVING clause. Однако можно изменить условие, сделав его предложением WHERE.However, you can change the condition to be a WHERE clause.
Можно создать предложение WHERE и HAVING для одного и того же столбца.You can create a WHERE clause and HAVING clause involving the same column. Для этого необходимо дважды добавить столбец на панели критериев, затем указать один экземпляр как часть предложения HAVING и другой экземпляр как часть предложения WHERE.To do so, you must add the column twice to the Criteria pane, then specify one instance as part of the HAVING clause and the other instance as part of the WHERE clause.
Задание условия WHERE в статистическом запросеTo specify a WHERE condition in an aggregate query
Укажите группы для запроса.Specify the groups for your query. Дополнительные сведения см. в статье о группировании строк в результатах запроса.For details, see Group Rows in Query Results.
Если столбец, на котором основывается условие WHERE, находится не на панели критериев, то добавьте его на панель критериев.If it is not already in the Criteria pane, add the column on which you want to base the WHERE condition.
Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.Clear the Output column unless the data column is part of the GROUP BY clause or included in an aggregate function.
В столбце Фильтр укажите условие WHERE.In the Filter column, specify the WHERE condition. Конструктор запросов и представлений добавляет условие в предложение HAVING инструкции SQL. The Query and View Designer adds the condition to the HAVING clause of the SQL statement.
Примечание
В качестве примера данной процедуры показан запрос, соединяющий две таблицы
titles
иpublishers
.The query shown in the example for this procedure joins two tables,titles
andpublishers
.В этой точке в запросе инструкции SQL содержится предложение HAVING:At this point in the query, the SQL statement contains a HAVING clause:
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'
В столбце Группировать выберите Where из списка параметров группировки и сводки.In the Group By column, select Where from the list of group and summary options. Конструктор запросов и представлений удаляет условие из предложения HAVING инструкции SQL и добавляет его в предложение WHERE. The Query and View Designer removes the condition from the HAVING clause in the SQL statement and adds it to the WHERE clause.
Инструкция SQL изменяется, теперь она содержит предложение WHERE:The SQL statement changes to include a WHERE clause instead:
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
См. также:See Also
Сортировка и группировка результатов запросаSort and Group Query Results
Резюмирование результатов запросовSummarize Query Results
Руководство по 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.
В следующей статье мы рассмотрим транзакции.
MySQL ИМЕЕТ
Резюме : В этом руководстве вы узнаете, как использовать предложение MySQL HAVING
для определения условия фильтрации для групп строк или агрегатов.
Введение в MySQL
HAVING
clause
Предложение HAVING
используется в операторе SELECT
для определения условий фильтрации для группы строк или агрегатов.
Предложение HAVING
часто используется с предложением GROUP BY
для фильтрации групп на основе заданного условия.Если предложение GROUP BY
опущено, предложение HAVING
ведет себя как предложение WHERE
.
Ниже показан синтаксис предложения HAVING
:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT select_list ИЗ table_name ГДЕ search_condition ГРУППА ПО group_by_expression ИМЕЮЩИЕ group_condition;
В этом синтаксисе вы указываете условие в предложении HAVING
. Если строка, которая создается предложением group by, приводит к тому, что group_condition
принимает значение true, запрос будет включать ее в набор результатов.
Обратите внимание, что предложение HAVING
применяет условие фильтрации к каждой группе строк, а предложение WHERE
применяет условие фильтрации к каждой отдельной строке.
MySQL оценивает предложение HAVING
после предложений FROM
, WHERE
, SELECT
и GROUP BY
и до предложений ORDER BY
и LIMIT
.
Обратите внимание, что стандарт SQL определяет, что HAVING
оценивается до предложения SELECT
и после предложения GROUP BY
.
MySQL
HAVING
clause examples
Давайте рассмотрим несколько примеров использования предложения HAVING
, чтобы увидеть, как это работает. Для демонстрации мы будем использовать таблицу orderdetails
в образце базы данных.
В следующем примере предложение GROUP BY
используется для получения номеров заказов, количества товаров, проданных за заказ, и общих продаж для каждого из таблицы orderdetails
:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT номер заказа, СУММ (количествоЗаказано) КАК itemsCount, СУММ (цена за каждый * заказанное количество) КАК Итого ИЗ Информация для заказа ГРУППИРОВАТЬ ПО номеру заказа;
Попробовать
Теперь вы можете определить, для какого заказа общий объем продаж превышает 1000
, используя предложение HAVING
следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ номер заказа, СУММ (количествоЗаказано) КАК itemsCount, СУММ (цена за каждый * заказанное количество) КАК Итого ИЗ Информация для заказа ГРУППА ПО номер заказа ИМЕЮЩИЕ всего> 1000;
Попробовать
Вы можете создать сложное условие в предложении HAVING
, используя такие логические операторы, как OR
и AND
.
В следующем примере предложение HAVING
используется для поиска заказов, общая сумма которых превышает 1000
и содержит более 600
элементов:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT номер заказа, СУММ (количествоЗаказано) КАК itemsCount, СУММ (цена за каждый * заказанное количество) КАК Итого ИЗ Информация для заказа ГРУППА ПО номеру заказа ИМЕЮЩИЕ всего> 1000 И itemsCount> 600;
Попробовать
Предположим, вы хотите найти все заказы, которые находятся в состоянии отгрузки и общая сумма которых превышает 1500, вы можете присоединиться к Таблица orderdetails
с таблицей orders
с использованием предложения INNER JOIN
и применением условия к столбцу status
и total
aggregate, как показано в следующем запросе:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT а. номер заказа, статус, СУММА (цена за каждый * заказанное количество) итого ИЗ подробности заказа Заказы INNER JOIN b ON b.ordernumber = a.ordernumber ГРУППА ПО номер заказа, статус ИМЕЮЩИЕ status = "Отправлено" И всего> 1500;
Попробовать
Предложение HAVING
полезно только тогда, когда вы используете его с предложением GROUP BY
для генерации выходных данных высокого уровня. отчеты уровня.Например, вы можете использовать предложение HAVING
, чтобы ответить на такие вопросы, как поиск количества заказов в этом месяце, в этом квартале или в этом году, общий объем продаж которых превышает 10K.
В этом руководстве вы узнали, как использовать предложение MySQL HAVING
с предложением GROUP BY
для определения условий фильтрации для групп строк или агрегатов.
- Было ли это руководство полезным?
- Да Нет
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.
ВЫБЕРИТЕ «пол» ИЗ «участников»;
пол |
---|
женщина |
женщина |
мужчина |
женщина |
мужчина |
мужчина | мужчинамужчина | мужчина | Мужской |
Предположим, мы хотим получить уникальные значения для полов.Мы можем использовать следующий запрос —
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 | |
6 | 2007 | |
6 | 2007 | |
8 | 2005 | |
NULL | 2012 | 1920 | 7 | 90248 | 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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | 2007 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | 1920 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | 1920 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | 2005 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | раздел Группа BY 900 как идентификатор категории, так и год выпуска для идентификации уникальных строк в нашем примере выше. Если идентификатор категории тот же, но год выпуска отличается, тогда строка рассматривается как уникальная. Если идентификатор категории и год выпуска совпадают для более чем одной строки, то она считается дубликатом и отображается только одна строка. Группирующие иагрегатные функцииПредположим, нам нужно общее количество мужчин и женщин в нашей базе данных. Для этого мы можем использовать следующий сценарий, показанный ниже. ВЫБЕРИТЕ `пол`, COUNT (` членство_число`) ИЗ `members` GROUP BY` пол`; Выполнение вышеуказанного сценария в рабочей среде MySQL для myflixdb дает следующие результаты.
Результаты, показанные ниже, сгруппированы по каждому уникальному гендерному групповому значению и номеру количество строк подсчитывается с помощью агрегатной функции COUNT. Ограничение результатов запроса с помощью предложенияHAVING Не всегда нам нужно выполнять группировку всех данных в данной таблице. Бывают моменты, когда мы захотим ограничить наши результаты определенными критериями. В таких случаях мы можем использовать предложение HAVING Предположим, мы хотим знать все годы выпуска для категории фильмов с идентификатором 8. Для достижения наших результатов мы будем использовать следующий сценарий. ВЫБРАТЬ * ИЗ `movies` ГРУППА ПО` category_id`, `year_released` HAVING` category_id` = 8; Выполнение вышеуказанного сценария в рабочей среде MySQL для Myflixdb дает нам следующие результаты, показанные ниже.
Обратите внимание, что наше предложение GROUP BY затронуло только фильмы с идентификатором категории 8. Сводка
MySQL HAVING Clause Предложение Рассмотрим следующий пример. ВЫБЕРИТЕ last_name, COUNT (*) Результат: В приведенном выше примере мы используем предложение Если бы мы не использовали Другой пример Вот немного более сложный пример, который использует ВЫБРАТЬ c.customer_id AS 'Идентификатор клиента', Результат: Здесь мы используем предложение Мы также сортируем эту сумму в порядке убывания, используя условие В примерах на этой странице используется образец базы данных Sakila. Использование «группировать по» и «иметь» с MySQLС SQL-запросами вы можете комбинировать синтаксис «GROUP BY» с «HAVING», чтобы возвращать строки, соответствующие определенному количеству и т. Д. В этом сообщении рассматривается, как возвращать строки на основе счетчик, специально протестированный на MySQL, но он должен работать и для других серверов баз данных. Примером таблицы может быть таблица заголовков заказов, содержащая информацию о заказе, идентификатор клиента и страну, из которой был размещен заказ. Минимальный пример структуры таблицы может выглядеть так: + ------------------- + --------------- + - ----- + ----- + ------------ + ---------------- + | Поле | Тип | Null | Ключ | По умолчанию | Экстра | + ------------------- + --------------- + ------ + ----- + ------------ + ---------------- + | order_id | int (11) | НЕТ | PRI | NULL | auto_increment | | заказ_дата | дата | НЕТ | MUL | 0000-00-00 | | | статус | tinyint (4) | НЕТ | MUL | 0 | | | customer_id | int | НЕТ | MUL | 0 | | | first_name | варчар (50) | НЕТ | | NULL | | | last_name | варчар (50) | НЕТ | | NULL | | | email_address | варчар (100) | НЕТ | | NULL | | | country_code | символ (2) | НЕТ | MUL | NULL | | | order_total | десятичный (10,2) | НЕТ | | 0.00 | | + ------------------- + --------------- + ------ + ----- + ------------ + ---------------- + Если вы хотите получить количество заказов, размещенных по странам, вы должны выполнить такой запрос: SELECT country_code, COUNT (*) FROM orders_header ГРУППА ПО country_code Первые несколько строк из набора результатов могут выглядеть следующим образом: + -------------- + ---------- + | country_code | count (*) | + -------------- + ---------- + | AE | 18 | | AR | 18 | | AS | 45 | | В | 54 | | AU | 1277 | | AZ | 1 | . .. Если вы хотите узнать все страны, в которых был размещен только один заказ, вы можете объединить «группировать по» и «иметь» следующим образом: SELECT country_code, COUNT (*) FROM orders_header ГРУППА ПО country_code ИМЕЕТ СЧЕТЧИК (*) = 1 Тогда будут возвращены только коды стран со счетом 1, например: + -------------- + ---------- + | country_code | СЧЁТ (*) | + -------------- + ---------- + | AZ | 1 | | BH | 1 | | GH | 1 | | KG | 1 | | КВт | 1 | | MD | 1 | | НП | 1 | | QA | 1 | | WF | 1 | | ZW | 1 | + -------------- + ---------- + 10 рядов в наборе (0.18 сек) В качестве другого примера, если вы хотите узнать всех клиентов, которые разместили более 5 заказов, вы можете использовать тот же тип запроса, например: SELECT customer_id, COUNT (*) FROM orders_header ГРУППА ПО customer_id HAVING COUNT (*)> 5 И если вы хотите найти всех клиентов, которые потратили больше, например, Всего 1000 долларов по всем их заказам, вы можете использовать функцию SUM () с GROUP BY и HAVING, чтобы решить эту проблему: SELECT customer_id, SUM (order_total) FROM orders_header ГРУППА ПО email_address HAVING SUM (order_total)> 1000; Существует много возможностей использования GROUP BY с HAVING, как показано в некоторых из приведенных выше примеров. Его также можно использовать для удаления повторяющихся записей, если вы искали HAVING COUNT (*)> 2 при выборе определенного поля. MySQL :: Справочное руководство MySQL 8.0 :: 13.2.10 Оператор SELECT Ключевое слово Однако, поскольку По этой причине рекомендуется иметь привычку Нельзя ссылаться на псевдоним столбца в Использование подсказок индексов предоставляет оптимизатору информацию Вы можете использовать Вы можете ссылаться на таблицу в базе данных по умолчанию как Ссылка на таблицу может быть псевдонимом, используя Столбцы, выбранные для вывода, могут быть указаны в Для сортировки в обратном порядке добавьте Если Использование позиций столбцов не рекомендуется, поскольку в синтаксисе есть До MySQL 8.0.13 MySQL поддерживал нестандартный синтаксис. Начиная с MySQL 8. 0.13, расширение При использовании MySQL расширяет использование Ранее было запрещено использовать Предложение Стандарт SQL требует, чтобы Если предложение Предпочтение отдается стандартному поведению SQL, поэтому, если Не используйте Напишите вместо этого: Предложение (Это не работало в некоторых старых версиях MySQL.) MySQL допускает повторяющиеся имена столбцов. То есть может быть В этом заявлении оба столбца имеют имя Предложение MySQL разрешает неквалифицированные ссылки на столбцы или псевдонимы в Предложение
С двумя аргументами первый аргумент указывает смещение Чтобы получить все строки от определенного смещения до конца С одним аргументом значение указывает количество строк для Другими словами, Для подготовленных операторов вы можете использовать заполнители. В Следующие операторы возвращают строки со второй по шестую из Для совместимости с PostgreSQL MySQL также поддерживает Если Если вы используете Вы не можете использовать Примечание Запросы, пропускающие заблокированные строки, возвращают несогласованное представление Все таблицы, на которые ссылается блок запроса, блокируются, когда Для получения дополнительной информации о SQL HAVING и GROUP BY - с примерамиЧто делает предложение HAVING в запросе? Предложение HAVING похоже на WHERE, но работает с сгруппированными записями, возвращаемыми GROUP BY. HAVING требует наличия предложения GROUP BY. Синтаксис SQL HAVINGОбщий синтаксис: ВЫБЕРИТЕ имена столбцов ОТ имя-таблицы ГДЕ условие ГРУППА ПО именам столбцов ИМЕЮЩИЕ условие Общий синтаксис ORDER BY: ВЫБЕРИТЕ имена столбцов ОТ имя-таблицы ГДЕ условие ГРУППА ПО именам столбцов ИМЕЮЩИЕ условие ЗАКАЗАТЬ ПО именам столбцов
|