Точно также, как предложение WHERE используется для отбора отдельных строк, участвующих в запросе, предложение HAVING можно применить для отбора групп строк. Его формат соответствует формату предложения WHERE. Предложение HAVING состоит из ключевого слова HAVING, за которым следует условие поиска. Таким образом, данное предложение определяет условие поиска для групп. Основным отличием предложения HAVING от WHERE, что оно применяется уже непосредственно после самого запроса и в условие поиска включается поле с примененной к нему агрегатной функцией.
Вывести те дни месяца, когда оборот превышал 1000 руб.
SELECT ДАТА_ДОК, SUM (КОЛ-ВО*ЦЕНА)
SUM (КОЛ-ВО*ЦЕНА)
FROM ПЕРЕМЕЩЕНИЕ
WHERE ДАТА_ДОК BETWEEN ‘1.01.2000’ AND ’31.01.2000’
GROUP BY ДАТА_ДОК
HAVING SUM (КОЛ-ВО*ЦЕНА)>1000
Вывести все идентификаторы городов, если количество клиентов из них больше трех.
SELECT IDN_ГОРОДА
FROM КЛИЕНТ
GROUP BY IDN_ГОРОДА
HAVING COUNT(*) >3
6.3 Работа с несколькими таблицами
6.3.1 Объединение при помощи оператора WHERE
На практике многие запросы считывают данные сразу из нескольких таблиц базы данных. Например, у нас существуют две таблицы.
|
|
Таблица Города
IDN | НАЗВАНИЕ |
Москва Санкт-Петербург Пермь Париж |
Таблица Клиент
IDN | НАЗВАНИЕ(ИМЯ) | IDN_ГОРОДА | |
МММ Хопер Алиса ИВС ПГТУ Рога&Копыта |
Вывести всех клиентов с указанием города.
SELECT ГОРОДА.НАЗВАНИЕ, КЛИЕНТ.НАЗВАНИЕ(ИМЯ)
FROM ГОРОДА,КЛИЕНТ
WHERE ГОРОДА.IDN=КЛИЕНТ.IDN_ГОРОДА
Результат этого запроса.
Москва Москва Санкт-Петербург Пермь Пермь | МММ Хопер Алиса ИВС ПГТУ |
Если бы нам нужны были клиенты только из Москвы. То этот запрос дополнился бы еще одной строкой.
AND ГОРОДА.НАЗВАНИЕ =’Москва’
В качестве упрощенного варианта этот же запрос можно записать следующим образом.
SELECT Г.НАЗВАНИЕ, К.НАЗВАНИЕ(ИМЯ)
FROM ГОРОДА Г., КЛИЕНТ К.
WHERE Г.IDN=K.IDN_ГОРОДА AND Г.НАЗВАНИЕ=’Москва’
Нас интересует на какую сумму был оборот по каждой группе товаров за какой-то промежуток времени.
SELECT ГР.НАЗВАНИЕ, SUM(П.КОЛ-ВО*П.ЦЕНА)
FROM ГРУППЫ ГР., ПЕРЕМЕЩЕНИЕ П.
WHERE ГР.IDN=П.IDN_ГРУППЫ AND П.ДАТА_ДОК
BETWEEN ‘1.02.2000’ AND ’16.03.2000’
GROUP BY ГР.НАЗВАНИЕ
HAVING SUM(П.КОЛ-ВО*П.ЦЕНА)>1000
ORDER BY SUM(П.КОЛ-ВО*П.ЦЕНА)