Смекни!
smekni.com

Методические указания к лабораторным работам по дисциплине "организация баз данных" для студентов специальности Утверждено (стр. 6 из 6)

Пример 1

  1. Кто из контрагентов совершил покупку на самую большую сумму.

select К.Наименование, П.Цена*П.Количество from Контрагенты К, Продажи П where К.Id_контрагента=П.Контрагент and П.Цена*П.Количество=(select max(Цена*Количество) from Продажи)

  1. Кто из контрагентов принес большую выручку.

select max(Сумма) from (select Контрагент, sum(Цена*Количество) as Сумма from Продажи group by Контрагент) ПЗ

  1. Показать непродаваемые товары.

select Тов.Наименование from Товары Тов where Id_товара not in(select distinct Товар from Продажи)

то же самое:

select Тов.Наименование from Товары Тов where not exists (select distinct Товар from Продажи П where П.Товар=Тов.id_товара )

  1. Вывести контрагентов, которые берут товар только с одного склада.

select distinct К.Наименование from Контрагенты К, Поставки П where К.ID_контрагента=П.Контрагент and (select count(distinct Пс.Склад) from Поставки Пс where Пс.Контрагент=П.Контрагент)=1

  1. Вывести наименования товаров и какое количество каждого товара было продано.

select Наименование, (select sum(Количество) as Кол from Поставки П where Т.id_товара=П.Товар) from Товары Т

то же самое:

select То.Наименование, Т.Кол from Товары то, (select Товар, sum(Количество) as Кол from Поставки group by Товар) as Т where То.id_товара=Т.Товар

Пример 2

  1. Найти пользователя, который закачал файл максимального размера из всех закаченных файлов.

select З.Пользователь, max(Ф.Размер) from Файлы Ф, Закачки З where Ф.id_файла=З.Файл group by З.Пользователь having max(Ф.Размер)=(select max(ПФ.max) from (select З.Пользователь, max(Ф.Размер) from Файлы Ф, Закачки З where Ф.id_файла=З.Файл group by З.Пользователь) ПФ)

  1. Найти пользователей, которые не закачивали файлы из раздела Музыка

select З.Пользователь from Закачки З, Файлы Ф where З.Файл=id_файла and З.Файл not in (select id_файла from Музыка)

  1. Найти файлы, которые ни разу не закачивались.

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';