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Дима23100
2Петя23200
3Вася23300
4Коля241000
5Иван242000
6Кирилл251000

Пример

В данном примере демонстрируется работа GROUP BY без условия HAVING:

SELECT age, SUM(salary) as sum FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
sum
сумма
23600
243000
251000

А теперь с помощью условия HAVING оставим только те строки, в которых
суммарная зарплата больше или равна 1000:

SELECT age, SUM(salary) as sum FROM workers GROUP BY age HAVING sum>=1000

SQL запрос выберет следующие строки:

age
возраст
sum
сумма
243000
251000

Пример

Подсчитаем с помощью функции COUNT
количество записей в группе (не используя HAVING):

SELECT age, COUNT(*) as count FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
count
количество
233
242
251

А теперь с помощью условия HAVING оставим только те группы, в которых
количество строк меньше или равно двум:

SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count

SQL запрос выберет следующие строки:

age
возраст
count
количество
242
251

Аналогичного эффекта можно достигнуть, если воспользоваться
командой 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:

SingerAlbumYearSale
The ProdigyInvaders Must Die20081200000
Drowning PoolSinner2001400000
Massive AttackMezzanine19982300000
The ProdigyFat of the Land1997600000
The ProdigyMusic For The Jilted Generation19941500000
Massive Attack100th Window20031200000
Drowning PoolFull Circle2007800000
Massive AttackDanny The Dog20041900000
Drowning PoolResilience2013500000

Пример 1. Используя оператор SQL HAVING вывести название исполнителей (Singer) число продаж альбомов (Sale) которого больше 2000000:

SELECT Singer, SUM(Sale)
FROM Artists
GROUP BY Singer
HAVING SUM(Sale) > 2000000

Результат:

SingerSum(Sale)
Massive Attack54000000
The Prodigy33000000

В результат не попала группа Drowning Pool, так как общее число проданных ею пластинок равняется 1700000

Пример 2. Используя оператор SQL HAVING вывести название исполнителя, который исполнялся еще до 1995 года:

SELECT Singer, MIN(Year)
FROM Artists
GROUP BY Singer
HAVING MIN(Year) < 1995

Результат:

SingerMIN(Year)
The Prodigy1994

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

Результатом выполнения запроса будет следующая таблица:




CategoryMoney
Недвижимость40530
Транспорт38560

Пример 2. База данных и таблица —
те же, что и в примере 1.

Используя операторы SQL HAVING и GROUP BY, требуется вывести категории, в какой-либо части которых минимальное количество
поданных объявлений не превышает 100.
Для этого пишем следующий запрос:

SELECT Category, Units, MIN(Units) AS Minimum
FROM Ads GROUP BY Category
HAVING MIN(Units)

Результатом будет следующая таблица:





CategoryPartMinimum
ДосугИгры41
НедвижимостьДома47
СтройматериалыДоски68

Пример 3. База данных и таблица —
те же, что и в предыдущих примерах.

Используя операторы SQL HAVING и GROUP BY, требуется вывести категории объявлений,
в которых более двух частей. Пишем следующий запрос:


SELECT Category, Part
FROM Ads GROUP BY Category
HAVING COUNT(*)>2

Результатом будет следующая таблица:








CategoryPart
ДосугКниги
ДосугМузыка
ДосугИгры
НедвижимостьКвартиры
НедвижимостьДачи
НедвижимостьДома

Примеры запросов к базе данных «Портал объявлений-1» есть также в уроках об
операторах INSERT, UPDATE, DELETE и UNION.

Написать запросы с оператором SQL HAVING самостоятельно, а затем посмотреть решения

Самостоятельно поработайте с таблицей Staff (штатные сотрудники) базы данных фирмы.
В ней есть столбцы Name (фамилия), Dept (номер отдела), Years (длительность трудового стажа)
и Salary (размер заработной платы). Примеры для самостоятельного решения со ссылками для проверки
решения — после таблицы.











