Что определяет предложение having в команде select
Команда SELECT Раздел HAVING
Раздел 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
SELECT deptno, MIN(sal), MAX(sal) FROM emp WHERE job = ‘CLERK’ GROUP BY deptno HAVING MIN(sal) < 1000;
Вы должны войти, чтобы оставить комментарий.
Предложение HAVING
Предложение HAVING в Access определяет сгруппированные записи, которые должны отображаться в инструкции SELECT с предложением GROUP BY. После того как записи будут сгруппированы предложением GROUP BY, предложение HAVING отобразит те из них, которые отвечают его условиям.
Синтаксис
SELECT список_полей
FROM таблица
WHERE условия_отбора
GROUP BY список_полей_группы
[HAVING условия_группы]
Инструкция SELECT, содержащая предложение HAVING, включает в себя следующие элементы:
Имена полей, извлекаемых вместе со всеми псевдонимами, агрегатными функциями SQL, предикатами отбора (ALL, DISTINCT, DISTINCTROW или TOP) или с другими параметрами инструкции SELECT.
Имя таблицы, из которой извлекаются записи.
Условия отбора. Если инструкция содержит предложение WHERE, то после его применения к записям ядро базы данных Microsoft Access сгруппирует значения.
Имена полей (не более 10), используемых для группировки записей. Порядок следования имен в списке_полей_группы определяет уровень группировки — от самого высокого до самого низкого.
Выражение, определяющее отображаемые записи.
Замечания
Предложение HAVING не является обязательным.
Предложение HAVING аналогично предложению WHERE, которым определяется выбор записей. После группировки записей с предложением GROUP BY предложение HAVING определяет отображаемые записи:
Предложение HAVING может содержать до 40 выражений, связанных логическими операторами, такими как AND и OR.
SQL Предложение HAVING
SQL HAVING
Предложение HAVING было добавлено в SQL, поскольку ключевое слово WHERE не могло использоваться с агрегатными функциями.
Синтаксис HAVING
Демо база данных
Ниже приведен выбор из таблицы «Customers» в образце базы данных Northwind:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 |
Примеры SQL HAVING
В следующей инструкции SQL указано количество клиентов в каждой стране. Только включите страны с более чем 5 клиентами:
Пример
В следующей инструкции SQL перечислено количество клиентов в каждой стране, отсортированных от высокого к низкому (включаются только страны с более чем 5 клиентами):
Пример
Демо база данных
Ниже приведен выбор из таблицы «Orders» в образце базы данных Northwind:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10248 | 90 | 5 | 1996-07-04 | 3 |
10249 | 81 | 6 | 1996-07-05 | 1 |
10250 | 34 | 4 | 1996-07-08 | 2 |
И выбор из таблицы «Employees»:
EmployeeID | LastName | FirstName | BirthDate | Photo | Notes |
---|---|---|---|---|---|
1 | Davolio | Nancy | 1968-12-08 | EmpID1.pic | Education includes a BA. |
2 | Fuller | Andrew | 1952-02-19 | EmpID2.pic | Andrew received his BTS. |
3 | Leverling | Janet | 1963-08-30 | EmpID3.pic | Janet has a BS degree. |
Примеры HAVING
В следующей инструкции SQL перечислены сотрудники, зарегистрировавшие более 10 заказов:
Пример
В следующей инструкции SQL перечислены случаи, когда сотрудники «Davolio» или «Fuller» зарегистрировали более 25 заказов:
Что определяет предложение having в команде select
Итак, наконец, мы почти приблизились к завершению оператора SELECT! Еще немного и можно будет сказать, что мы все обсудили! Но, а пока рассмотрим, как выбрать данные при группировке, то есть выводить не все данные, а только те, которые нас интересуют. Ранее для отбора строк по условию мы пользовались выражением WHERE. Для отбора групп по условию существует оператор HAVING. Его синтаксис аналогичен выражению WHERE и мало того их можно использовать вместе! Давайте рассмотрим следующий запрос:
Как видно выражение HAVING SUM(AMOUNT) > 300 сработало как условие при группировке строк! А теперь посмотрим на рисунок.
Здесь видно, если условие SUM(AMOUNT) > 300 ложно, то эта группа из результирующего набора отбрасывается. Если истинно, то группа попадает в результирующий набор! Ничего сложного!
Давайте рассмотрим еще один пример: Для каждого офиса, в котором работают два и более человек, вычислить общий плановый и фактический объем продаж для всех служащих офиса.
Вот так строится этот запрос, если вы все это поняли. Замечательно. Тогда посмотрите кое что посложнее:
Показать цену, количество на складе и общее количество заказанных единиц для каждого наименования товара, если для него общее количество заказанных единиц превышает 75 процентов от количества товара на складе.
Получаем следующий набор:
А вот здесь, ничего разжевывать не буду, это вам задание на дом! Напишите план запроса и пришлите на мой ящик, а я посмотрю кто как понимает данный материал! 🙂 Ограничения, накладываемые на предложение HAVING те же, что и ограничения для запросов с группировкой, которые мы рассматривали в предыдушем шаге, но есть ряд дополнений. Предложение HAVING должно содержать как минимум одну агрегатную функцию, если это не так, то лучше применять предложение WHERE. Так как предложение WHERE применимо к отдельным строкам, а предложение HAVING к группам строк и об этом не стоит забывать! А, остальное все как обычно! 🙂 Да, что касается NULL в условии поиска HAVING, они точно такие же, как и для предложения WHERE, т.е. «Если условие поиска имеет значение NULL, группа строк исключается и строка в результатах запроса для нее не генерируется». К слову предложение HAVING, в принципе можно применять и без GROUP BY, но тогда результат запроса рассматривается как одна группа состоящая из всех строк. На практике это применяется довольно редко. Вот так работает HAVING и все, что к нему прилагается!
SQL SELECT
Команда SELECT
Команда SELECT производит выборку данных из таблиц по запросу.
Язык SQL допускает три типа синтаксических конструкций, начинающихся с ключевого слова SELECT:
Синтаксис команды SELECT в MySQL
Синтаксис команды SELECT в Oracle
Основные ключевые слова и параметры команды SELECT в MySQL
Синтаксис команды SELECT в Oracle
Синтаксис команды SELECT в Oracle
Query table expression clause
Table collection expression
Hierarchical query clause
Основные ключевые слова и параметры команды SELECT в Oracle
Описание команды SELECT
Основой всех синтаксических конструкций, начинающихся с ключевого слова SELECT, является синтаксическая конструкция “табличное выражение”.
Семантика табличного выражения состоит в том, что на основе последовательного применения разделов FROM, WHERE, GROUP BY и HAVING из заданных в разделе FROM таблиц строится некоторая новая результирующая таблица, порядок следования строк которой не определен и среди строк которой могут находиться дубликаты (т.е. в общем случае таблица-результат табличного выражения является мультимножеством строк).
Наиболее общей является конструкция “спецификация курсора”. Курсор — это понятие языка SQL, позволяющее с помощью набора специальных операторов получить построчный доступ к результату запроса к БД. К табличным выражениям, участвующим в спецификации курсора, не предъявляются какие- либо ограничения. При определении спецификации курсора используются три дополнительных конструкции: спецификация запроса, выражение запросов и раздел ORDER BY.
В спецификации запроса задается список выборки (список арифметических выражений над значениями столбцов результата табличного выражения и констант). В результате применения списка выборки к результату табличного выражения производится построение новой таблицы, содержащей то же число строк, но вообще говоря другое число столбцов, содержащих результаты вычисления соответствующих арифметических выражений из списка выборки.
Выражение запросов — это выражение, строящееся по указанным синтаксическим правилам на основе спецификаций запросов. Единственной операцией, которую разрешается использовать в выражениях запросов, является операция UNION (объединение таблиц) с возможной разновидностью UNION ALL.
Оператор выборки — это отдельный оператор языка SQL, позволяющий получить результат запроса в прикладной программе без привлечения курсора. Поэтому оператор выборки имеет синтаксис, отличающийся от синтаксиса спецификации курсора, и при его выполнении возникают ограничения на результат табличного выражения. Фактически, и то, и другое диктуется спецификой оператора выборки как одиночного оператора SQL: при его выполнении результат должен быть помещен в переменные прикладной программы. Поэтому в операторе появляется раздел INTO, содержащий список переменных прикладной программы, и возникает то ограничение, что результирующая таблица должна содержать не более одной строки.
В диалекте SQL СУБД Oracle поддерживается расширенный вариант оператора выборки, результатом которого не обязательно является таблица из одной строки. Такое расширение не поддерживается ни в SQL/89, ни в SQL/92.
Подзапрос — запрос, который может входить в предикат условия выборки оператора SQL.
Кстати, данную статью Вы можете найти в интернете по запросам:
Команда SELECT, Синтаксис команды SELECT, Описание команды SELECT.