HAVING SQL: описание, синтаксис, примеры. Having group by sql описание
Команда HAVING - условие для GROUP BY
Команда HAVING позволяет фильтровать результат группировки, сделанной с помощью команды GROUP BY.
См. также команду WHERE, которая задает условие на выборку записей.
Синтаксис
GROUP BY поле HAVING условиеПримеры
Все примеры будут по этой таблице workers, если не сказано иное:
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 ageSQL запрос выберет следующие строки:
23 | 600 |
24 | 3000 |
25 | 1000 |
А теперь с помощью условия HAVING оставим только те строки, в которых суммарная зарплата больше или равна 1000:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age HAVING sum>=1000SQL запрос выберет следующие строки:
24 | 3000 |
25 | 1000 |
Пример
Подсчитаем с помощью функции COUNT количество записей в группе (не используя HAVING):
SELECT age, COUNT(*) as count FROM workers GROUP BY ageSQL запрос выберет следующие строки:
23 | 3 |
24 | 2 |
25 | 1 |
А теперь с помощью условия HAVING оставим только те группы, в которых количество строк меньше или равно двум:
SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING countSQL запрос выберет следующие строки:
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.
code.mu
HAVING SQL: описание, синтаксис, примеры
SQL представляет собой стандарт языка для работы с реляционными базами данных. Он имеет в своем арсенале множество мощных инструментов манипулирования данными, хранящихся в виде таблиц.
Несомненно, возможность группировать данные при их выборке по определенному признаку является одним из таких инструментов. Оператор SQL HAVING наряду с оператором WHERE позволяет определять условия выборки уже сгруппированных некоторым образом данных.
Параметр HAVING SQL: описание
Прежде всего стоит отметить, что данный параметр является необязательным и применяется исключительно в связке с параметром GROUP BY. Как вы помните, GROUP BY применяется тогда, когда в SELECT используются агрегатные функции, и результаты их вычислений нужно получить по определенным группам. Если WHERE позволяет задать условия выборки перед тем, как данные будут сгруппированы, то HAVING содержит условия, касающиеся данных уже непосредственно в самих группах. Для лучшего понимания давайте разберем пример со схемой, представленный на рисунке ниже.
Это отличный пример, дающий HAVING SQL описание. Дана таблица с перечнем наименований продукции, компаниями, выпускающими их, и некоторыми другими полями. В запросе в верхнем правом углу мы пытаемся получить информацию о том, какое количество наименований продукции выпускает каждая компания, при этом в результат мы хотим вывести только те компании, которые выпускают более 2 наименований. Параметр GROUP BY сформировал три группы, соответствующие названиям компаний, для каждой из которых посчитано количество продукции (строк). Но параметр HAVING своим условием отсек одну группу из результирующей выборки, поскольку она не удовлетворяла условию. В результате мы получаем две группы, соответствующие компаниям с количеством продукции 5 и 3.
Может возникнуть вопрос о том, зачем использовать HAVING, если в SQL имеется WHERE. Если бы мы использовали WHERE, то он бы смотрел на общее количество строк в таблице, а не по группам, и условие не имело бы смысла в данном случае. Однако довольно часто они прекрасно уживаются в одном запросе.
На примере выше мы можем видеть, как сначала происходит отбор данных по именам работников, указанным в параметре WHERE, а затем сгруппированный в GROUP BY результат проходит дополнительную проверку по сумме зарплаты для каждого работника.
Параметр SQL HAVING: примеры, синтаксис
Рассмотрим некоторые особенности синтаксиса HAVING SQL. Описание данного параметра довольно простое. Во-первых, как уже отмечалось, он используется исключительно в связке с параметром GROUP BY и указывается сразу же после него и перед ORDER BY, если таковой имеется в запросе. Оно и понятно, так как HAVING определяет условия для уже сгруппированных данных. Во-вторых, в условии этого параметра можно использовать только агрегатные функции и поля, указанные в параметре GROUP BY. Все условия в данном параметре указываются точно таким же образом, как и в случае с WHERE.
Заключение
Как видите, ничего сложного в данном операторе нет. Семантически он используется так же, как и WHERE. Важно понять то, что WHERE используют относительно всех выбираемых данных, а HAVING - только по отношению к группам, определенным в параметре GROUP BY. Мы представили исчерпывающее для HAVING SQL описание, которого достаточно для уверенной работы с ним.
fb.ru
HAVING оператор | Oracle PL/SQL •MySQL •SQL Server
Этот SQL учебник объясняет, как использовать SQL HAVING с синтаксисом и примерами.
Описание
SQL оператор HAVING используется в сочетании с GROUP BY, чтобы ограничить группы возвращаемых строк, только тех, чьи условия истинны.
Синтаксис
SELECT expression1, expression2, … expression_n,aggregate_function (aggregate_expression)FROM tables[WHERE conditions]GROUP BY expression1, expression2, … expression_nHAVING condition;
Параметры или аргументы
expression1, expression2, … expression_n — выражения, которые не входят в aggregate_function и должны быть включены в предложение GROUP BY в конце оператора SQL.
aggregate_function — это функция, такая как SUM, COUNT, функции MIN, MAX или AVG.
aggregate_expression – это столбец или выражение, которое используется в aggregate_function.
tables – таблицы из которых вы хотите выгрузить данные. После оператора FROM должна быть указана хотя бы одна таблица.
WHERE conditions. Необязательный. Условия, которые должны быть выполнены для выбранных записей.
HAVING condition. Это еще одно условие применяется только к агрегированным результатам, чтобы ограничить группы возвращаемых строк. В набор результатов будут включены только те группы, состояние которых оценивается как TRUE.
Пример — Использование функции SUM
Рассмотрим на примере SQL HAVING, который использует функцию SUM.
Вы можете использовать функцию SUM, чтобы вернуть наименование department (отдела) и total sales (общий объем продаж в соответствующем отделе). SQL HAVING будет фильтровать результаты, так, что будут возвращены только department с total sales более $ 1000.
SELECT department, SUM(sales) AS "Total sales" FROM order_details GROUP BY department HAVING SUM(sales) > 1000;
SELECT department, SUM(sales) AS "Total sales" FROM order_details GROUP BY department HAVING SUM(sales) > 1000; |
Пример — Использование функции COUNT
Рассмотрим, как можно использовать HAVING с помощью функции COUNT.
Вы можете использовать функцию COUNT, чтобы вернуть название department (отдела) и number of employees (численность работников в соответствующем отделе), которые делают более $ 25000 / год. SQL оператор HAVING будет фильтровать результаты, так что будут возвращены department с более чем 10 сотрудников.
SELECT department, COUNT(*) AS "Number of employees" FROM employees WHERE salary > 25000 GROUP BY department HAVING COUNT(*) > 10;
SELECT department, COUNT(*) AS "Number of employees" FROM employees WHERE salary > 25000 GROUP BY department HAVING COUNT(*) > 10; |
Пример — Использование функции MIN
В следующем примере рассмотрим, как можно использовать HAVING с помощью функции MIN.
Можно также использовать функцию SQL MIN, чтобы вернуть название каждого department (отдела) и minimum salary (минимальную зарплату в отделе). SQL оператор HAVING будет возвращать только те department, где minimum salary составляет более $ 35 000.
SELECT department, MIN(salary) AS "Lowest salary" FROM employees GROUP BY department HAVING MIN(salary) > 35000;
SELECT department, MIN(salary) AS "Lowest salary" FROM employees GROUP BY department HAVING MIN(salary) > 35000; |
Пример — Использование функции MAX
И, наконец, рассмотрим, как можно использовать HAVING с помощью функции MAX.
Вы можете также использовать функцию MAX, чтобы вернуть название каждого department (отдела) и maximum salary (максимальную зарплату в отделе). SQL оператор HAVING будет возвращать только те department, где maximum salary менее $ 50000.
SELECT department, MAX(salary) AS "Highest salary" FROM employees GROUP BY department HAVING MAX(salary) < 50000;
SELECT department, MAX(salary) AS "Highest salary" FROM employees GROUP BY department HAVING MAX(salary) < 50000; |
oracleplsql.ru
4.4. GROUP BY и агрегатные функции SQL
Ид_Сотр. | Фамилия | Имя | Отчество | Год_рожд. | Пол |
|
|
|
|
|
|
2 | Петров | Иван | Иванович | 1949 | М |
|
|
|
|
|
|
3 | Сидоров | Петр | Петрович | 1947 | М |
|
|
|
|
|
|
4 | Панов | Антон | Михайлович | 1975 | М |
|
|
|
|
|
|
5 | Петухов | Виктор | Борисович | 1940 | М |
|
|
|
|
|
|
7 | Петрова | Нина | Николаевна | 1970 | Ж |
|
|
|
|
|
|
8 | Сидорова | Екатерина | Ивановна | 1970 | Ж |
|
|
|
|
|
|
9 | Никитин | Валентин | Сергеевич | 1952 | М |
|
|
|
|
|
|
11 | Попов | Анатолий | Михайлович | 1947 | М |
|
|
|
|
|
|
| Рис. 4.20. Использование LIKE "^[Д-М]%" |
|
РЕЗЮМЕ
Теперь Вы можете создавать предикаты в терминах связей специально определенных SQL. Вы можете искать значения в определенном диапазоне (BETWEEN) или в числовом наборе (IN), или Вы можете искать символьные значения, которые соответствуют тексту внутри параметров (LIKE).
Результатом запроса может быть обобщенное групповое значение полей, точно так же, как и значение одного поля. Это делается с помощью стандартных агрегатных функций SQL, список которых приведен ниже:
COUNT | - число значений в столбце, |
SUM | - арифметическая сумма значений в столбце, |
AVG | - арифметическое среднее значение в столбце, |
MAX | - самое большое значение в столбце, |
MIN | - самое маленькое значение в столбце. |
Кроме специального случая COUNT(*), каждая из этих функций оперирует совокупностью значений столбца некоторой таблицы и выдает только одно значение.
Аргументу всех функций, кроме COUNT(*), может предшествовать ключевое слово DISTINCT (различный), указывающее, что дублирующие значения столбца
должны быть исключены перед тем, как будет применяться функция. Специальная же функция COUNT(*) служит для подсчета всех без исключения строк в таблице (включая дубликаты).
Агрегатные функции используются подобно именам полей в предложении запроса SELECT, но с одним исключением: они берут имена поля как аргументы. Только числовые поля могут использоваться с SUM и AVG.
С COUNT, MAX, и MIN могут использоваться и числовые или символьные поля. Когда они используются с символьными полями, MAX и MIN будут транслировать их в эквивалент ASCII кода, который должен сообщать, что MIN будет означать первое, а MAX - последнее значение в алфавитном порядке.
Чтобы найти SUM всех окладов в таблице ОТДЕЛ_СОТРУДНИК (рис. 2.3) надо ввести следующий запрос:
SELECT SUM ((Оклад)) | AS СУММА |
FROM Отдел_ Сотрудники;
И на экране увидим результат: 46800 (в таблице будет один столбец с именем СУММА).
Подсчет среднего значения по окладам также прост:
SELECT AVG ((Оклад))
FROM Отдел_ Сотрудники;
И на экране увидим результат: | 3342.85 |
Функция COUNT несколько отличается от всех. Она считает число значений в данном столбце или число строк в таблице. Когда она считает значения столбца, она используется с DISTINCT (различных) чтобы производить счет чисел уникальных значений в данном поле.
SELECT COUNT (DISTINCT | ОКЛАД) |
FROM Отдел_ Cотрудники; |
|
Результат: 8. |
|
В таблице восемь строк, в которых находятся различные значения окладов.
Отметим, что в последних трех примерах учитывается информация и об уволенных сотрудниках.
Следующее предложение позволяет определить число подразделений на
предприятии: |
|
SELECT COUNT (DISTINCT | Ид_Отд) |
FROM Отдел_Cотрудники; |
|
Результат: 3. |
|
DISTINCT, сопровождаемый именем поля, с которым он применяется, помещенный в круглые скобки, с COUNT применяется к индивидуальным столбцам.
Чтобы подсчитать общее число строк в таблице, используется COUNT со звездочкой вместо имени поля:
SELECT COUNT (*)
FROM Отдел_ Сотрудники;
Ответ будет: | 11. |
COUNT (*) подсчитывает все без исключения строки таблицы.
DISTINCT не применим c COUNT (*).
Предположим, что таблица ВЕДОМОСТЬ_ОПЛАТЫ (рис. 2.4) имеет еще один столбец, который хранит сумму произведенных вычетов (поле Вычет) для каждой строки ведомости. Тогда если Вас интересует вся сумма, то содержимое столбца Сумма иВычет надо сложить.
Если же Вас интересует максимальная сумма с учетом вычетов, содержащаяся в ведомости, то это можно сделать с помощью следующего предложения:
SELECT MAX (Сумма + Вычет)
FROM Ведомость_ оплаты;
Для каждой строки таблицы этот запрос будет складывать значение поля Сумма со значением поляВычет и выбирать самое большое значение, которое он найдет.
ПРЕДЛОЖЕНИЕ GROUP BY (перекомпоновка, порядок)
Предложение GROUP BY позволяет определять подмножество значений в особом поле в терминах другого поля и применять функцию агрегата к подмножеству. Это дает возможность объединять поля и агрегатные функции в едином предложении SELECT.
Например, предположим, что Вы хотите определить, сколько сотрудников находятся в каждом отделе (ответ приведен на рис. 4.21):
SELECT Ид_Отд, COUNT (DISTINCT Ид_Отд) AS Кол-во_сотрудников
FROM | Отдел_ Сотрудники |
| |
WHERE | Дата_ увольнения | NOT NULL | |
GROUP BY |
| Ид_Отд; |
|
|
|
|
|
|
| Ид_Отд | Кол-во_сотрудников |
|
|
|
|
|
| 1 | 5 |
|
|
|
|
|
| 2 | 4 |
|
|
|
|
|
| 3 | 1 |
|
|
|
|
Рис. 4.21. Запрос с группировкой
В результате выполнения предложения GROUP BY остаются только уникальные значения столбцов, по умолчанию отсортированныепо возрастанию. В этом аспекте предложение GROUP BY отличается от предложения ORDER BY тем, что последнее хотя и сортирует записи по возрастанию, но не удаляет повторяющиеся значения. В приведенном примере запрос группирует строки таблицы по значениям столбцаИд_Отд (по номерам отделов). Строки с одинаковыми номерами отделов сначала объединяются в группы, но при этом для каждой группы отображается только одна строка. Во втором столбце выводится количество строк в каждой группе, т.е. число сотрудников в каждом отделе.
Значение поля, к которому применяется GROUP BY, имеет, по определению, только одно значение на группу вывода так же, как это делает агрегатная функция. Результатом является совместимость, которая позволяет агрегатам и полям объединяться таким образом.
Пусть, например, таблица ВЕДОМОСТЬ_ОПЛАТЫ имеет вид рис. 4.22 и мы хотим определить максимальную сумму, выплаченную по ведомости каждому сотруднику.
Ид_сотр | Ид_Отд | Дата | Сумма | Вид_оплаты |
|
|
|
|
|
1 | 1 | 02.03.03 | 1200 |
|
|
|
|
|
|
2 | 1 | 01.03.03 | 1200 |
|
|
|
|
|
|
3 | 1 | 01.03.03 | 1000 |
|
|
|
|
|
|
1 | 1 | 01.04.03 | 1200 |
|
|
|
|
|
|
1 | 1 | 01.03.03 | 800 |
|
|
|
|
|
|
2 | 1 | 02.04.03 | 2000 |
|
|
|
|
|
|
| Рис. 4.22. Состояние таблицы Ведомость1 |
SELECT | ИД_Сотр, MAX (Сумма) AS "Сумма максимальная" |
FROM | Ведомость1 |
GROUP | BY ИД_Сотр; |
В результате получим.
Ид_сотр | Сумма_максимальная |
|
|
3 | 1000 |
|
|
1 | 1200 |
|
|
2 | 2000 |
|
|
Рис. 4.23. Агрегатная функция с AS
Группировка может быть осуществлена и по нескольким атрибутам: SELECT Ид_сотр, Дата, MAX ((Сумма))
FROM Ведомость1
GROUP BY Ид_сотр, Дата;
Результат:
Ид_сотр | Дата |
|
|
|
|
1 | 01.03.03 | 800 |
|
|
|
1 | 02.03.03 | 1200 |
|
|
|
1 | 01.04.03 | 1200 |
|
|
|
2 | 01.03.03 | 1200 |
|
|
|
2 | 02.04.03 | 2000 |
|
|
|
2 | 01.03.03 | 1000 |
|
|
|
Рис. 4.24. Группировка по нескольким атрибутам
Если же возникает необходимость ограничить число групп, полученных после GROUP BY, то, используя предложение HAVING, можно это реализовать.
4.5. Использование фразы HAVING
Фраза HAVING играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение
лишь при наличии фразы GROUP BY, а выражение в HAVING должно принимать единственное значение для группы.
Например, пусть надо выдать количественный состав всех отделов (рис. 2.3), исключая отдел с номером 3.
SELECT Ид_Отд, COUNT (DISTINCT Ид_Отд) AS Кол-во_сотрудников
FROM | Отдел_ Сотрудники | |||
WHERE | Дата_ увольнения |
| NOT NULL | |
GROUP BY |
| Ид_Отд | HAVING Ид_Отд < > 3; | |
|
|
|
|
|
|
| Ид_Отд |
| Кол_во_сотрудников |
|
|
|
|
|
|
| 1 |
| 5 |
|
|
|
|
|
|
| 2 |
| 4 |
|
|
|
|
|
Рис. 4.25. Запрос с группировкой и ограничением
Последним элементом при вычислении табличного выражения используется раздел HAVING (если он присутствует). Синтаксис этого раздела следующий:
<having clause> ::=
HAVING <search condition>
Условие поиска этого раздела задает условие на группу строк сгруппированной таблицы. Формально раздел HAVING может присутствовать и в табличном выражении, не содержащем GROUP BY. В этом случае полагается, что результат вычисления предыдущих разделов представляет собой сгруппированную таблицу, состоящую из одной группы без выделенных столбцов группирования.
Условие поиска раздела HAVING строится по тем же синтаксическим правилам, что и условие поиска раздела WHERE, и может включать те же самые предикаты.
Однако имеются специальные синтаксические ограничения по части использования в условии поиска спецификаций столбцов таблиц из раздела FROM данного табличного выражения. Эти ограничения следуют из того, что условие поиска раздела HAVING задает условие на целую группу, а не на индивидуальные строки.
Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.
Пусть запрос вида (в качестве базовой таблицы см. рис. 4.22):
SELECT Ид_сотр, Дата, MAX ((Сумма))
FROM Ведомость1
GROUP BY Ид_сотр, Дата;
необходимо уточнить тем, чтобы были показаны только выплаты, превышающие 1000.
Однако по стандарту агрегатную функцию в предложении WHERE использовать запрещено (если вы не используете подзапрос, описанный позже), потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах группы строк.
Следующее предложение будет неправильным:
SELECT Ид_сотр, Дата, MAX (Сумма)
FROM Ведомость1
WHERE MAX ((Сумма)) > 1000 GROUP BY Ид_сотр, Дата;
Правильным предложением будет:
SELECT Ид_сотр, Дата, MAX ((Сумма))
studfiles.net
MS SQL Server и T-SQL
Операторы GROUP BY и HAVING
Последнее обновление: 19.07.2017
Для группировки данных в T-SQL применяются операторы GROUP BY и HAVING, для использования которых применяется следующий формальный синтаксис:
SELECT столбцы FROM таблица [WHERE условие_фильтрации_строк] [GROUP BY столбцы_для_группировки] [HAVING условие_фильтрации_групп] [ORDER BY столбцы_для_сортировки]GROUP BY
Оператор GROUP BY определяет, как строки будут группироваться.
Например, сгруппируем товары по производителю
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products GROUP BY ManufacturerПервый столбец в выражении SELECT - Manufacturer представляет название группы, а второй столбец - ModelsCount представляет результат функции Count, которая вычисляет количество строк в группе.
Стоит учитывать, что любой столбец, который используется в выражении SELECT (не считая столбцов, которые хранят результат агрегатных функций), должны быть указаны после оператора GROUP BY. Так, например, в случае выше столбец Manufacturer указан и в выражении SELECT, и в выражении GROUP BY.
И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM ProductsДругой пример, добавим группировку по количеству товаров:
SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer, ProductCountОператор GROUP BY может выполнять группировку по множеству столбцов.
Если столбец, по которому производится группировка, содержит значение NULL, то строки со значением NULL составят отдельную группу.
Следует учитывать, что выражение GROUP BY должно идти после выражения WHERE, но до выражения ORDER BY:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products WHERE Price > 30000 GROUP BY Manufacturer ORDER BY ModelsCount DESCФильтрация групп. HAVING
Оператор HAVING определяет, какие группы будут включены в выходной результат, то есть выполняет фильтрацию групп.
Применение HAVING во многом аналогично применению WHERE. Только есть WHERE применяется к фильтрации строк, то HAVING используется для фильтрации групп.
Например, найдем все группы товаров по производителям, для которых определено более 1 модели:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer HAVING COUNT(*) > 1При этом в одной команде мы можем использовать выражения WHERE и HAVING:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING COUNT(*) > 1То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары группируются по производителям. И далее фильтруются сами группы - выбираются те группы, которые содержат больше 1 модели.
Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:
SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Units DESCВ данном случае группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models) и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.
metanit.com
Команда SELECT Раздел Раздел HAVING - Условия поиска на группу строк - HAVING COUNT и HAVING MIN
Раздел HAVING
Наконец, последним при вычислении табличного выражения используется раздел HAVING (если он присутствует).
Раздел HAVING может осмысленно появиться в табличном выражении только в том случае, когда в нем присутствует раздел GROUP BY. Условие поиска этого раздела задает условие на группу строк сгруппированной таблицы. Формально раздел HAVING может присутствовать и в табличном выражении, не содержащем GROUP BY. В этом случае полагается, что результат вычисления предыдущих разделов представляет собой сгруппированную таблицу, состоящую из одной группы без выделенных столбцов группирования.
Условие поиска раздела HAVING строится по тем же синтаксическим правилам, что и условие поиска раздела WHERE, и может включать те же самые предикаты. Однако имеются специальные синтаксические ограничения по части использования в условии поиска спецификаций столбцов таблиц из раздела FROM данного табличного выражения. Эти ограничения следуют из того, что условие поиска раздела HAVING задает условие на целую группу, а не на индивидуальные строки.
Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.
Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.
HAVING COUNT
Выбрать коды товаров, покупаемых более чем одним покупателем:
SELECT stock FROM ordsale GROUP BY stock HAVING COUNT(*) > 1;
HAVING MIN
Получить значения минимального и максимального оклада для клерков каждого отдела, где самое низкое жалованье составляет менее $1,000:
SELECT deptno, MIN(sal), MAX(sal) FROM emp WHERE job = ‘CLERK’ GROUP BY deptno HAVING MIN(sal)
sql-language.ru
HAVING SQL: описание, синтаксис, примеры
Компьютеры 11 декабря 2016SQL представляет собой стандарт языка для работы с реляционными базами данных. Он имеет в своем арсенале множество мощных инструментов манипулирования данными, хранящихся в виде таблиц.
Несомненно, возможность группировать данные при их выборке по определенному признаку является одним из таких инструментов. Оператор SQL HAVING наряду с оператором WHERE позволяет определять условия выборки уже сгруппированных некоторым образом данных.
Параметр HAVING SQL: описание
Прежде всего стоит отметить, что данный параметр является необязательным и применяется исключительно в связке с параметром GROUP BY. Как вы помните, GROUP BY применяется тогда, когда в SELECT используются агрегатные функции, и результаты их вычислений нужно получить по определенным группам. Если WHERE позволяет задать условия выборки перед тем, как данные будут сгруппированы, то HAVING содержит условия, касающиеся данных уже непосредственно в самих группах. Для лучшего понимания давайте разберем пример со схемой, представленный на рисунке ниже.
Это отличный пример, дающий HAVING SQL описание. Дана таблица с перечнем наименований продукции, компаниями, выпускающими их, и некоторыми другими полями. В запросе в верхнем правом углу мы пытаемся получить информацию о том, какое количество наименований продукции выпускает каждая компания, при этом в результат мы хотим вывести только те компании, которые выпускают более 2 наименований. Параметр GROUP BY сформировал три группы, соответствующие названиям компаний, для каждой из которых посчитано количество продукции (строк). Но параметр HAVING своим условием отсек одну группу из результирующей выборки, поскольку она не удовлетворяла условию. В результате мы получаем две группы, соответствующие компаниям с количеством продукции 5 и 3.
Может возникнуть вопрос о том, зачем использовать HAVING, если в SQL имеется WHERE. Если бы мы использовали WHERE, то он бы смотрел на общее количество строк в таблице, а не по группам, и условие не имело бы смысла в данном случае. Однако довольно часто они прекрасно уживаются в одном запросе.
На примере выше мы можем видеть, как сначала происходит отбор данных по именам работников, указанным в параметре WHERE, а затем сгруппированный в GROUP BY результат проходит дополнительную проверку по сумме зарплаты для каждого работника.
Параметр SQL HAVING: примеры, синтаксис
Рассмотрим некоторые особенности синтаксиса HAVING SQL. Описание данного параметра довольно простое. Во-первых, как уже отмечалось, он используется исключительно в связке с параметром GROUP BY и указывается сразу же после него и перед ORDER BY, если таковой имеется в запросе. Оно и понятно, так как HAVING определяет условия для уже сгруппированных данных. Во-вторых, в условии этого параметра можно использовать только агрегатные функции и поля, указанные в параметре GROUP BY. Все условия в данном параметре указываются точно таким же образом, как и в случае с WHERE.
Видео по теме
Заключение
Как видите, ничего сложного в данном операторе нет. Семантически он используется так же, как и WHERE. Важно понять то, что WHERE используют относительно всех выбираемых данных, а HAVING - только по отношению к группам, определенным в параметре GROUP BY. Мы представили исчерпывающее для HAVING SQL описание, которого достаточно для уверенной работы с ним.
Источник: fb.ru Компьютеры MySQL LIMIT: описание, синтаксис, примеры и рекомендацииВыбор конкретного количества записей из большого набора - идея хорошая, но когда набор действительно большой, возникает эффект деградации идеи. Выбор нескольких записей с некоторой позиции создаёт реальное падение про...
Компьютеры Coalesce sql: описание, особенности использования, примерыПри составлении sql-запросов нередко возникает ситуация, когда при выборке данных надо сравнить значения нескольких столбцов и вывести то из них, которое содержит данные (не пустое). Эту задачу отлично решает выражени...
Компьютеры Оператор SQL INNER JOIN: примеры, синтаксис и особенностиРазработка любой базы данных подразумевает не только создание и наполнение таблиц разнообразной информацией, но и дальнейшую работу с данными. Для корректного выполнения разнообразных задач по выбору данных из таблиц ...
Дом и семья Загадка про собаку для детей. Общее описание и примерыКаждый ребенок должен развиваться в соответствии со своим возрастом. Однажды приходит время, когда малышу становятся интересны разные задачки. В данной статье будет рассказано про загадки детские про собаку.
Искусство и развлечения Жанры песен: описание и примеры.Песня – один из распространённых жанров вокальной музыки, она объединяет в себе стихотворный текст с несложной для запоминания мелодией. Песни могут исполняться одним исполнителем, а также группой или хором, с и...
Компьютеры Как составлять SQL-запросы - подробные примерыКаждый из нас регулярно сталкивается и пользуется различными базами данных. Когда мы выбираем адрес электронной почты, мы работаем с базой данных. Базы данных используют поисковые сервисы, банки для хранения данных о ...
Образование Листорасположение очередное: описание и примерыЛисторасположение, или филлотаксис - это некая схема, по которой расположены листья на стебле растения. Даже на первый взгляд можно определить, что они никогда не растут в хаотичном порядке, и на это есть важные причи...
Образование Течения Мирового океана. Что такое холодное и теплое течение? Описание и примерыОкеанические или морские течения – горизонтальное перемещение водных масс. Как правило, их движение происходит в строго определённом направлении и может иметь большую протяжённость. Карта течений, которая распол...
Образование Популяционно-видовой уровень организации жизни. Описание и примерыВ современной биологии живую материю принято рассматривать как иерархическую структуру. Каждый уровень представляет собой систему взаимосвязанных элементов. При этом отдельная структурная единица одновременно является...
Образование Реакции замещения: описание, уравнение, примерыМногие реакции замещения открывают путь к получению разнообразных соединений, имеющих хозяйственное применение. Огромная роль в химической науке и промышленности отводится электрофильному и нуклеофильному замещению. В...
monateka.com