NameDeptYearsSalary
Sanders20718357.5
Junkers15616232.8
Moonlight15821500.6
Pernal20818171.2
Aisen15719540.7
McGregor15715790.8
Marenghi38517506.8
Doctor20512322.4
Factor38816228.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



  • Чтение занимает 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

  1. Укажите группы для запроса.Specify the groups for your query. Дополнительные сведения см. в статье о группировании строк в результатах запроса.For details, see Group Rows in Query Results.

  2. Если столбец, на котором основывается условие WHERE, находится не на панели критериев, то добавьте его на панель критериев.If it is not already in the Criteria pane, add the column on which you want to base the WHERE condition.

  3. Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.Clear the Output column unless the data column is part of the GROUP BY clause or included in an aggregate function.

  4. В столбце Фильтр укажите условие 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 and publishers.

    В этой точке в запросе инструкции 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'  
    
  5. В столбце Группировать выберите 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 :

 

SELECT select_list ИЗ table_name ГДЕ search_condition ГРУППА ПО group_by_expression ИМЕЮЩИЕ group_condition;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом синтаксисе вы указываете условие в предложении 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 :

 

SELECT номер заказа, СУММ (количествоЗаказано) КАК itemsCount, СУММ (цена за каждый * заказанное количество) КАК Итого ИЗ Информация для заказа ГРУППИРОВАТЬ ПО номеру заказа;

Язык кода: SQL (язык структурированных запросов) (sql)

Попробовать

Теперь вы можете определить, для какого заказа общий объем продаж превышает 1000 , используя предложение HAVING следующим образом:

 

ВЫБРАТЬ номер заказа, СУММ (количествоЗаказано) КАК itemsCount, СУММ (цена за каждый * заказанное количество) КАК Итого ИЗ Информация для заказа ГРУППА ПО номер заказа ИМЕЮЩИЕ всего> 1000;

Язык кода: SQL (язык структурированных запросов) (sql)

Попробовать

Вы можете создать сложное условие в предложении HAVING , используя такие логические операторы, как OR и AND .

В следующем примере предложение HAVING используется для поиска заказов, общая сумма которых превышает 1000 и содержит более 600 элементов:

 

SELECT номер заказа, СУММ (количествоЗаказано) КАК itemsCount, СУММ (цена за каждый * заказанное количество) КАК Итого ИЗ Информация для заказа ГРУППА ПО номеру заказа ИМЕЮЩИЕ всего> 1000 И itemsCount> 600;

Язык кода: SQL (язык структурированных запросов) (sql)

Попробовать

Предположим, вы хотите найти все заказы, которые находятся в состоянии отгрузки и общая сумма которых превышает 1500, вы можете присоединиться к Таблица orderdetails с таблицей orders с использованием предложения INNER JOIN и применением условия к столбцу status и total aggregate, как показано в следующем запросе:

 

SELECT а. номер заказа, статус, СУММА (цена за каждый * заказанное количество) итого ИЗ подробности заказа Заказы INNER JOIN b ON b.ordernumber = a.ordernumber ГРУППА ПО номер заказа, статус ИМЕЮЩИЕ status = "Отправлено" И всего> 1500;

Язык кода: SQL (язык структурированных запросов) (sql)

Попробовать

