Sql having пример: Оператор SQL HAVING: примеры, синтаксис

SQL SELECT Раздел HAVING — Условия поиска на группу строк — HAVING COUNT и HAVING MIN

SELECT HAVING

Наконец, последним при вычислении табличного выражения используется раздел HAVING (если он присутствует).

Раздел HAVING может осмысленно появиться в табличном выражении только в том случае, когда в нем присутствует раздел GROUP BY. Условие поиска этого раздела задает условие на группу строк сгруппированной таблицы. Формально раздел HAVING может присутствовать и в табличном выражении, не содержащем GROUP BY. В этом случае полагается, что результат вычисления предыдущих разделов представляет собой сгруппированную таблицу, состоящую из одной группы без выделенных столбцов группирования.

Условие поиска раздела HAVING строится по тем же синтаксическим правилам, что и условие поиска раздела WHERE, и может включать те же самые предикаты. Однако имеются специальные синтаксические ограничения по части использования в условии поиска спецификаций столбцов таблиц из раздела FROM данного табличного выражения. Эти ограничения следуют из того, что условие поиска раздела HAVING задает условие на целую группу, а не на индивидуальные строки.

Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.

Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.

HAVING COUNT

SELECT HAVING COUNT. Пример.

Выбрать коды товаров, покупаемых более чем одним покупателем:

SELECT stock FROM ordsale GROUP BY stock HAVING COUNT(*) > 1;

HAVING MIN

SELECT HAVING MIN. Пример.

Получить значения минимального и максимального оклада для клерков каждого отдела, где  самое низкое жалованье составляет менее $1,000:

SELECT deptno, MIN(sal), MAX(sal) FROM emp WHERE job = ‘CLERK’ GROUP BY deptno HAVING MIN(sal) < 1000;

Оператор SQL: HAVING.

— it-black.ru Оператор SQL: HAVING. — it-black.ru Перейти к содержимому

Оператор HAVING наряду с оператором WHERE позволяет определять условия выборки уже сгруппированных некоторым образом данных. Только оператор HAVING применяется не для всего набора столбцов таблицы, а для набора созданного оператором SQL GROUP BY и применяется всегда строго после него. Его синтаксис:


HAVING aggregate_function(column_name) operator value;

Примеры оператора SQL HAVING. Имеется следующая таблица Artists:

SingerAlbumYearSale
The ProdigyInvaders Must Die20081200000
Drowning PoolSinner2001400000
Massive AttackMezzanine1998
2300000
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;

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


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

Самостоятельно создайте таблицу Artists и выполните каждый пример. В комментариях можете писать новые примеры к данной таблице и не только.

Facebook

Twitter

  • One Comment

Группа в VK

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Облако меток
Instagram Vk Youtube Telegram Odnoklassniki

Полезно знать

Рубрики

Авторы

SQL Предложение HAVING | Предложение SQL HAVING с синтаксисом и примером

Предложение «Наличие» в SQL используется для операций агрегирования вместе с операторами условий «Где», «группировать по» и «упорядочить по». Он применяется к таблице/базе данных, где необходимо фильтровать совокупные результаты, и допускает условия «группировать по» и «упорядочивать по». Когда в запросе используется предложение «имея», ожидается, что результирующий набор выходных данных может содержать более одной записи из таблицы/базы данных.

Почему ИМЕЕТ, а не ГДЕ?

Мы видим, что предложения HAVING и WHERE выполняют очень похожую задачу по фильтрации результатов. Тогда зачем нужна была фраза HAVING? Почему предложение WHERE нельзя было использовать с агрегатными функциями?

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

Наоборот, предложение HAVING появляется только после того, как строки загружены в память. После загрузки в память агрегатные функции выполняют свою задачу над строками, ИМЕЮЩИМИ желаемое условие.

Теперь, если бы мы поместили предложение WHERE с агрегатной функцией, такой как avg(), это запутало бы механизм SQL при выборе того, следует ли включать строку для вычисления среднего значения или нет. По сути, мы бы приказывали движку не читать строку, поскольку она не соответствует критерию avg() в предложении WHERE. Но, эй, чтобы определить, соответствует ли он критерию расчета avg() или нет, строку необходимо считать в память. Состояние тупика.

Синтаксис:

 SELECT <столбцы>
ОТ <таблицы>
ГДЕ <условие>          -- необязательно
GROUP BY        -- группирует строки для применения агрегатной функции.
HAVING          -- агрегатная функция в условии
ORDER BY <столбцы>; -- определить порядок сортировки, необязательный 

Примечание: Предложение GROUP BY требуется с предложением HAVING.

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

Как работает предложение HAVING?

Предложение GROUP BY всегда сопровождает предложение HAVING. Предложение GROUP BY группирует данные, соответствующие определенному критерию. Он состоит из трех этапов — разделить, применить и объединить. Разделенная фаза делит строки на группы. Фаза применения применяет некоторые агрегатные функции к группам данных. Объединенная фаза дает единый результат путем объединения групп с результатом агрегатной функции.

