Sqlиспользование фразы having


Sqlиспользование фразы having

Фраза HAVING (рис.2.3) играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии фразы GROUP BY, а выражение в HAVING должно принимать единственное значение для группы.

Например, выдать коды продуктов, поставляемых более чем двумя поставщиками:

Результат: ПР
9
11
12

В п.3.6 можно познакомиться с более содержательным примером использования этой фразы.

Sqlиспользование фразы having

Фраза HAVING (рис.2.3) играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии фразы GROUP BY, а выражение в HAVING должно принимать единственное значение для группы.

Например, выдать коды продуктов, поставляемых более чем двумя поставщиками:

Результат: ПР
9
11
12

В п.3.6 можно познакомиться с более содержательным примером использования этой фразы.

Sqlиспользование фразы having

HAVING — добавлена в SQL поскольку условие WHERE не может использовать функции.

Синтаксис SQL HAVING

Пример SQL HAVING

Есть следующая таблица «Orders»:

O_Id OrderDate OrderPrice Customer
1 2008/11/12 1000 Hansen
2 2008/10/23 1600 Nilsen
3 2008/09/02 700 Hansen
4 2008/09/03 300 Hansen
5 2008/08/30 2000 Jensen
6 2008/10/04 100 Nilsen

Теперь мы хотим найти, какой из клиентов имеет сумму заказа меньшую 2000.

Customer SUM(OrderPrice)
Nilsen 1700

Теперь мы хотим узнать, имеют ли клиенты «Hansen» и «Jensen» заказ на сумму более 1500.

HAVING в SQL

В предыдущей статье мы разобрали GROUP BY в SQL. Там я написал, что данная конструкция позволяет выбирать отдельные группы и для каждой группы вычислять функции, указанные после SELECT. А HAVING позволяет, согласно результату выполнения функций, отфильтровать лишние строки из групп. Разберём это подробнее.

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

Для этой фильтрации по результатам выполнения агрегатной функции используется в SQL команда HAVING:

SELECT `shop_id`, AVG(`price`) FROM `table` GROUP BY `shop_id` HAVING AVG(`price`)

В результате, вместо 4-х строк у нас будет лишь 3:

shop_id AVG(`price`)
1 37.5
2 36.0
3 37.0

Если конструкции GROUP BY не будет, то HAVING будет применяться не к конкретной группе, а ко всей выборке. Это означает, что если условие HAVING будет выполняться, то оно никакого влияния не окажет. А если выполняться не будет, то не будет ни одной результирующей строки.

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

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):

  • Комментарии ( 1 ):

    Можно ещё добавить, что HAVING это как WHERE только используется для GROUP BY

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Фразы GROUP BY и HAVING

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

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

    Для того чтобы решить эту задачу, мы должны разделить работников на группы в соответствии с их менеджерами. Затем мы определим максималь­ную ставку внутри каждой группы. В SQL это делается таким образом:

    SELECT SUPV_ID, MAX(HRLY_RATE)

    GROUP BY SUPV_ID

    При обработке этого запроса система сначала разбивает строки таблицы WORKER на группы по следующему правилу. Строки помещаются в одну группу тогда и только тогда, когда у них совпадает SUPV_ID. Затем фраза SELECT применяется к каждой группе. Поскольку в данной группе только одно значение SUPV_ID, то никакой неопределенности SUPV_ID в группе нет. Для каждой группы, фраза SELECT выводит SUPV_ID, a также вычисляет и выводит значение MAX(HRLY_RATE). Результат представлен выше.

    В команде SELECT со встроенными функциями могут встречаться только те столбцы, которые входят во фразу GROUP BY. Обратите внимание, что SUPV_ID может использоваться в команде SELECT, поскольку он входит во фразу GROUP BY.

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

    Фраза GROUP BY позволяет выполнять определенные сложные вычис­ления. Например, нам может понадобиться выяснить среднее значение этих максимальных ставок. Однако, вычисления со встроенными функциями ог­раничены в том смысле, что не разрешается использование встроенных функции внутри других встроенных функций. Таким образом, выражение типа

    Илон Маск рекомендует:  Использование удалённыхremote файлов

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

    С командой GROUP BY можно использовать команду WHERE:

    Запрос: Для каждого типа зданий выяснить средний уровень качества среди зданий статуса 1.

    SELECT TYPE, AVG(QLTY_LEVEL)

    WHERE STATUS = 1

    Фраза WHERE выполняется перед командой GROUP BY. Таким образом, ни одна группа не может содержать строку, в которой статус отличен от 1. Строки статуса 1 группируются по значению TYPE, а затем к каждой группе применяется фраза SELECT.

    Фраза HAVING. Накладывает условия на группы.

    Мы также можем применять условия и к группам, созданным фразой GROUP BY. Это делается при помощи фразы HAVING. Предположим, на­пример, что мы решили конкретизировать один из предыдущих запросов:

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

    Мы можем отразить это условие соответствующей командой HAVING:

    SELECT SUPV_ID, MAX(HRLY_RATE)

    FROM WORKER GROUP BY SUPV_ID

    HAVING COUNT(*) > 1

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

    Запрос может содержать и команду WHERE, и команду HAVING. В этом случае первой выполняется фраза WHERE, поскольку она выполняется до разбиения на группы. Например, рассмотрим следующую модификацию приведенного ранее запроса:

    Запрос: Для каждого типа зданий выяснить средний уровень качества среди зданий статуса 1. Рассматривать только те типы зданий, максимальный уровень качества которых не превышает 3.

    SELECT TYPE, AVG (QLTY_JLEVEL)

    WHERE STATUS = 1

    Задание 5. Выполните следующие запросы к базе данных «Перевозки».

    1. Каков максимальный вес груза, доставленного в каждый город?
    2. Для каждого города с населением свыше 1 миллиона человек выяс­нить минимальный вес груза, отправленного в этот город.
    3. Для каждого города, в который отправлено не менее трёх грузов, выяснить средний вес груза, отправленного в этот город.

    7. Встроенные функции и подзапросы

    Встроенные функции могут использоваться только во фразе SELECT или в команде HAVING. Однако фраза SELECT, содержащая встроенную функ­цию, может быть частью подзапроса. Рассмотрим пример такого подзапроса:

    Запрос: У кого из работников почасовая ставка выше среднего?


    Обратите внимание, что подзапрос не коррелирует с главным запросом. Подзапрос выдает ровно одно значение — среднюю почасовую ставку. Глав­ный запрос выбирает работника только в том случае, если его ставка больше вычисленной средней.

    В коррелированных запросах также могут использоваться встроенные функции:

    Запрос: У кого из работников почасовая ставка выше средней почасовой ставки среди подчиненных того же менеджера?

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

    SELECT A. WORKER_NAME

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

    9. Операции изменения данных

    В SQL есть операции изменения данных INSERT, UPDATE и DELETE, позволяющие, соответственно, добавлять строки, изменять значения в стро­ках и удалять строки определенной таблицы в базе данных. Каждую из опе­раций мы обсудим отдельно.

    INSERT. Операция INSERT (вставить) позволяет вводить в таблицу как отдельные строки путем указания значений каждого столбца, так и множе­ства строк путем формулировки запроса, определяющего вводимые строки.

    INSERT INTO ASSIGNMENT (WORKER_ID, BLDG_ID, START DATE)

    VALUES (1284, 485, 13.05)

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

    Предположим, что мы создали новую таблицу с именем BUILDING_2, состоящую из столбцов BLDG_ID, TYPE и QLTY_LEVEL (УРОВ_КАЧЕСТВА), и хотим заполнить эту таблицу строками из таблицы BUILDING, имеющими STATUS 2. Тогда мы воспользуемся второй формой команды INSERT:

    INSERT INTO BUILDING_2

    SELECT BLDG_ID, TYPE, QLTY_LEVEL

    WHERE STATUS = 2

    INSERT. Операция, добавляющая строки к таблице.

    UPDATE. Операция UPDATE (изменить) всегда применяется ко всем строкам, удовлетворяющим условию выражения WHERE. Если мы хотим повысить на 5 процентов ставку каждого подчиненного начальника 1520, то нам потребуется следующее выражение:

    SET HRLY_RATE = 1.05 * HRLY_RATE

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

    UPDATE. Операция, изменяющая значения столбцов в строке.

    DELETE. Операция DELETE (удалить) также применяется ко всем стро­кам, удовлетворяющим условию WHERE. Если фраза WHERE отсутствует. то удаляются все строки таблицы. Допустим, что все рабочие, чей начальник имеет индекс 1520, были уволены, и мы хотим удалить соответствующие строки из базы данных. Это сделает следующее выражение:

    DELETE FROM WORKER

    DELETE.Операция, удаляющая строки из таблицы.

    Не нашли то, что искали? Воспользуйтесь поиском:

    Лучшие изречения: Для студентов недели бывают четные, нечетные и зачетные. 9438 — | 7438 — или читать все.

    188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

    Отключите adBlock!
    и обновите страницу (F5)

    очень нужно

    Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

    Базы данных

    HAVING оператор MySQL

    В этом учебном пособии вы узнаете, как использовать MySQL оператор HAVING с синтаксисом и примерами.

    Описание

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

    Синтаксис

    Синтаксис оператора HAVING в MySQL:

    Параметры или аргументы

    aggregate_function — функция, такая как функции SUM, COUNT, MIN, MAX или AVG.
    expression1 , expression2 , … expression_n — выражения, которые не заключены в агрегированную функцию и должны быть включены в предложение GROUP BY.
    WHERE conditions — необязательный. Это условия для выбора записей.
    HAVING condition — Это дополнительное условие применяется только к агрегированным результатам для ограничения групп возвращаемых строк. В результирующий набор будут включены только те группы, состояние которых соответствует TRUE.

    Илон Маск рекомендует:  Что такое код rtrim

    Пример использования функции SUM


    Рассмотрим пример MySQL оператора HAVING, в котором используется функция SUM.

    Вы также можете использовать функцию SUM, чтобы вернуть имя product и общее количество (для этого product ). MySQL оператор HAVING будет фильтровать результаты так, чтобы возвращались только product с общим количеством больше 10.

    Sqlиспользование фразы having

    Для группировки данных в T-SQL применяются операторы GROUP BY и HAVING , для использования которых применяется следующий формальный синтаксис:

    GROUP BY

    Оператор GROUP BY определяет, как строки будут группироваться.

    Например, сгруппируем товары по производителю

    Первый столбец в выражении SELECT — Manufacturer представляет название группы, а второй столбец — ModelsCount представляет результат функции Count, которая вычисляет количество строк в группе.

    Стоит учитывать, что любой столбец, который используется в выражении SELECT (не считая столбцов, которые хранят результат агрегатных функций), должны быть указаны после оператора GROUP BY. Так, например, в случае выше столбец Manufacturer указан и в выражении SELECT, и в выражении GROUP BY.

    И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:

    Другой пример, добавим группировку по количеству товаров:

    Оператор GROUP BY может выполнять группировку по множеству столбцов.

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

    Следует учитывать, что выражение GROUP BY должно идти после выражения WHERE , но до выражения ORDER BY :

    Фильтрация групп. HAVING

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

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

    Например, найдем все группы товаров по производителям, для которых определено более 1 модели:

    При этом в одной команде мы можем использовать выражения WHERE и HAVING:

    То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары группируются по производителям. И далее фильтруются сами группы — выбираются те группы, которые содержат больше 1 модели.

    Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:

    В данном случае группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models) и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.

    SQL Используйте HAVING для проверки нескольких условий в группе

    пример

    Пользовательский ИД Код товара Количество Цена
    1 2 5 100
    1 3 2 200
    1 4 1 500
    2 1 4 50
    3 5 6 700

    Чтобы проверить клиентов, которые заказали оба продукта — ProductID 2 и 3, можно использовать HAVING

    Пользовательский ИД
    1

    Запрос выбирает только записи с идентификаторами productID в вопросах и с проверкой предложения HAVING для групп, имеющих 2 productIds, а не только один.

    В этом запросе выбираются только группы, имеющие хотя бы одну запись с идентификатором productID 2 и по меньшей мере с идентификатором productID 3.

    Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть третья

    Предыдущие части

    О чем будет рассказано в этой части

    В этой части мы познакомимся:

    1. с выражением CASE, которое позволяет включить условные выражения в запрос;
    2. с агрегатными функциями, которые позволяют получить разного рода итоги (агрегированные значения) рассчитанные на основании детальных данных, полученных оператором «SELECT … WHERE …»;
    3. с предложением GROUP BY, которое в скупе с агрегатными функциями позволяет получить итоги по детальным данным в разрезе групп;
    4. с предложением HAVING, которое позволяет произвести фильтрацию по сгруппированным данным.

    Выражение CASE – условный оператор языка SQL

    Данный оператор позволяет осуществить проверку условий и возвратить в зависимости от выполнения того или иного условия тот или иной результат.

    Оператор CASE имеет 2 формы:

    Первая форма: Вторая форма:
    CASE
    WHEN условие_1
    THEN возвращаемое_значение_1

    WHEN условие_N
    THEN возвращаемое_значение_N
    [ELSE возвращаемое_значение]
    END
    CASE проверяемое_значение
    WHEN сравниваемое_значение_1
    THEN возвращаемое_значение_1

    WHEN сравниваемое_значение_N
    THEN возвращаемое_значение_N
    [ELSE возвращаемое_значение]
    END

    В качестве значений здесь могут выступать и выражения.

    Разберем на примере первую форму CASE:


    ID Name Salary SalaryTypeWithELSE SalaryTypeWithoutELSE
    1000 Иванов И.И. 5000 ЗП >= 3000 ЗП >= 3000
    1001 Петров П.П. 1500 ЗП 3000».

    Т.е. здесь в первую очередь происходит группировка и вычисляются данные по всем отделам:

    А уже к этим данным применяется условие указанно в блоке HAVING:

    В HAVING-условии так же можно строить сложные условия используя операторы AND, OR и NOT:

    Как можно здесь заметить агрегатная функция (см. «COUNT(*)») может быть указана только в блоке HAVING.

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

    Пример использования HAVING-условия по полю включенного в GROUP BY:

    Это только пример, т.к. в данном случае проверку логичнее было бы сделать через WHERE-условие:

    Т.е. сначала отфильтровать сотрудников по отделу 3, и только потом сделать расчет.

    Примечание. На самом деле, несмотря на то, что эти два запроса выглядят по-разному оптимизатор СУБД может выполнить их одинаково.

    Думаю, на этом рассказ о HAVING-условиях можно окончить.

    Подведем итоги

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

    Конструкция/Блок Порядок выполнения Выполняемая функция
    SELECT возвращаемые выражения 4 Возврат данных полученных запросом
    FROM источник В нашем случае это пока все строки таблицы
    WHERE условие выборки из источника 1 Отбираются только строки, проходящие по условию
    GROUP BY выражения группировки 2 Создание групп по указанному выражению группировки. Расчет агрегированных значений по этим группам, используемых в SELECT либо HAVING блоках
    HAVING фильтр по сгруппированным данным 3 Фильтрация, накладываемая на сгруппированные данные
    ORDER BY выражение сортировки результата 5 Сортировка данных по указанному выражению

    Конечно же, вы так же можете применить к сгруппированным данным предложения DISTINCT и TOP, изученные во второй части.

    Эти предложения в данном случае применятся к окончательному результату:

    SalaryAmount
    5000

    SalaryAmount
    2000
    2500
    5000

    Как получились данные результаты проанализируйте самостоятельно.

    Заключение

    Основная цель которую я ставил в данной части – раскрыть для вас суть агрегатных функций и группировок.

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

    Здесь я намеренно стараюсь показывать только основы, чтобы сосредоточить внимание начинающих на самых главных конструкциях и не перегружать их лишней информацией. Твердое понимание основных конструкций (о которых я еще продолжу рассказ в последующих частях) даст вам возможность решить практически любую задачу по выборке данных из РБД. Основные конструкции оператора SELECT применимы в таком же виде практически во всех СУБД (отличия в основном состоят в деталях, например, в реализации функций – для работы со строками, временем, и т.д.).

    В последующем, твердое знание базы даст вам возможность самостоятельно легко изучить разные расширения языка SQL, такие как:

    • GROUP BY ROLLUP(…), GROUP BY GROUPING SETS(…), …
    • PIVOT, UNPIVOT
    • и т.п.

    В рамках данного учебника я решил не рассказывать об этих расширениях, т.к. и без их знания, владея только базовыми конструкциями языка SQL, вы сможете решать очень большой спектр задач. Расширения языка SQL по сути служат для решения какого-то определенного круга задач, т.е. позволяют решить задачу определенного класса более изящно (но не всегда эффективней в плане скорости или затраченных ресурсов).

    Если вы делаете первые шаги в SQL, то сосредоточьтесь в первую очередь, именно на изучении базовых конструкций, т.к. владея базой, все остальное вам понять будет гораздо легче, и к тому же самостоятельно. Вам в первую очередь, как бы нужно объемно понять возможности языка SQL, т.е. какого рода операции он вообще позволяет совершить над данными. Донести до начинающих информацию в объемном виде – это еще одна из причин, почему я буду показывать только самые главные (железные) конструкции.

    Удачи вам в изучении и понимании языка SQL.

    Sqlиспользование фразы having

    Итак, наконец, мы почти приблизились к завершению оператора SELECT! Еще немного и можно будет сказать, что мы все обсудили! Но, а пока рассмотрим, как выбрать данные при группировке, то есть выводить не все данные, а только те, которые нас интересуют. Ранее для отбора строк по условию мы пользовались выражением WHERE. Для отбора групп по условию существует оператор HAVING. Его синтаксис аналогичен выражению WHERE и мало того их можно использовать вместе! Давайте рассмотрим следующий запрос:

    Какова средняя стоимость заказа для каждого служащего из числа тех, у которых общая стоимость заказов превышает $300?

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

    Как видно выражение HAVING SUM(AMOUNT) > 300 сработало как условие при группировке строк! А теперь посмотрим на рисунок.

    Здесь видно, если условие SUM(AMOUNT) > 300 ложно, то эта группа из результирующего набора отбрасывается. Если истинно, то группа попадает в результирующий набор! Ничего сложного!

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

    Здесь хорошо видно, что присутствуют оба выражения и WHERE и HAVING, каждый выполняет свою функцию в запросе. Обратите так же внимание, что в предложении HAVING используются агрегатные функции при формировании условия поиска! Давайте опишем, как этот запрос выполняется:

    1. Объединяются таблицы OFFICES и SALESREPS для того, чтобы найти город, в котором работает служащий.
    2. Группируются строки объединенной таблицы по офисам.
    3. Исключаются группы, содержащие две или менее строки — это те строки, которые не удовлетворяют критерию предложения HAVING.
    4. Вычисляются общие плановые и фактические объемы продаж для каждой группы.

    Вот так строится этот запрос, если вы все это поняли. Замечательно. Тогда посмотрите кое что посложнее:

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

    Получаем следующий набор:

    А вот здесь, ничего разжевывать не буду, это вам задание на дом! Напишите план запроса и пришлите на мой ящик, а я посмотрю кто как понимает данный материал! :) Ограничения, накладываемые на предложение HAVING те же, что и ограничения для запросов с группировкой, которые мы рассматривали в предыдушем шаге, но есть ряд дополнений. Предложение HAVING должно содержать как минимум одну агрегатную функцию, если это не так, то лучше применять предложение WHERE. Так как предложение WHERE применимо к отдельным строкам, а предложение HAVING к группам строк и об этом не стоит забывать! А, остальное все как обычно! :) Да, что касается NULL в условии поиска HAVING, они точно такие же, как и для предложения WHERE, т.е. «Если условие поиска имеет значение NULL, группа строк исключается и строка в результатах запроса для нее не генерируется». К слову предложение HAVING, в принципе можно применять и без GROUP BY, но тогда результат запроса рассматривается как одна группа состоящая из всех строк. На практике это применяется довольно редко. Вот так работает HAVING и все, что к нему прилагается!

    Илон Маск рекомендует:  Что такое код globaladdatom
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL