Лабораторная работа
«Оператор SELECT»
Часть2
Оператор SELECT имеет следующий формат:
SELECT [DISTINCT | ALL] {* | <значение1> [, <значение2>...]}
FROM <таблица1> [, < таблица2>...]
[WHERE <условия_поиска>]
[GROUP BY столбец [COLLATE collation} [,столбец! [COLLATE collation]...]
[HAVING < условия поиска >]
[UNION <оператор select>]
[PLAN <план выполнения_запроса>]
[ORDER BY <список_столбцов>]
Предложение HAVING - наложение ограничений на группировку записей
Если нужно в результирующем НД выдавать статистику не по всем группам, а только по тем из них, которые отвечают некоторому условию, после предложения GROUP BY указывают предложение
HAVING < условия_поиска >
где условия поиска указываются по тем же правилам, что и условия поиска для предложения WHERE, за важным исключением: в условии поиска предложения HAVING можно указывать статистические (агрегатные) функции, чего нельзя делать в условии поиска для WHERE.
Пример. Выдать минимальные покупки товара в единицах для всех покупателей, у которых минимальное количество покупаемого товара не меньше 100 единиц.
|
|
SELECT POKUP, MIN(KOLVO) FROM RASHOD
GROUP BY POKUP HAVING MIN(KOLVO) >= 100
Если не указывать HAVING с условием, будут выданы все группы.
Можно указывать различные агрегатные функции для возвращаемого столбца и условия в HAVING.
Пример. Выдать общее количество купленного товара для всех покупателей, у которых минимальное количество покупаемого товара не меньше 100 единиц.
SELECT POKUP, SUM(KOLVO) FROM RASHOD
GROUP BY POKUP HAVING MIN(KOLVO) >= 100
ЗАМЕЧАНИЕ. Следует помнить, чем условие в HAVING отличается от условия в WHERE: в условии поиска WHERE нельзя указывать агрегатные функции.
Пример. Выдать из таблицы RASHOD дату, товар, стоимость отпущенного товара. При этом показывать только записи, у которых стоимость отпущенного товара больше 120
SELECT R.DAT_RASH, R.TOVAR, (R.KOLVO * T.ZENA) AS STOIM
FROM RASHOD R, TOVARY T
WHERE (R.TOVAR = T.TOVAR) AND ((R.KOLVO * T.ZENA) > 120)
ORDER BY R.DAT_RASH
Использование BETWEEN
В условие поиска можно указать, что некоторое значение (столбец или вычисление значения выражения) должно находиться в интервале между значением1 и значением2.
<значение> [NOT] BETWEEN <значение1> AND <значение2>
Зарезервированное слово NOT инвертирует условие (значение не должно находиться в интервале между значением! и значением 2).
Пример. Выдать сведения обо всех отпусках товара, где количество отпущенного товара (в единицах) лежит в диапазоне 1000..3000
SELECT * FROM RASHOD
WHERE KOLVO BETWEEN 1000 AND 3000