Предложение 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`; 
  9024 
category_id year_released
1 2011
2 2008
NULL 2008
6 2007
6 2007
8 2005
NULL 2012
1920 7 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
6 2007
7 1920
8 1920
8 2005
8 раздел Группа BY 900 как идентификатор категории, так и год выпуска для идентификации уникальных строк в нашем примере выше.

Если идентификатор категории тот же, но год выпуска отличается, тогда строка рассматривается как уникальная. Если идентификатор категории и год выпуска совпадают для более чем одной строки, то она считается дубликатом и отображается только одна строка.

Группирующие и

агрегатные функции

Предположим, нам нужно общее количество мужчин и женщин в нашей базе данных. Для этого мы можем использовать следующий сценарий, показанный ниже.

 ВЫБЕРИТЕ `пол`, 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 дает нам следующие результаты, показанные ниже.

  Little Girls 2007 
movie_id title Director year_released category_id
9 Honey Mooners John Schultz 2005 8

Обратите внимание, что наше предложение GROUP BY затронуло только фильмы с идентификатором категории 8.

Сводка

  • SQL-запрос GROUP BY используется для группировки строк с одинаковыми значениями.
  • Предложение GROUP BY используется вместе с оператором SQL SELECT.
  • Оператор SELECT, используемый в предложении GROUP BY, может использоваться только в том случае, если он содержит имена столбцов, агрегатные функции, константы и выражения.
  • Предложение SQL Have используется для ограничения результатов, возвращаемых предложением GROUP BY.
  • Предложение MYSQL GROUP BY используется для сбора данных из нескольких записей и возвращаемых записей, содержащихся в одном или нескольких столбцах.

MySQL HAVING Clause

Предложение HAVING можно использовать в качестве фильтра для предложения GROUP BY .Он используется для применения фильтра к группе строк или агрегатов. Это контрастирует с предложением WHERE , которое применяется с до предложения GROUP BY .

Рассмотрим следующий пример.

ВЫБЕРИТЕ last_name, COUNT (*)
ОТ sakila. actor
ГРУППА ПО фамилии
ИМЕЕТ СЧЕТЧИК (*)> 3;

Результат:

В приведенном выше примере мы используем предложение HAVING , чтобы отфильтровать набор результатов только для тех записей, у которых счетчик больше трех (т.е. ИМЕЕТ СЧЕТ (*)> 3 ).

Если бы мы не использовали HAVING CLAUSE , он вернул бы все записи - независимо от их количества. Как это:

Другой пример

Вот немного более сложный пример, который использует INNER JOIN для извлечения данных из двух таблиц, а также функцию SUM () для суммирования итоговых сумм, которые заплатил каждый покупатель.

ВЫБРАТЬ c.customer_id AS 'Идентификатор клиента',
c.first_name AS "Имя",
c.last_name AS 'Фамилия',
SUM (сумма) КАК "Всего выплачено"
ОТ sakila.payment p
ВНУТРЕННЕЕ СОЕДИНЕНИЕ клиента c ON
p.customer_id = c. customer_id
ГРУППА ПО c.customer_id
ИМЕЕТ СУММУ (сумма)> 180
ЗАКАЗАТЬ ПО СУММЕ (сумме) DESC;

Результат:

Здесь мы используем предложение HAVING для возврата только тех записей, в которых общая сумма, возвращаемая функцией SUM () , превышает 180.

Мы также сортируем эту сумму в порядке убывания, используя условие ORDER BY (так, чтобы покупатель, который потратил больше всего, был указан вверху).

В примерах на этой странице используется образец базы данных 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

  • select_expr может иметь псевдоним
    с использованием AS
    псевдоним
    . Псевдоним
    используется в качестве имени столбца выражения и может использоваться в
    ГРУППА ПО , ЗАКАЗАТЬ ПО , или
    ИМЕЕТ пунктов.Например:

      SELECT CONCAT (last_name, ',', first_name) AS полное_имя
      ИЗ mytable ORDER BY full_name;  

    Ключевое слово AS необязательно при псевдониме
    select_expr с идентификатором. В
    предыдущий пример можно было бы записать так:

      SELECT CONCAT (last_name, ',', first_name) full_name
      ИЗ mytable ORDER BY full_name;  

    Однако, поскольку AS не является обязательным,
    может возникнуть небольшая проблема, если вы забудете запятую между двумя
    select_expr выражений: MySQL
    интерпретирует второе как псевдоним. Например, в
    следующий оператор, columnb рассматривается как
    псевдоним:

      ВЫБРАТЬ columna columnb ИЗ mytable;  

    По этой причине рекомендуется иметь привычку
    используя как явно при указании столбца
    псевдонимы.

    Нельзя ссылаться на псевдоним столбца в
    WHERE , поскольку значение столбца
    может еще не быть определено, когда WHERE
    оговорка выполнена.См. Раздел B.3.4.4, «Проблемы с псевдонимами столбцов».

  • ОТ
    table_references
    пункт
    указывает таблицу или таблицы, из которых нужно получить строки. Если
    вы называете более одной таблицы, вы выполняете соединение. Для
    информацию о синтаксисе соединения см. Раздел 13.2.10.2, «Предложение JOIN». Для
    для каждой указанной таблицы вы можете дополнительно указать псевдоним.

       имя_таблицы  [[AS]  псевдоним ] [ index_hint ]  

    Использование подсказок индексов предоставляет оптимизатору информацию
    о том, как выбирать индексы при обработке запроса. Для
    описание синтаксиса для указания этих подсказок см.
    Раздел 8.9.4, «Подсказки по индексу».

    Вы можете использовать SET
    max_seeks_for_key = значение

    как альтернативный способ заставить MySQL предпочесть сканирование ключей
    вместо сканирования таблицы.Видеть
    Раздел 5.1.8, «Системные переменные сервера».

  • Вы можете ссылаться на таблицу в базе данных по умолчанию как
    имя_таблицы , или как
    db_name . имя_таблицы
    явно указать базу данных. Вы можете ссылаться на столбец как
    имя_столбца ,
    имя_таблицы . имя_столбца ,
    или же
    db_name . имя_таблицы . имя_столбца .
    Вам не нужно указывать имя_таблицы или
    db_name . имя_таблицы
    префикс для ссылки на столбец, если ссылка не будет
    двусмысленный. См. Раздел 9.2.2, «Квалификаторы идентификатора», для
    примеры неоднозначности, требующие более явного столбца
    справочные формы.

  • Ссылка на таблицу может быть псевдонимом, используя
    имя_таблицы AS
    псевдоним
    или
    имя_таблицы псевдоним_имя .Эти
    утверждения эквивалентны:

      ВЫБРАТЬ t1.name, t2.salary ОТ сотрудника AS t1, информация AS t2
      ГДЕ t1. name = t2.name;
    
    ВЫБЕРИТЕ t1.name, t2.salary ОТ сотрудника t1, информация t2
      ГДЕ t1.name = t2.name;  
  • Столбцы, выбранные для вывода, могут быть указаны в
    ЗАКАЗАТЬ ПО и ГРУППА ПО
    предложения с использованием имен столбцов, псевдонимов столбцов или столбцов
    позиции. Позиции столбцов являются целыми числами и начинаются с 1:

      ВЫБЕРИТЕ колледж, регион, семя ИЗ турнира
      ЗАКАЗАТЬ ПО региону, посевной;
    
    ВЫБЕРИТЕ колледж, регион AS r, seed AS s ИЗ турнира
      ЗАКАЗАТЬ ПО r, s;
    
    ВЫБЕРИТЕ колледж, регион, семя ИЗ турнира
      ЗАКАЗАТЬ 2, 3;  

    Для сортировки в обратном порядке добавьте DESC
    (по убыванию) к имени столбца в
    ORDER BY , по которому выполняется сортировка.По умолчанию используется возрастающий порядок; это можно указать
    явно используя ключевое слово ASC .

    Если ORDER BY находится в скобках
    выражение запроса, а также применяется во внешнем запросе,
    результаты не определены и могут измениться в будущей версии
    MySQL.

    Использование позиций столбцов не рекомендуется, поскольку в синтаксисе есть
    был удален из стандарта SQL.

  • До MySQL 8.0.13 MySQL поддерживал нестандартный синтаксис.
    расширение, разрешающее явное ASC или
    DESC обозначения для GROUP
    BY
    колонн. MySQL 8.0.12 и более поздние версии поддерживают
    ORDER BY с функциями группировки, чтобы
    использование этого расширения больше не требуется. (Ошибка № 86312, Ошибка
    # 26073525) Это также означает, что вы можете сортировать по произвольному столбцу
    или столбцы при использовании GROUP BY , например:

      ВЫБРАТЬ a, b, COUNT (c) КАК t ИЗ test_table GROUP BY a, b ORDER BY a, t DESC;  

    Начиная с MySQL 8. 0.13, расширение GROUP BY
    больше не поддерживается: ASC или
    DESC обозначения для GROUP
    BY
    столбцы не допускаются.

  • При использовании ORDER BY или GROUP
    BY
    для сортировки столбца в
    SELECT , сервер сортирует значения
    используя только начальное количество байтов, указанное
    max_sort_length система
    Переменная.

  • MySQL расширяет использование GROUP BY , чтобы разрешить
    выбор полей, не упомянутых в ГРУППЕ
    BY
    пункт. Если вы не получаете результатов,
    вы ожидаете от своего запроса, пожалуйста, прочтите описание
    GROUP BY найдено в
    Раздел 12.20, «Агрегатные функции».

  • GROUP BY разрешает СО
    Модификатор ROLLUP
    . Видеть
    Раздел 12.20.2, «Модификаторы GROUP BY».

    Ранее было запрещено использовать ORDER
    BY
    в запросе с WITH
    Модификатор ROLLUP
    . Это ограничение снято с
    MySQL 8.0.12. См. Раздел 12.20.2, «Модификаторы GROUP BY».

  • Предложение HAVING применяется почти последним,
    непосредственно перед отправкой товаров клиенту, без
    оптимизация.( LIMIT применяется после
    ИМЕЕТ .)

    Стандарт SQL требует, чтобы ИМЕЕТ .
    только ссылки на столбцы в GROUP BY
    предложение или столбцы, используемые в агрегатных функциях. Однако MySQL
    поддерживает расширение этого поведения и разрешает
    ИМЕЕТ для ссылки на столбцы в
    ВЫБРАТЬ список и столбцы в
    также внешние подзапросы.

    Если предложение HAVING относится к столбцу
    что неоднозначно, появляется предупреждение. В следующих
    оператор, col2 неоднозначен, потому что он
    используется как псевдоним и как имя столбца:

      ВЫБРАТЬ СЧЕТЧИК (столбец1) КАК столбец2 ИЗ t ГРУППА ПО столбцу2 ИМЕЕТ столбец2 = 2;  

    Предпочтение отдается стандартному поведению SQL, поэтому, если
    ИМЕЕТ имя столбца , которое используется как в
    GROUP BY и как столбец с псевдонимом в
    список выходных столбцов, предпочтение отдается столбцу в
    ГРУППА ПО столбец.

  • Не используйте ИМЕЮЩИЙ для предметов, которые должны быть
    в пункте WHERE . Например, не
    напишите следующее:

      ВЫБРАТЬ  имя_столбца  ИЗ  имя_таблицы  ИМЕЕТ  имя_столбца > 0;  

    Напишите вместо этого:

      ВЫБРАТЬ  имя_столбца  ИЗ  имя_таблицы  ГДЕ  имя_столбца > 0;  
  • Предложение HAVING может относиться к совокупному
    функции, которые предложение WHERE не может:

      ВЫБРАТЬ пользователя, МАКС.  (Зарплата) ИЗ пользователей
      ГРУППА ПО ПОЛЬЗОВАТЕЛЯМ ИМЕЮЩИМ MAX (зарплата)> 10;  

    (Это не работало в некоторых старых версиях MySQL.)

  • MySQL допускает повторяющиеся имена столбцов. То есть может быть
    более одного select_expr с
    то же имя. Это расширение стандартного SQL. Поскольку MySQL
    также разрешает GROUP BY и
    ИМЕЕТ для ссылки
    select_expr значений, это может привести
    в двусмысленности:

      ВЫБРАТЬ 12 КАК a, a ИЗ t GROUP BY a;  

    В этом заявлении оба столбца имеют имя
    а .Чтобы убедиться, что правильный столбец
    используется для группировки, используйте разные имена для каждого
    select_expr .

  • Предложение WINDOW , если присутствует, определяет
    именованные окна, на которые могут ссылаться оконные функции. Для
    подробности см. в Раздел 12.21.4, «Именованные окна».

  • MySQL разрешает неквалифицированные ссылки на столбцы или псевдонимы в
    ORDER BY пунктов путем поиска в
    select_expr значений, затем в
    столбцы таблиц в разделе FROM .Для GROUP BY или ИМЕЕТ
    предложений, он ищет предложение FROM перед
    поиск в select_expr
    значения. (Для GROUP BY и
    ИМЕЕТ , это отличается от версии до MySQL 5.0.
    поведение, использующее те же правила, что и для ORDER
    BY
    .)

  • Предложение LIMIT может использоваться для ограничения
    количество строк, возвращаемых
    SELECT заявление. LIMIT принимает один или два числовых аргумента,
    которые оба должны быть неотрицательными целыми константами, с этими
    исключения:

    • В подготовленных отчетах LIMIT
      параметры можно указать с помощью ?
      маркеры-заполнители.

    • Внутри сохраненных программ LIMIT
      параметры могут быть указаны с помощью целочисленной подпрограммы
      параметры или локальные переменные.

    С двумя аргументами первый аргумент указывает смещение
    первая строка для возврата, а вторая определяет максимум
    количество возвращаемых строк. Смещение начальной строки 0
    (не 1):

      ВЫБРАТЬ * ИЗ ТАБЛИЦЫ LIMIT 5,10; # Получить строки 6-15  

    Чтобы получить все строки от определенного смещения до конца
    набор результатов, вы можете использовать какое-то большое число для второго
    параметр.Этот оператор извлекает все строки из 96-й строки
    до конца:

      ВЫБРАТЬ * ИЗ ТАБЛИЦЫ LIMIT 95,18446744073709551615;  

    С одним аргументом значение указывает количество строк для
    возврат из начала набора результатов:

      ВЫБРАТЬ * ИЗ ТАБЛИЦЫ LIMIT 5; # Получить первые 5 строк  

    Другими словами, LIMIT
    row_count
    эквивалентно
    до LIMIT 0,
    row_count
    .

    Для подготовленных операторов вы можете использовать заполнители. В
    следующие операторы возвращают одну строку из
    табл. стол:

      НАБОР @ a = 1;
    ПОДГОТОВИТЬ STMT ИЗ 'SELECT * FROM tbl LIMIT?';
    ВЫПОЛНИТЬ STMT, ИСПОЛЬЗУЯ @a;  

    Следующие операторы возвращают строки со второй по шестую из
    таблица tbl :

      SET @ skip = 1; НАБОР @ numrows = 5;
    ПОДГОТОВИТЬ STMT ИЗ 'SELECT * FROM tbl LIMIT?,?';
    ВЫПОЛНИТЕ STMT, ИСПОЛЬЗУЯ @skip, @numrows;  

    Для совместимости с PostgreSQL MySQL также поддерживает
    LIMIT row_count OFFSET
    смещение
    синтаксис.

    Если LIMIT встречается в скобках
    выражение запроса, а также применяется во внешнем запросе,
    результаты не определены и могут измениться в будущей версии
    MySQL.

  • SELECT ...
    ШТО
    форма ВЫБЕРИТЕ
    позволяет записать результат запроса в файл или сохранить в
    переменные. Для получения дополнительной информации см.
    Раздел 13.2.10.1, «Заявление SELECT ... INTO».

  • Если вы используете FOR UPDATE с механизмом хранения
    который использует блокировки страниц или строк, строки, проверенные запросом,
    заблокирован от записи до конца текущей транзакции.

    Вы не можете использовать ДЛЯ ОБНОВЛЕНИЯ как часть
    ВЫБЕРИТЕ в таком заявлении, как
    СОЗДАТЬ
    ТАБЛИЦА new_table SELECT... ИЗ
    старая_таблица ...
    . (Если ты
    попытка сделать это, утверждение отклоняется с ошибкой
    Не могу обновить таблицу
    ' old_table ', а
    ' new_table ' находится
    созданный. )

    ДЛЯ АКЦИИ и БЛОКИРОВКА ДОЛИ
    MODE
    устанавливает разделяемые блокировки, которые разрешают другие транзакции
    читать исследуемые строки, но не обновлять или удалять их. ДЛЯ АКЦИИ и БЛОКИРОВКА ДОЛИ
    MODE
    эквивалентны. Однако ДЛЯ
    SHARE
    , как и FOR UPDATE , поддерживает
    NOWAIT , SKIP LOCKED и
    OF имя_таблицы
    параметры. ДЛЯ АКЦИИ является заменой
    LOCK IN SHARE MODE , но LOCK IN
    SHARE MODE
    остается доступным для обратной
    совместимость.

    NOWAIT вызывает FOR
    ОБНОВЛЕНИЕ
    или ДЛЯ ПОДЕЛИТЬСЯ запрос на
    выполнить немедленно, возвращая ошибку, если блокировка строки не может
    быть полученным из-за блокировки, удерживаемой другой транзакцией.

    ПРОПУСТИТЬ ЗАБЛОКИРОВАН вызывает ДЛЯ
    ОБНОВЛЕНИЕ
    или ДЛЯ ПОДЕЛИТЬСЯ запрос на
    выполнить немедленно, исключая строки из набора результатов, которые
    заблокированы другой транзакцией.

    NOWAIT и ПРОПУСТИТЬ ЗАБЛОКИРОВАНО
    параметры небезопасны для репликации на основе операторов.

    Примечание

    Запросы, пропускающие заблокированные строки, возвращают несогласованное представление
    данные. ПРОПУСТИТЬ ЗАБЛОКИРОВАН , следовательно, не
    подходит для общей транзакционной работы. Однако это может быть
    используется, чтобы избежать конфликта блокировок при доступе к нескольким сеансам
    та же таблица, похожая на очередь.

    OF имя_таблицы
    применяется ДЛЯ ОБНОВЛЕНИЯ и ДЛЯ
    ПОДЕЛИТЬСЯ
    запросов к именованным таблицам. Например:

      ВЫБРАТЬ * ИЗ t1, t2 ДЛЯ ДОЛЯ t1 ДЛЯ ОБНОВЛЕНИЯ t2;  

    Все таблицы, на которые ссылается блок запроса, блокируются, когда
    OF имя_таблицы есть
    опущено. Следовательно, использование предложения блокировки без
    OF имя_таблицы дюйм
    комбинация с другим предложением блокировки возвращает ошибку.Указание одной и той же таблицы в нескольких блокирующих предложениях возвращает
    ошибка. Если псевдоним указан как имя таблицы в
    SELECT , предложение блокировки может только
    используйте псевдоним. Если оператор SELECT делает
    не указывать псевдоним явно, предложение блокировки может только
    укажите фактическое имя таблицы.

    Для получения дополнительной информации о ДЛЯ ОБНОВЛЕНИЯ и
    ДЛЯ АКЦИИ см.
    Раздел 15.7.2.4, «Блокировка чтения». Для дополнительных
    информация о NOWAIT и SKIP
    ЗАБЛОКИРОВАНО
    опций, см.
    Блокировка одновременного чтения с помощью NOWAIT и SKIP LOCKED.

  • SQL HAVING и GROUP BY - с примерами

    Что делает предложение HAVING в запросе?

    Предложение HAVING похоже на WHERE, но работает с сгруппированными записями, возвращаемыми GROUP BY.
    HAVING применяется к сводным групповым записям, тогда как WHERE применяется к индивидуальным записям.
    Будут возвращены только группы, соответствующие критериям HAVING.

    HAVING требует наличия предложения GROUP BY.
    И WHERE, и HAVING могут использоваться в одном запросе одновременно.

    Синтаксис SQL HAVING

    Общий синтаксис:

    ВЫБЕРИТЕ имена столбцов
      ОТ имя-таблицы
     ГДЕ условие
     ГРУППА ПО именам столбцов
    ИМЕЮЩИЕ условие
     

    Общий синтаксис ORDER BY:

    ВЫБЕРИТЕ имена столбцов
      ОТ имя-таблицы
     ГДЕ условие
     ГРУППА ПО именам столбцов
    ИМЕЮЩИЕ условие
     ЗАКАЗАТЬ ПО именам столбцов
     

    КЛИЕНТ
    Идентификатор
    Имя
    Фамилия
    Город
    Страна
    Телефон

    SQL GROUP BY Примеры

    Задача: Укажите количество клиентов в каждой стране.
    Включите только страны с более чем 10 клиентами.

    ВЫБЕРИТЕ COUNT (Id), Country
      ОТ Заказчика
     ГРУППА ПО СТРАНАМ
    ИМЕЕТ COUNT (Id)> 10
     

    Результат: 3 записи

    Счетчик Страна
    11 Франция
    11 Германия
    13 США

    КЛИЕНТ
    Идентификатор
    Имя
    Фамилия
    Город
    Страна
    Телефон

    Задача: Укажите количество клиентов в каждой стране,
    кроме США, отсортированных по убыванию.
    Включите только страны с 9 и более клиентами.

    ВЫБЕРИТЕ COUNT (Id), Country
      ОТ Заказчика
     ГДЕ Страна "США"
     ГРУППА ПО СТРАНАМ
    HAVING COUNT (Id)> = 9
     ORDER BY COUNT (Id) DESC
     

    Результат: 3 записи

    Счетчик Страна
    11 Франция
    11 Германия
    9 Бразилия

    ЗАКАЗАТЬ
    Id
    ДатаРазмещения
    ORDERNUMBER
    CustomerId
    TotalAmount
    КЛИЕНТ
    Id
    FirstName
    Фамилия
    Город
    Страна
    Телефон

    Задача: Список всех клиентов со средними заказами
    от 1000 до 1200 долларов.

    ВЫБЕРИТЕ СРЕДНЕЕ (TotalAmount), FirstName, LastName
      ОТ [Заказ] O ПРИСОЕДИНЯЙТЕСЬ к клиенту C ON O.CustomerId = C.Id
     ГРУППА ПО ФАМИЛИ И ИМЕНИ
    ИМЕЕТ СРЕДНЕЕ (TotalAmount) МЕЖДУ 1000 И 1200
     

    Результат: 10 записей

    Среднее Имя Фамилия
    1081.215000 Мигель Анхель Паолино
    1063.420000 Изабель де Кастро
    1008.440000 Александр Feuer
    1062.038461 Томас Харди
    1107.806666 Пиркко Коскитало
    1174.945454 Янете Лимейра
    1073.621428 Антонио Морено
    1065.385000 Рита Мюллер
    1183.010000 Хосе Педро Фрейре
    1057.386666 Карин Шмитт

    Предложение

    SQL HAVING с примерами

    Резюме : в этом руководстве вы узнаете, как использовать предложение SQL HAVING для определения условия поиска для группы строк или агрегата.

    Введение в предложение SQL HAVING

    Предложение HAVING часто используется с предложением GROUP BY в операторе SELECT для фильтрации группы строк на основе указанного условия.Ниже показан синтаксис предложения HAVING :

    SELECT

    column1, column2, aggregate_function (expr)

    FROM

    table

    GROUP BY column1

    condition

    HAVING condition

    HAVING condition

    Предложение HAVING работает как предложение WHERE, если оно не используется с предложением GROUP BY . Разница между предложением HAVING и предложением WHERE состоит в том, что предложение WHERE используется для фильтрации строк, а предложение HAVING используется для фильтрации групп строк.

    Давайте рассмотрим несколько примеров использования предложения HAVING.

    SQL HAVING examples

    Давайте посмотрим на таблицу orderdetails :

    SQL HAVING with SUM function example

    В этом примере мы найдем заказы на продажу, общая сумма продаж которых превышает 12000 долларов. Мы используем предложение HAVING с предложением GROUP BY , чтобы выполнить это как следующий запрос:

    SELECT

    orderid, SUM (unitPrice * количество) Всего

    FROM

    orderdetails ПО заказу

    ИМЕЕТ всего> 12000;

    Как работает запрос.

    • Во-первых, для каждой позиции строки заказа SQL вычисляет общую сумму с помощью функции СУММ. (Псевдоним столбца Всего используется для форматирования вывода).
    • Во-вторых, предложение GROUP BY группирует выбранные строки по OrderID . Для каждого заказа, у нас есть только одна группа, содержащая OrderID и Total
    • В-третьих, предложение HAVING получает группы, у которых Total больше 12000 .

    SQL HAVING with COUNT function example

    Следующий запрос выбирает все заказы, в которых есть не менее 5 позиций. Мы используем функцию COUNT с предложениями HAVING и GROUP BY .

    SELECT

    orderID, COUNT (productID) products

    FROM

    orderdetails

    GROUP BY orderID

    HAVING products> 5;

    Предложение SQL HAVING с примерами функций MAX и MIN

    Взгляните на приведенную ниже таблицу продуктов :

    Чтобы выбрать самый дорогой продукт в каждой категории, используйте следующий запрос:

    SELECT

    categoryID, productID, productName, MAX (unitprice)

    FROM

    product A

    WHERE

    unitprice = (

    SELECT

    MAX (unitprice)

    9000 9000 9000 9000 BOM) ГДЕ

    B.categoryId = A.categoryID)

    GROUP BY categoryID;

    Обратите внимание, что в предложении WHERE оператора используется подзапрос для получения правильного продукта во внешнем запросе. Для каждой категории, чтобы выбрать самый дорогой продукт, цена которого превышает 100 долларов США, мы можем использовать функцию MAX в предложении HAVING следующим образом:

    SELECT

    categoryID, productID, productName , MAX (цена за единицу)

    ИЗ

    продуктов A

    ГДЕ

    Цена за штуку = (

    SELECT

    MAX (цена за штуку)

    ИЗ

    продуктов B

    ГДЕ

    B.categoryId = A.categoryID)

    ГРУППА ПО идентификатору категории

    ИМЕЕТ МАКС. (цена за единицу)> 100;

    Обратите внимание, что выбирается только цена за единицу продукта целиком, превышающую 50 долларов.

    Чтобы выбрать наименее дорогой продукт в каждой категории, мы используем тот же метод, что и самый дорогой продукт в каждой категории, за исключением того, что функция MIN используется вместо функции MAX :

    SELECT

    categoryID, productID, productName, MIN (unitprice)

    FROM

    product A

    WHERE

    unitprice = (

    SELECT

    MIN (unitprice)

    FROM

    E Б.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *