- •Язык запросов sql
- •Общие сведения
- •Insert - запрос на добавление;
- •Инструкция select
- •Синтаксис select
- •Расширения инструкции select в access
- •Порядок выполнения выборки
- •Управление списком выбора
- •Указание источника данных
- •Применение реляционных операторов
- •Применение булевых операторов
- •Обработка неопределенных значений
- •Сортировка данных
- •Вычисление агрегатных функций
- •Группировка данных
- •Ограничение для групп данных
- •Выборка из нескольких таблиц
- •Соединение отношений
- •Выборка из нескольких таблиц
- •Соединение отношений
- •Запрос с соединением, использующий from и where
- •Запрос с соединением join
- •Запрос с соединением, использующий from и where
- •Запрос с соединением join
- •Операции с таблицами
- •Изменение структуры таблицы
- •Удаление таблицы
- •Действия со строками
- •Вставка строк в таблицу
- •Изменение данных в таблице
- •Удаление данных из таблицы
- •Инструкция transform
- •In ("Физика", "Математика");
- •Глава 5 Работа с формами
Ограничение для групп данных
Ранее для ограничения диапазона данных в выборке был рассмотрен оператор WHERE. Однако он накладывает ограничения на каждую строку данных в отдельности. Для наложения ограничения на группы данных служит предложение HAVING, которое используется совместно с оператором GROUP BY и имеет следующий синтаксис:
SELECT selectionjist FROM table_name [GROUP BY group_list]
[HAVING condition [,...n]];
где condition - одно либо несколько условий ограничения, налагаемых на группы данных, образующиеся в результате работы предложения GROUP BY.
Предложение HAVING применяется ко всему запросу в целом уже после того, как в запросе будут вычислены все группы и функции. Порядок выполнения операторов в предложении SELECT выглядит следующим образом:
-
Выбор необходимых строк при помощи оператора WHERE.
-
Разделение выбранных строк на отдельные группы предложением GROUP BY.
-
Вычисление агрегатных функций для каждой из образованных групп.
-
Проверка предложением HAVING результатов окончательных вычислений, производимых над выделенными группами, на соответствие заданным в операторе условиям.
Например, на основании данных таблицы tbIGoods требуется вычислить для каждого товара количество его моделей, у которых цена не дешевле 600 р. (поле fPriceGoods), а количество единиц превышает 50 штук (поле fQuantityGoods).
Для решения этой задачи составим следующий запрос:
SELECT fNameGoods AS Товар, COUNT (fModelGoods) AS
Моделей, SUM(fQuantityGoods) AS Единиц
FROM tbIGoods
WHERE fPriceGoods >= 600
GROUP BY fNameGoods
HAVING SUM(fQuantityGoods) > 50
ORDER BY 3;
Пошагово разберем порядок выполнения запроса.
Вначале выполняется выборка данных согласно тому ограничению, которое накладывается неравенством, указанным в предложении WHERE. Запрос на этом этапе можно представить в следующем виде:
SELECT fNameGoods AS Товар, fModelGoods AS Моделей,
fQuantityGoods AS Единиц
FROM tbIGoods
WHERE fPriceGoods >= 600;
После того как из таблицы извлечены все строки, удовлетворяющие установленному критерию, проводится группировка данных по наименованию товара для вычисления групповых функций. При помощи этих функций нужно отобразить количество моделей и количество единиц товара в каждой из групп:
SELECT fNameGoods AS Товар, COUNT(fModelGoods) AS Моделей, SUM(fQuantityGoods) AS Единиц
FROM tbIGoods
WHERE fPriceGoods >= 600
GROUP BY fNameGoods;
На следующем шаге при помощи предложения HAVING вводится ограничение, указывающее, что количество единиц товара в каждой из групп обязательно должно быть больше 50. Запрос на этом этапе можно представить так:
SELECT fNameGoods AS Товар, COUNT(fModelGoods) AS
Моделей, SUM(fQuantityGoods) AS Единиц
FROM tbIGoods
WHERE fPriceGoods >= 600
GROUP BY fNameGoods •
HAVING SUM(fQuantityGoods) > 50;
На последнем этапе выполняется оператор сортировки полученного результата по третьему полю (SUM(fQuantityGoods) AS Единиц) в порядке возрастания, т.е. добавляется предложение ORDER BY 3.
Можно сказать, что назначения оператора HAVING и оператора WHERE схожи. Но их главное отличие состоит в том, что условия в предложении WHERE не могут содержать группирующих выражений, в то время как оператор HAVING специально для этого предназначен.