Пример 1
select К.Наименование, П.Цена*П.Количество from Контрагенты К, Продажи П where К.Id_контрагента=П.Контрагент and П.Цена*П.Количество=(select max(Цена*Количество) from Продажи)
select max(Сумма) from (select Контрагент, sum(Цена*Количество) as Сумма from Продажи group by Контрагент) ПЗ
select Тов.Наименование from Товары Тов where Id_товара not in(select distinct Товар from Продажи)
то же самое:
select Тов.Наименование from Товары Тов where not exists (select distinct Товар from Продажи П where П.Товар=Тов.id_товара )
select distinct К.Наименование from Контрагенты К, Поставки П where К.ID_контрагента=П.Контрагент and (select count(distinct Пс.Склад) from Поставки Пс where Пс.Контрагент=П.Контрагент)=1
select Наименование, (select sum(Количество) as Кол from Поставки П where Т.id_товара=П.Товар) from Товары Т
то же самое:
select То.Наименование, Т.Кол from Товары то, (select Товар, sum(Количество) as Кол from Поставки group by Товар) as Т where То.id_товара=Т.Товар
Пример 2
select З.Пользователь, max(Ф.Размер) from Файлы Ф, Закачки З where Ф.id_файла=З.Файл group by З.Пользователь having max(Ф.Размер)=(select max(ПФ.max) from (select З.Пользователь, max(Ф.Размер) from Файлы Ф, Закачки З where Ф.id_файла=З.Файл group by З.Пользователь) ПФ)
select З.Пользователь from Закачки З, Файлы Ф where З.Файл=id_файла and З.Файл not in (select id_файла from Музыка)
select Наименование from Файлы where id_файла not in(select Файл from Закачки)
Лабораторная работа №5 (ФУНКЦИИ И ТРИГГЕРЫ)
Основные понятия
Примеры
Функции и триггеры.
Пример 1
Написать триггеры для поддержания актуального количества товара на складах в таблице Остатки.
Триггер, который при добавлении записи в таблицу Поставки, проверяет, есть ли запись с таким складом и товаром в таблице остатки, если нет, то добавляет ее со значением Количество = 0, затем увеличивает Количество в остатках на количество в поставке товара.
CREATE FUNCTION ПриходТовара()
RETURNS trigger
AS 'DECLARE /*Блок объявления переменных*/
rec record;
BEGIN /*Начало основного программного блока функции*/
select into rec * /*выбрать записи в переменную rec*/
from Остатки /*из таблицы Остатки*/
where new.Товар=Товар; /*где товар такой же как в Поставке*/
if not found /*если не найдено не одной записи удовлетворяющей условию*/
then insert into Остатки values (new.Склад, new.Товар, 0); /*то вставить соответствующую строку в таблицу Остатки*/
end if;
update Остатки set Количество=Количество+new.Количество where new.Товар=Товар and new.Склад=Склад; /*увеличить Количество в строке с соответствующим Товаром и Складом на количество товара, указанное в поставке*/
RETURN new; /*Вернуть новую запись для таблицы Поставки*/
END;' /*Конец основного программного блока функции*/
LANGUAGE 'plpgsql';
CREATE TRIGGER ПриходТовара /*Создать триггер*/
AFTER INSERT /*вызываемый после операции insert*/
ON Поставки /*для таблицы поставки*/
FOR EACH ROW /*для каждого кортежа*/
EXECUTE PROCEDURE ПриходТовара(); /*вызвать процедуру ПриходТовара()*/
Триггер, который при добавлении записи в таблицу Продажи, уменьшает количество товара в остатках на величину занесенную в продаже.
CREATE FUNCTION ПродажаТовара()
RETURNS trigger
AS 'BEGIN /*Начало основного программного блока функции*/
update Остатки
set Количество=Количество-new.Количество
where new.Товар=Товар and new.Склад=Склад;
RETURN new;
END;'
LANGUAGE 'plpgsql';
CREATE TRIGGER ПродажаТовара /*Создать триггер*/
AFTER INSERT /*вызываемый после операции insert*/
ON Продажи /*для таблицы продажи*/
FOR EACH ROW /*для каждого кортежа*/
EXECUTE PROCEDURE ПродажаТовара(); /*вызвать процедуру ПродажаТовара()*/
Функция подсчитывает стоимость товаров на всех складах
CREATE FUNCTION ПодсчетСтоимостиТоваров()
RETURNS float
AS ' DECLARE /*Блок объявления переменных*/
Сумма float;
rec RECORD;
BEGIN /*Начало основного программного блока функции*/
Сумма:=0;
FOR rec IN SELECT * FROM Остатки LOOP
Сумма:=Сумма+rec.Количество*(Select Цена from Товары where id_товара=rec.Товар);
END LOOP;
RETURN Сумма;
END;'
LANGUAGE 'plpgsql';
Функция подсчитывает стоимость товаров на конкретном складе
CREATE FUNCTION ПодсчетСтоимостиТоваров(int)
RETURNS float
AS ' DECLARE /*Блок объявления переменных*/
Сумма float;
rec record;
BEGIN /*Начало основного программного блока функции*/
Сумма:=0;
FOR rec IN SELECT * FROM Остатки where Склад=$1 LOOP
Сумма:=Сумма+rec.Количество*(Select Цена from Товары where id_товара=rec.Товар);
END LOOP;
RETURN Сумма;
END;'
LANGUAGE 'plpgsql';
Пример 2
Написать триггер для организации контроля целостности данных. При записи кортежа в таблицу Закачки, проверяем, есть ли файл с таким id_файла в таблице Файлы, если есть, то кортеж благополучно записывается в таблицу Закачки, если его там нет, то система выдаст ошибку “File not found”
CREATE FUNCTION КонтрольЦелостности()
RETURNS trigger
AS 'DECLARE
rec record;
BEGIN /*Начало основного программного блока функции*/
select into rec *
from Файлы where id_файла=new.Файл;
if not found
THEN RAISE EXCEPTION ''File not found'';
else
RETURN new;
end if;
END;'
LANGUAGE 'plpgsql';
CREATE TRIGGER КонтрольЦелостности
BEFORE INSERT
ON Закачки
FOR EACH ROW
EXECUTE PROCEDURE КонтрольЦелостности();
Написать функцию ИзменениеЦены, входным параметром является процент, на который нужно увеличить цену. Функция изменяет поле Цена во всех строках таблицы Файлы.
CREATE OR REPLACE FUNCTION ИзменениеЦены(int)
RETURNS int
AS 'BEGIN /*Начало основного программного блока функции*/
UPDATE Файлы SET Цена=Цена*(1.0+cast($1 as float)/100);
RETURN 1;
END;'
LANGUAGE 'plpgsql';