Count mysql having: HAVING оператор MySQL — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
HAVING оператор MySQL — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
В этом учебном пособии вы узнаете, как использовать MySQL оператор HAVING с синтаксисом и примерами.
Описание
MySQL оператор HAVING используется в сочетании с оператором GROUP BY, чтобы ограничить группы возвращаемых строк только тех, чье условие TRUE.
Синтаксис
Синтаксис оператора HAVING в MySQL:
SELECT expression1, expression2, … expression_n,
aggregate_function (expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, … expression_n
HAVING condition;
Параметры или аргументы
aggregate_function — функция, такая как функции SUM, COUNT, MIN, MAX или AVG.
expression1, expression2, … expression_n — выражения, которые не заключены в агрегированную функцию и должны быть включены в предложение GROUP BY.
WHERE conditions — необязательный. Это условия для выбора записей.
HAVING condition — Это дополнительное условие применяется только к агрегированным результатам для ограничения групп возвращаемых строк. В результирующий набор будут включены только те группы, состояние которых соответствует TRUE.
Пример использования функции SUM
Рассмотрим пример MySQL оператора HAVING, в котором используется функция SUM.
Вы также можете использовать функцию SUM, чтобы вернуть имя product и общее количество (для этого product). MySQL оператор HAVING будет фильтровать результаты так, чтобы возвращались только product с общим количеством больше 10.
SELECT product, SUM(quantity) AS «Total quantity»
FROM order_details
GROUP BY product
HAVING SUM(quantity) > 10;
SELECT product, SUM(quantity) AS «Total quantity» FROM order_details GROUP BY product HAVING SUM(quantity) > 10; |
Пример использования функции COUNT
Рассмотрим, как мы можем использовать оператор HAVING с функцией COUNT в MySQL.
Вы можете использовать функцию COUNT, чтобы вернуть имя product и количество заказов (для этого product), которые находятся в категории ‘produce’. MySQL оператор HAVING будет фильтровать результаты так, чтобы возвращались только product с более чем 20 заказами.
SELECT product, COUNT(*) AS «Number of orders»
FROM order_details
WHERE category = ‘produce’
GROUP BY product
HAVING COUNT(*) > 20;
SELECT product, COUNT(*) AS «Number of orders» FROM order_details WHERE category = ‘produce’ GROUP BY product HAVING COUNT(*) > 20; |
Пример использования функции MIN
Рассмотрим, как мы можем использовать оператор HAVING с функцией MIN в MySQL.
Вы также можете использовать функцию MIN, чтобы вернуть имя каждого department и минимальную зарплату в department. MySQL оператор HAVING будет возвращать только те department, где минимальная зарплата составляет менее 50000 биткоинов :).
SELECT department, MIN(salary) AS «Lowest salary»
FROM employees
GROUP BY department
HAVING MIN(salary) < 50000;
SELECT department, MIN(salary) AS «Lowest salary» FROM employees GROUP BY department HAVING MIN(salary) < 50000; |
Пример использования функции MAX
Наконец, давайте посмотрим, как мы можем использовать оператор HAVING с функцией MAX в MySQL.
Например, вы также можете использовать функцию MAX для возврата имени каждого department и максимальной заработной платы в department. Предложение MySQL HAVING будет возвращать только те department, чья максимальная заработная плата превышает 25000 биткоинов :).
SELECT department, MAX(salary) AS «Highest salary»
FROM employees
GROUP BY department
HAVING MAX(salary) > 25000;
SELECT department, MAX(salary) AS «Highest salary» FROM employees GROUP BY department HAVING MAX(salary) > 25000; |
Команда HAVING — условие для GROUP BY
Команда HAVING позволяет фильтровать результат группировки,
сделанной с помощью команды GROUP BY.
См. также команду WHERE,
которая задает условие на выборку записей.
Синтаксис
GROUP BY поле HAVING условие
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 100 |
2 | Петя | 23 | 200 |
3 | Вася | 23 | 300 |
4 | Коля | 24 | 1000 |
5 | Иван | 24 | 2000 |
6 | Кирилл | 25 | 1000 |
Пример
В данном примере демонстрируется работа GROUP BY без условия HAVING:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
23 | 600 |
24 | 3000 |
25 | 1000 |
А теперь с помощью условия HAVING оставим только те строки, в которых
суммарная зарплата больше или равна 1000:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age HAVING sum>=1000
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
24 | 3000 |
25 | 1000 |
Пример
Подсчитаем с помощью функции COUNT
количество записей в группе (не используя HAVING):
SELECT age, COUNT(*) as count FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | count количество |
---|---|
23 | 3 |
24 | 2 |
25 | 1 |
А теперь с помощью условия HAVING оставим только те группы, в которых
количество строк меньше или равно двум:
SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count
SQL запрос выберет следующие строки:
age возраст | count количество |
---|---|
24 | 2 |
25 | 1 |
Аналогичного эффекта можно достигнуть, если воспользоваться
командой IN:
SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count IN(1,2)
Можно также использовать команду BETWEEN:
SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count BETWEEN 1 AND 2
Как вы видите, в HAVING допустимы все команды,
используемые в условии WHERE.
полезный трюк с count() и count(distinct) / Песочница / Хабр
Хочу поделиться одним интересным решением, к которому мне удалось прийти сегодня во время оптимизации запроса поиска пользователей. В выборке необходимо было возвращать количество общих групп текущего пользователя и меня — того, кто производит поиск. Что называется total shared groups. В итоге всё поместилось в один компактный запрос без подзапросов (что очень критично, позже объясню почему) с использованием одной таблицы в FROM, без GROUP BY и HAVING.
Представим задачу более наглядно. Примем следующие таблицы:
— group (group_id)
— user (user_id)
— user_group (хранит связки user_id-group_id)
Необходимо узнать количество групп, в котором состоят пользователи user1 и user2. То есть найти пересечения между юзерами по таблице user_group.
1. Следующий запрос выдаст количество всех записей из таблицы user_group, которые принадлежат юзерам user1 и user2.SELECT
COUNT(`group_id`)
FROM
`user_group`
WHERE
`user_id` IN (:user1,:user2)
2. А вот этот запрос выдаст количество записей из таблицы user_group, которые принадлежат юзерам user1 и user2, но с уникальным group_id:SELECT
COUNT(DISTINCT `group_id`)
FROM
`user_group`
WHERE
`user_id` IN (:user1,:user2)
В данном случае, если нашлись такие группы, которые были привязаны сразу к двум нашим пользователям, то они будут «схлопнуты» в одну строку.
3. В итоге приходим к виду:SELECT
COUNT(`group_id`) - COUNT(DISTINCT `group_id`)
FROM
`user_group`
WHERE
`user_id` IN (:user1,:user2)
Если отнять общее число групп двух пользователей и число групп, с учётом уникальности group_id, то в рузультате получим наше искомое total shared groups — сколько общих групп у двух пользователей.
Как ещё можно было решить задачу?SELECT
COUNT(*)
FROM
(
SELECT
`group_id`
FROM
`user_group`
WHERE
`user_id` IN (:user1,:user2)
GROUP BY
`group_id`
HAVING
COUNT(*) > 1
) as `shared_groups`
Такой подход я встречал довольно часто. Но у него есть один существенный минус — использование подзапроса. Если :user1 или :user2 не передаются в запрос, а подставляются динамически из запроса верхнего уровня (например, какой-нибудь `user1`.`user_id`), то данный вариант выдаст ошибку.
MySQL функция COUNT — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
В этом учебном пособии вы узнаете, как использовать MySQL функцию COUNT с синтаксисом и примерами.
Описание
MySQL функция COUNT возвращает количество выражений.
Синтаксис
Синтаксис MySQL функции COUNT:
SELECT COUNT(aggregate_expression)
FROM tables
[WHERE conditions];
ИЛИ синтаксис для функции COUNT при группировке результатов по одному или нескольким столбцам:
SELECT expression1, expression2, … expression_n,
COUNT(aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, … expression_n;
Параметры или аргументы
expression1, expression2, … expression_n — выражения, которые не инкапсулированы в функции COUNT и должны быть включены в предложение GROUP BY в конце SQL запроса.
aggregate_expression — это столбец или выражение, чьи ненулевые значения будут подсчитаны.
tables — таблицы, из которых вы хотите получить записи. Должна быть хотя бы одна таблица, указанная в предложении FROM.
WHERE conditions — необязательный. Это условия, которые должны быть выполнены для выбранных записей.
Включает только значения NOT NULL
Не все это понимают, но функция COUNT будет включать только те записи, где значение выражения COUNT ( expression ) не равно NULL. Когда выражение содержит значение NULL, оно не включается в вычисления COUNT.
Рассмотрим пример функции COUNT, демонстрирующий, как значения NULL оцениваются функцией COUNT.
Например, если у вас есть следующая таблица под названием suppliers:
supplier_id | supplier_name | state |
---|---|---|
1 | Apple | NY |
2 | Meat | |
3 | Cheese |
И если вы запустите следующий оператор SELECT, который использует функцию COUNT:
SELECT COUNT(supplier_id)
FROM suppliers;
SELECT COUNT(supplier_id) FROM suppliers; |
Этот пример COUNT вернет 3 строки, поскольку все значения supplier_id в наборе результатов запроса NOT NULL.
Однако если вы запустили следующий оператор SELECT, который использует функцию COUNT:
SELECT COUNT(state)
FROM suppliers;
SELECT COUNT(state) FROM suppliers; |
Этот пример COUNT будет возвращать только 1 строку, поскольку только одно значение state в результирующем наборе запроса NOT NULL. Это будет первая строка, где state = ‘NY’. Это единственная строка, которая включена в расчет функции COUNT.
Применение
Функция COUNT может использоваться в следующих версиях MySQL:
- MySQL 5.7, MySQL 5.6, MySQL 5.5, MySQL 5.1, MySQL 5.0, MySQL 4.1, MySQL 4.0, MySQL 3.23
Пример с одним выражением
Рассмотрим примеры MySQL функции COUNT, чтобы понять, как использовать функцию COUNT в MySQL.
Например вы можете узнать, сколько сотрудников имеют salary (зарплату) выше 25 000 долларов в год:
SELECT COUNT(*) AS «Количество сотрудников»
FROM employees
WHERE salary > 25000;
SELECT COUNT(*) AS «Количество сотрудников» FROM employees WHERE salary > 25000; |
В этом примере функции COUNT, выражению COUNT (*) присвоили алиас «Количество сотрудников». В результирующем наборе в качестве имени поля будет отображаться «Количество сотрудников».
Пример с использованием DISTINCT
Вы можете использовать предложение DISTINCT в функции COUNT. Например, приведенный ниже SQL запрос возвращает количество уникальных отделов, в которых хотя бы один сотрудник зарабатывает более 35 000 долларов в год.
SELECT COUNT(DISTINCT department) AS «Unique departments»
FROM employees
WHERE salary > 35000;
SELECT COUNT(DISTINCT department) AS «Unique departments» FROM employees WHERE salary > 35000; |
Пример с использованием GROUP BY
В некоторых случаях вам потребуется использовать предложение GROUP BY с функцией COUNT.
Например, вы можете использовать функцию COUNT, чтобы вернуть department (отдел) и number of employees (количество сотрудников в связанном отделе), которые находятся в state (штате) «NY».
SELECT department, COUNT(*) AS «Number of employees»
FROM employees
WHERE state = ‘CA’
GROUP BY department;
SELECT department, COUNT(*) AS «Number of employees» FROM employees WHERE state = ‘CA’ GROUP BY department; |
Поскольку вы указали один столбец в своем операторе SELECT, который не инкапсулирован в функцию COUNT, вы должны использовать предложение GROUP BY. Поэтому поле department должно быть указано в разделе GROUP BY.
агрегатных функций — MySQL с предложением и Count ()
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
.
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;
В этом синтаксисе вы указываете условие в предложении HAVING
. Если строка, которая создается предложением group by, приводит к тому, что group_condition
оценивается как истина, запрос будет включать ее в набор результатов.
Обратите внимание, что предложение HAVING
применяет условие фильтрации к каждой группе строк, а предложение WHERE
применяет условие фильтрации к каждой отдельной строке.
MySQL оценивает предложение HAVING
после предложений FROM
, WHERE
, SELECT
и GROUP BY
и до предложений ORDER BY
и LIMIT
.
Обратите внимание, что стандарт SQL определяет, что HAVING
оценивается до предложения SELECT
и после предложения GROUP BY
.
MySQL HAVING
clause examples
Давайте рассмотрим несколько примеров использования HAVING
clause, чтобы увидеть, как это работает. Для демонстрации мы будем использовать таблицу orderdetails
в образце базы данных.
Следующее использует предложение GROUP BY
для получения номеров заказов, количества товаров, проданных за заказ, и общих продаж для каждого из orderdetails
таблицы:
SELECT номер заказа, СУММ (количество заказов) КАК itemsCount, СУММА (цена за каждый * заказанное количество) КАК Итого ОТ Информация для заказа ГРУППА ПО номеру заказа;
Попробовать
Теперь вы можете определить, для какого заказа общий объем продаж превышает 1000
, используя предложение HAVING
следующим образом:
SELECT номер заказа, СУММ (количествоЗаказано) КАК itemsCount, СУММА (цена за каждый * заказанное количество) КАК Итого ОТ Информация для заказа ГРУППА ПО номер заказа ИМЕЕТ всего> 1000;
Попробовать
Вы можете создать сложное условие в предложении HAVING
, используя такие логические операторы, как OR
и AND
.
В следующем примере предложение HAVING
используется для поиска заказов, общая сумма которых превышает 1000
и содержит более 600
элементов:
SELECT номер заказа, СУММ (количествоЗаказано) КАК itemsCount, СУММА (цена за каждый * заказанное количество) КАК Итого ОТ Информация для заказа ГРУППА ПО номеру заказа ИМЕЕТ всего> 1000 И itemsCount> 600;
Попробовать
Предположим, что вы хотите найти все заказы, которые находятся в состоянии отгрузки и общая сумма которых превышает 1500, вы можете присоединиться к таблице orderdetails
с таблицей orders
, используя INNER JOIN
и примените условие к столбцу status
и total
aggregate, как показано в следующем запросе:
SELECT а.номер заказа, статус, СУММА (цена за каждый * заказанное количество) итого ОТ подробности заказа Заказы INNER JOIN b ON b.ordernumber = a.ordernumber ГРУППА ПО номер заказа, статус ИМЕЕТ status = "Отправлено" И всего> 1500;
Попробовать
Предложение HAVING
полезно только тогда, когда вы используете его с предложением GROUP BY
для генерации вывода отчетов высокого уровня. Например, вы можете использовать предложение HAVING
, чтобы ответить на такие вопросы, как определение количества заказов в этом месяце, этом квартале или этом году, общий объем продаж которых превышает 10K.
В этом руководстве вы узнали, как использовать предложение MySQL HAVING
с предложением GROUP BY
для определения условий фильтрации для групп строк или агрегатов.
- Было ли это руководство полезным?
- Да Нет
.
count — mysql Max, имеющий несколько экземпляров
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира
.
MySQL COUNT ()
Агрегатная функция COUNT ()
возвращает количество строк в наборе результатов оператора SELECT
.
Результатом COUNT ()
является значение BIGINT
.
Если совпадающих строк нет, возвращается значение 0
.
Пример:
ВЫБРАТЬ СЧЕТЧИК (*)
ОТ сакилы.актер;
Результат:
Это говорит нам о 204 записях в таблице субъект
базы данных sakila
.
Если мы добавим предложение WHERE
, мы сможем сузить набор результатов. Как это:
ВЫБРАТЬ СЧЕТЧИК (*)
ОТ sakila.actor
ГДЕ first_name как «B%»;
Результат:
В приведенном выше примере показано, что имеется 10 записей, в которых значение поля first_name
начинается с буквы «B».
Вы можете видеть, что если мы удалим функцию COUNT (*)
, мы получим список всех возвращенных записей. Подсчитав количество строк, мы видим, что было возвращено 10 записей.
ВЫБРАТЬ *
ОТ sakila.actor
ГДЕ first_name как «B%»;
Результат:
Варианты
Функцию COUNT ()
можно использовать по-разному.Вы можете получить разные результаты в зависимости от того, как вы его используете, поэтому стоит понять, как это работает.
COUNT ( выражение )
Возвращает количество строк, содержащих значения, отличные от NULL
.
В следующем примере извлекаются все записи, в которых поле last_name
не содержит значения NULL
:
ВЫБРАТЬ СЧЕТЧИК (фамилия)
ОТ сакилы.актер;
СЧЕТ (*)
Возвращает количество строк в результирующем наборе независимо от того, содержат ли они NULL
значений.
Следующий пример содержит все записи, даже если некоторые поля содержат значение NULL
. Поэтому, если у некоторых актеров нет фамилии, записанной в таблице, этот оператор вернет большее число, чем в предыдущем примере.
ВЫБРАТЬ СЧЕТЧИК (*)
ОТ сакилы.актер
COUNT (DISTINCT выражение )
Ключевое слово DISTINCT
удаляет повторяющиеся записи. Таким образом, это возвращает количество уникальных строк, которые не содержат значений NULL
.
В следующем примере возвращается количество уникальных фамилий из таблицы. Если фамилия используется двумя или более участниками, результатом будет меньшее число, чем в приведенных выше примерах.
ВЫБРАТЬ СЧЕТЧИК (РАЗЛИЧИЕ last_name)
ОТ sakila.actor;
Вы можете использовать COUNT ()
с предложением GROUP BY
, чтобы обеспечить количество записей в каждой группе.
Пример:
ВЫБЕРИТЕ last_name, COUNT (*)
ОТ сакилы.актер
ГРУППА ПО last_name;
Результат:
В приведенном выше примере сгруппированы все фамилии и указано количество каждой из них. Например, мы видим, что три актера имеют фамилию ALLEN
, только у одного ASTAIRE
и т. Д.
ИМЕЕТ
пункт
Вы можете добавить предложение HAVING
в предложение GROUP BY
для дальнейшей фильтрации результатов.
Здесь мы добавляем предложение HAVING
с другой функцией COUNT ()
, чтобы возвращать только те записи, у которых счетчик больше 3:
ВЫБЕРИТЕ last_name, COUNT (*)
ОТ sakila.actor
ГРУППА ПО last_name
ИМЕЕТ СЧЕТ (*)> 3;
Результат:
Контроль потока
Вы можете объединить COUNT ()
с функциями управления потоком для большей функциональности.Например, вы можете использовать функцию IF ()
как часть выражения, которое будет использоваться в функции COUNT ()
. Это может быть очень полезно для быстрой разбивки данных в базе данных.
Рассмотрим эти данные в фильме
таблица:
Вы можете видеть, что есть поле с названием length
, и длина каждого фильма записана в этом поле.
Таким образом, мы можем использовать это поле для следующих действий:
ВЫБРАТЬ
COUNT (IF (length <80,1; NULL)) 'Короткий',
COUNT (IF (length BETWEEN 80 AND 120,1; NULL)) 'Средний',
COUNT (IF (длина> 120,1; NULL)) ‘Длинный’
ИЗ пленки;
Результат:
Приведенный выше оператор разделяет результаты на три группы; Short
, Medium
и Long
, в зависимости от длины пленки.Мы используем функцию IF ()
для сравнения длины пленки с заданным выражением, и в зависимости от результата она возвращает 1
или NULL
. Если он вернет 1
, он будет засчитан под заголовком столбца, который мы назвали ( Short
, Medium
или Long
).
В примерах на этой странице используется образец базы данных Sakila.
.