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:
Singer | Album | Year | Sale |
The Prodigy | Invaders Must Die | 2008 | 1200000 |
Drowning Pool | Sinner | 2001 | 400000 |
Massive Attack | Mezzanine | 1998 | |
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;Пример 2. Используя оператор SQL HAVING выведем название исполнителя, который исполнялся еще до 1995 года:
SELECT Singer, MIN(Year) FROM Artists GROUP BY Singer HAVING MIN(Year)Самостоятельно создайте таблицу Artists и выполните каждый пример. В комментариях можете писать новые примеры к данной таблице и не только.
- Виктор Черемных
- 29 июня, 2018
- One Comment
Группа в VK
Обнаружили опечатку?
Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!
Свежие статьи
Облако меток
Instagram Vk Youtube Telegram OdnoklassnikiПолезно знать
Рубрики
Авторы
SQL Предложение HAVING | Предложение SQL HAVING с синтаксисом и примером
Предложение «Наличие» в SQL используется для операций агрегирования вместе с операторами условий «Где», «группировать по» и «упорядочить по». Он применяется к таблице/базе данных, где необходимо фильтровать совокупные результаты, и допускает условия «группировать по» и «упорядочивать по». Когда в запросе используется предложение «имея», ожидается, что результирующий набор выходных данных может содержать более одной записи из таблицы/базы данных.
Почему ИМЕЕТ, а не ГДЕ?
Чтобы ответить на этот вопрос, нам нужно понять, как механизм SQL обрабатывает два предложения. Предложение FROM в каждой команде SQL сообщает механизму, откуда считывать строки. Данные сохраняются на диске и загружаются в память для обработки. По мере того как строки считываются одна за другой с диска в память, они проверяются на наличие предложения WHERE. Строки, которые не соответствуют предложению WHERE, не загружаются в память. Таким образом, предложение WHERE оценивается для каждой строки по мере их обработки механизмом SQL.
Наоборот, предложение HAVING появляется только после того, как строки загружены в память. После загрузки в память агрегатные функции выполняют свою задачу над строками, ИМЕЮЩИМИ желаемое условие.
Теперь, если бы мы поместили предложение WHERE с агрегатной функцией, такой как avg(), это запутало бы механизм SQL при выборе того, следует ли включать строку для вычисления среднего значения или нет. По сути, мы бы приказывали движку не читать строку, поскольку она не соответствует критерию avg() в предложении WHERE. Но, эй, чтобы определить, соответствует ли он критерию расчета avg() или нет, строку необходимо считать в память. Состояние тупика.
Синтаксис:
SELECT <столбцы> ОТ <таблицы> ГДЕ <условие> -- необязательно GROUP BY-- группирует строки для применения агрегатной функции. HAVING -- агрегатная функция в условии ORDER BY <столбцы>; -- определить порядок сортировки, необязательный
Примечание: Предложение GROUP BY требуется с предложением HAVING.
Как работает предложение 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 | 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 для получения дополнительной информации.
- Запрос вставки SQL
- Внешний ключ в SQL
- Отдельное ключевое слово в SQL
- Представления 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;
Разработчик | 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 и WHEREHAVING очень похож на WHERE. На самом деле, все параметры и приемы, которые вы уже узнали о WHERE (включая подстановочные знаки и несколько операторов), можно применить и к HAVING. Единственная разница в том, что WHERE фильтрует строки, а HAVING фильтрует группы. Это связано с тем, что WHERE действует на данные до того, как они будут сгруппированы, а HAVING действует на данные после того, как группы были созданы. Чтобы продемонстрировать, давайте изменим приведенный выше пример, чтобы поместить условие группировки в предложение WHERE вместо HAVING: SELECT Задание, COUNT(*) AS emp_count ОТ сотрудников ГДЕ СЧИТАТЬ (*) > 1 СГРУППИРОВАТЬ ПО РАБОТЕ; --Агрегат не может появляться в предложении WHERE, если только он не в подзапросе, содержащемся в предложении HAVING или списке выбора, и агрегируемый столбец является внешней ссылкой. Этот запрос не выполнен, поскольку условие в предложении WHERE оценивается до того, как произойдет группировка. На самом деле, WHERE понятия не имеет, что такое группа, поэтому не может выполнять над группами никаких функций. Прежде чем добавлять условие в запрос с предложением GROUP BY, хорошо подумайте, работает ли условие с необработанными данными, и в этом случае оно относится к предложению WHERE; и если он работает с сгруппированными данными, он относится к предложению HAVING. Оставить комментарий
|