Теперь, когда группы сформированы, на сцену выходит предложение HAVING. Затем предложение HAVING отфильтровывает группы, которые не удовлетворяют заданному условию.

Код:

 ВЫБРАТЬ Col_A, avg(Col_B) как Col_B
ИЗ MyTable
СГРУППИРОВАТЬ ПО Col_A
HAVING avg(Col_B)>30 

Таким образом, в приведенном выше примере мы видим, что таблица сначала разбивается на три группы на основе столбца Col_A.

Затем к группам применяется агрегатная функция для вычисления среднего значения Col_B. Это приводит к одной строке для каждой группы. Затем строки объединяются и фильтруются на основе условия в предложении HAVING.

Пример

Теперь давайте рассмотрим реальный пример.

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

Идентификатор клиента Имя Клиента Город Страна
1 Аня Дамиан Берлин Германия
2 Денни Коккет Мексика Д.Ф. Мексика
3 Элеонора Калнан Мексика Д.Ф. Мексика
4 Альберта Олбери Лондон Великобритания
5 Латиша Нембхард Лулео Швеция
6 Мадален Бинг Мангейм Германия
7 Ребекка Бигл Страсбург Франция
8 Рози Типпи Мадрид Испания
9 Оди Хан Марсель Франция
10 Хильдегард Берроуз Цавассен Канада
11 Корделл Дютрембл Лондон Великобритания
12 Нора Рейна Буэнос-Айрес Аргентина
13 Урсула Лафорест Мексика Д. Ф. Мексика
14 Клоди Нил Берн Швейцария
15 Порция Йи Сан-Паулу Бразилия
16 Ангила Сегарра Лондон Великобритания
17 Лиз Векслер Ахен Германия
18 Нед Мендивил Нант Франция
19 Сара Видаурри Лондон Великобритания
20 Тайна Навин Грац Австрия
21 Пура Рэй Сан-Паулу Бразилия
22 Эрика Бьярд Мадрид Испания
23 Джимми Люк Лилль Франция
24 Шейла Байингтон Браке Швеция
25 Кристиана Боден Мюнхен Германия
26 Ирина Нитта Нант Франция
27 Брайанна Оллс Турин Италия
28 Нора Пикен Лиссабон Португалия
29 Мориа Стюарт Барселона Испания
30 Иделла Хэрриот Севилья Испания
ID заказа Идентификатор клиента Дата заказа
10254 14 07. 11.1996
10258 20 17-07-1996
10259 13 18-07-1996
10263 20 23-07-1996
10264 24 24-07-1996
10265
7
25-07-1996
10267 25 29-07-1996
10278 5 08.12.1996
10280 5 14 августа 1996 г.
10289 11 26-08-1996
10290 15 27 августа 1996 г.
10297 7 09.04.1996
10303 30 09. 11.1996
10308 2 18-09-1996
10311 18 20-09-1996
10326 8 10.10.1996
10327 24 11-10-1996
10328 28 14-10-1996
10331 9 16-10-1996
10337 25 24-10-1996
10340 9 29-10-1996
10342 25 30-10-1996
10347 21 06-11-1996
10351 20 11-11-1996
10352 28 12-11-1996
10355 4 15-11-1996
10360 7 22-11-1996
10362 9 25-11-1996
10363 17 26-11-1996
10364 19 26-11-1996
10365 3 27-11-1996
10366 29 28-11-1996
10368 20 29-11-1996
10370 14 03-12-1996
10378 24 12. 10.1996
10382 20 13-12-1996
10383 4 16-12-1996
10384 5 16-12-1996
10386 21 18-12-1996
10389 10 20-12-1996
10390 20 23-12-1996
10391 17 23-12-1996
10396 25 27-12-1996
10400 19 01-01-1997
10402 20 01.02.1997
10403 20 01.03.1997
10408 23 01. 08.1997
10410 10 01.10.1997
10411 10 01.10.1997
10414 21 14-01-1997
10422 27 22-01-1997
10426 29 27-01-1997
10430 20 30-01-1997
10431 10 30-01-1997
10434 24 03-02-1997
10435 16 02.04.1997
10436 7 02.05.1997
10442 20 02.11.1997

Теперь мы хотим узнать, клиенты из каких стран разместили у нас в общей сложности 5 или более заказов. Это может быть один клиент, размещающий более 5 заказов, или 5 клиентов, размещающих по 1 заказу каждый.

Для этого нам потребуется:

Шаг 1: Соедините две таблицы.

Шаг 2: Сгруппируйте клиентов по странам.

Шаг 3: Подсчитайте количество заказов для каждой группы.

Шаг 4: Отфильтровать результаты по 5 и более заказам.

Сформулируем команду:

Код:

 SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders         -- Шаг 1,3
ОТ клиентов C                                              -- Шаг 1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы O на C.CustomerID = O.CustomerID              -- Шаг 1
ГРУППИРОВАТЬ ПО C.Страна                                                                                          
HAVING COUNT(O.OrderId) >= 5                                    -- Шаг 4
ORDER BY COUNT(O.OrderId) DESC 

Вот результаты:

Страна Количество заказов
Австрия 10
Франция 9
Швеция 7
Германия 6
Великобритания 6

Заключение — SQL HAVING Пункт

Итак, мы увидели назначение предложения HAVING и как оно работает. Важно понимать основы работы, иначе вы можете запутаться в том, почему предложение HAVING не дает желаемых результатов. Продолжайте играть с различными таблицами, объединениями и комбинациями вместе с предложением HAVING.

Рекомендуемые статьи

Мы надеемся, что эта информация EDUCBA о «SQL HAVING Clause» была вам полезна. Вы можете просмотреть рекомендуемые статьи EDUCBA для получения дополнительной информации.

  1. Запрос вставки SQL
  2. Внешний ключ в SQL
  3. Отдельное ключевое слово в SQL
  4. Представления SQL

Предложение SQL HAVING — Обучение на примере

Помимо создания групп с помощью предложения GROUP BY, вы также можете решить, какие группы включить в вывод, а какие исключить. Например, вам может понадобиться список должностей, на которые нанимается более одного сотрудника. Чтобы получить такие данные, вы должны фильтровать по группам, а не по отдельным строкам.

Для этой цели в SQL предусмотрено предложение: предложение HAVING .

Точно так же, как ГДЕ ВЫБРАТЬ, так же, как и ГРУППИРОВАТЬ ПО. Другими словами, предложение WHERE фильтрует отдельные строки, а предложение HAVING фильтрует группы, созданные предложением GROUP BY. Таким образом, когда вы используете предложение HAVING, вы эффективно включаете или исключаете целые группы данных из результатов запроса.

Синтаксис

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

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

Образец таблицы

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

Эта таблица является частью «Системы управления персоналом», которая содержит основную информацию о сотрудниках.

1 Боб Нью-Йорк Менеджер 60000 2012-03-07
2 Kim Chicago Manager 55000 2014-04-25
3 Eve New York Developer 32000 2015-03-11
4 Max New York Janitor 9000 2015-01-15
5 Joe Chicago Developer 30000 2016-10-05
6 Amy New York Developer 31000 2013-05-13
7 Ray New York Supervisor 40000 2016-01-15
8 САМ Чикаго ГОРОНАЧЕСКИЙ0051 Liv Chicago Developer 30000 2014-08-10
10 Ian New York Janitor 8500 2018-01-12

Using HAVING Пункт

После того, как данные сгруппированы, вы можете применить условие фильтрации, чтобы включить или исключить определенные группы. Предложение HAVING — это то место, где вы должны разместить эти типы условий фильтрации.

Например, следующий запрос возвращает список должностей, на которые нанято более одного сотрудника.

 SELECT Задание, COUNT(*) AS emp_count
ОТ сотрудников
СГРУППИРОВАТЬ ПО РАБОТЕ
СЧЕТ(*) > 1; 

8

Разработчик 4
Уборщик 3
Менеджер 2

LINES THER THAR THER THER THER THAR THER THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THAR THARIC. затем подсчитайте количество сотрудников для каждой группы. В последней строке добавляется предложение HAVING, которое отфильтровывает эти группы и исключает вакансии только с одним сотрудником или без него.

Разница между HAVING и WHERE

HAVING очень похож на WHERE. На самом деле, все параметры и приемы, которые вы уже узнали о WHERE (включая подстановочные знаки и несколько операторов), можно применить и к HAVING.

Единственная разница в том, что WHERE фильтрует строки, а HAVING фильтрует группы. Это связано с тем, что WHERE действует на данные до того, как они будут сгруппированы, а HAVING действует на данные после того, как группы были созданы.

Чтобы продемонстрировать, давайте изменим приведенный выше пример, чтобы поместить условие группировки в предложение WHERE вместо HAVING:

 SELECT Задание, COUNT(*) AS emp_count
ОТ сотрудников
ГДЕ СЧИТАТЬ (*) > 1
СГРУППИРОВАТЬ ПО РАБОТЕ;
--Агрегат не может появляться в предложении WHERE, если только он не
  в подзапросе, содержащемся в предложении HAVING или списке выбора,
  и агрегируемый столбец является внешней ссылкой. 

Этот запрос не выполнен, поскольку условие в предложении WHERE оценивается до того, как произойдет группировка. На самом деле, WHERE понятия не имеет, что такое группа, поэтому не может выполнять над группами никаких функций.

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

Оставить комментарий

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

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

© 2019 Штирлиц Сеть печатных салонов в Перми

Цифровая печать, цветное и черно-белое копирование документов, сканирование документов, ризография в Перми.