
- •Оператор select
- •Простейший вид оператора select
- •Использование предложения where
- •Внутреннее соединение таблиц
- •Использование псевдонимов таблиц
- •Предложение order by - определение сортировки
- •Устранение повторяющихся значений
- •Расчет значений вычисляемых столбцов
- •Агрегатные функции
- •Группировка записей
- •Задание сложных условий поиска
- •Использование подзапросов
- •Дополнительные возможности использования подзапросов, возвращающих единичное значение
- •Использование подзапросов, возвращающих множество значений
- •Внешние соединения
- •Union - объединение результатов выполнения нескольких операторов select
Расчет значений вычисляемых столбцов
Для расчета значений вычисляемых столбцов результирующего НД используются арифметические выражения. При этом в списке возвращаемых столбцов после SELECT вместо имени вычисляемого столбца указывается выражение.
Пример. Следующий запрос возвращает все записи об отпуске товаров из таблицы RASHOD и для каждого факта отпуска товара рассчитывает общую стоимость отпущенного товара:
SELECT R.*, T.ZENA, R.KOLVO * T.ZENA FROM RASHOD R, TOVARY T WHERE R.TOVAR = T.TOVAR
Агрегатные функции
Агрегатные функции предназначены для вычисления итоговых значений операций над всеми записями НД. К агрегатным относятся следующие функции:
COUNT (<выражение>) - подсчитывает число вхождений значения выражения во все записи результирующего НД;
SUM(<выражение>)- суммирует значения выражения;
AVG(<выражение>)- находит среднее значение;
МАХ(<выражение>)- определяет максимальное значение;
МIN(<выражение>) - определяет минимальное значение.
Если из группы одинаковых записей нужно учитывать только одну, перед выражением в скобках включают слово DISTINCT:
COUNT(DISTINCT POKUP)
Чаще всего в качестве выражения выступают имена столбцов, при этом выражение может вычисляться и по значениям нескольких таблиц.
Пример. В следующем запросе подсчитывается количество покупателей, приобретавших товары на складе:
SELECT COUNT(DISTINCT POKUP) AS COUNT_POKUP FROM RASHOD
Пример. Вычислить общую стоимость отпущенных товаров за 10.01.97:
SELECT SUM(R.KOLVO * T.ZENA) AS OBS_ZENA FROM RASHOD R,TOVARY T WHERE (R.TOVAR=T.TOVAR) AND (R.DAT RASH="10-JAN-1997")
Группировка записей
Иногда требуется получить агрегированные значения (минимум, максимум, среднее) не по всему результирующему НД, а по каждой из входящих в него групп записей, характеризующихся одинаковым значением какого-либо столбца. Например, выдать общее количество отпущенного товара по каждому товару. В этом случае в оператор SELECT перед предложением WHERE вводится предложение
GROUP BY столбец [,столбец1...]
При этом необходимо, чтобы один из столбцов результирующего НД был представлен агрегатной функцией.
Пример.Вот как можно получить общее количество отпуска по каждому из товаров:
SELECT R.TOVAR, SUM(R.KOLVO) AS OTPUSK FROM RASHOD R GROUP BY R.TOVAR
Пример. Общее количество отпуска по каждому из товаров. Общая цена каждого их отпущенных из товаров:
SELECT R.TOVAR, SUM(R.KOLVO * T.ZENA) FROM RASHOD R, TOVARY T WHERE T.TOVAR = R.TOVAR GROUP BY R.TOVAR
Пример. Общая цена по каждому из отпущенных товаров на каждую дату:
SELECT R.TOVAR,R.DAT_RASH,SUM(R.KOLVO*T.ZENA) FROM RASHOD R, TOVARY T WHERE T.TOVAR=R.TOVAR GROUP BY R.TOVAR,R.DAT_RASH
Пример. Количество покупателей на каждую дату:
SELECT DAT_RASH, COUNT(DISTINCT POKUP) FROM RASHOD GROUP BY DAT_ RASH
ПРЕДЛОЖЕНИЕ HAVING - НАЛОЖЕНИЕ ОГРАНИЧЕНИЙ НА ГРУППИРОВКУ ЗАПИСЕЙ
Если нужно в результирующем НД выдавать агрегацию не по всем группам, а только по тем из них, которые отвечают некоторому условию, после предложения GROUP BY указывают предложение HAVING.
После НАVING указываются условия, которые отличаются от условий, определяемых в предложении WHERE, одним важным обстоятельством: в HAVING обязательно должна быть указана одна из агрегатных функций, в то время как в предложении WHERE такие функции указывать нельзя.
Пример. Минимальные покупки товара в единицах для всех покупателей, у которых минимальное количество покупаемого товара не меньше 100 единиц:
SELECT POKUP, MIN(KOLVO)
FROM RASHOD
GROUP BY POKUP
HAVING MIN(KOLVO) >= 100
Если не указывать HAVING MIN(KOLVO)>=100 будут выданы все группы.
Пример. Количество фактов отпуска товаров на каждую дату, в которых отпускалось не менее 1000 единиц товара:
SELECT DAT_RASH, COUNT(*) FROM RASHOD WHERE KOLVO >= 1000 GROUP BY DAT_RASH
Пример. Показать даты отпуска товаров, в которых количество отпускаемого товара было не меньше 1000 единиц. В результирующий НД включить только те группы, по которым количество таких отпусков товаров больше 1:
SELECT DAT_RASH,COUNT(*) FROM RASHOD WHERE KOLVO>=1000 GROUP BY DAT_RASH HAVING COUNT(*)>1