Реляционная алгебра, использующая агрегатные функции?
Я написал пару запросов с использованием агрегатных функций, и, поскольку я не могу проверить их с помощью winRDBI, я хотел бы спросить, правильно ли я их сделал?
Ниже приведена схема базы данных:
Author - (authorNum/numeric, authorLast/char, authorFirst/char) PK: authorNum
Book - (bookCode/char, title/char, publisherCode/char, type/char,
price/numeric, paperback/char) PK: bookCode
Branch - (branchNum/numeric, branchName/char, branchLocation/char, numEmployees/numeric) PK: branchNum
Inventory - (bookCode/char, branchNum/numeric, onHand/numeric) PK: bookCode
Publisher - (publisherCode/char, publisherName/char, city/char) PK: publisherCode
Wrote - (bookCode/char, authorNum/numeric, sequence/numeric) PK: bookCode,authorNum
Sequence refers to the sequence in which this author appears on the
cover – first author, second author, etc.
Copy - (bookCode/char, branchNum/numeric, copyNum/numeric,
quality/char, price/numeric) PK: bookCode, branchNum, copyNum
Я не думаю, что это необходимо, но вот PDF фактической базы данных, с которой я работаю: База данных PDF
Вот запросы с соответствующими ответами (все операторы, которые не используют агрегатные функции, записаны в нотации winRDBI):
1) Укажите среднюю цену всех копий книг, доступных в отделении "Генри Даунтаун".
branch_names := copy njoin (project branchNum, branchName (branch));
in_Henry_Downtown := project bookCode, copyNum, price, branchName (select
(branchName = 'Henry Downtown') (branch_names));
ans1 := bookCode g avg(price) (in_Henry_Book);
Фрагмент таблицы отношений in_Henry_Downtown
: in_Henry_Downtown
2) Для каждой книги, которой владеет Генри Букс, выведите код книги, количество общих копий, доступных коллективно во всех ее филиалах, и среднюю цену копии этой книги.
in_stock1 := (project bookCode (book)) njoin (project bookCode, branchNum (inventory));
copies := in_stock1 njoin (project bookCode, branchNum, copyNum, price (copy));
ans2 := bookCode g count(branchNum, copyNum), avg(price) (copies);
Фрагмент таблицы отношений copies
: копии
Это тот, в котором я менее всего уверен. Я пытаюсь пересчитать копии книг во всех филиалах. Таким образом, для кода книги "0200" количество должно быть 4, б / у ветка № 1 имеет копию № 1 и копию № 2 этой книги, а ветка № 2 - копию № 1 и копию № 2 этой книги. Мой процесс состоит в том, что поскольку branchNum и copyNum будут уникальными для каждой записи определенного bookCode, я могу использовать эти атрибуты для своей функции подсчета.
3) Для каждого издателя укажите имя издателя, количество книг, которые он опубликовал, и среднюю базовую цену (отношение книг содержит базовую цену книги) этих книг.
publisher_books := (project publisherCode, publisherName (publisher))
njoin (project bookCode, publisherCode,price (book));
ans3 := publisherName g count(bookCode), avg(price) (publisher_books);
Фрагмент таблицы отношений publisher_books
: publisher_books
Любая помощь будет высоко ценится! Спасибо!