- •Федеральное агенство связи государственное образовательное учреждение
- •Введение
- •1. Построение концептуальной модели базы данных (инфологическая модель)
- •1.1 Описание предметной области
- •1.2 Особенности базы данных
- •2. Построение даталогической модели базы данных (логическая модель)
- •2.1. Определение списка сущностей и их атрибутов
- •2.2 Описание взаимосвязей между сущностями
- •2.3 Проверка отношений на нормальные формы и аномалии
- •3. Построение физической модели базы данных
- •3.1 Er-диаграмма модели
- •3.2 Проверка модели на наличие ошибок
- •4. Проверка работоспособности базы данных
- •4.1 Прямое проектирование базы данных
- •4.2 Заполнение таблиц данными
- •4.3 Запросы к информационной системе
- •4.4 Обратное проектирование
- •Заключение
4.3 Запросы к информационной системе
Чтобы окончательно убедиться, что спроектированная база данных работоспособна, построим выражения для 10 вариантов запросов:
1. Получить список читателей с заданными характеристиками: студентов указанного учебного заведения, факультета, научных работников по определенной тематике и т.д. (рис. 29).
SELECT П.Имя_польз, П.Фамилия_польз, П.Отчество_польз, П.Номер_абонем, 'Должность_Официант' Статус
FROM Рабочий Р JOIN Пользователь П
ON Р.Номер_абонем = П.Номер_абонем
AND Р.Должность_раб = 'Официант'
UNION ALL
SELECT П.Имя_польз, П.Фамилия_польз, П.Отчество_польз, П.Номер_абонем, 'Факультет_ИСиТ'
FROM Студент С JOIN Пользователь П
ON С.Номер_абонем = П.Номер_абонем
JOIN Факультет Ф
ON Ф.Номер_факульт = С.Номер_факульт
AND Ф.Назван_факульт = 'ИСиТ'
UNION ALL
SELECT П.Имя_польз, П.Фамилия_польз, П.Отчество_польз, П.Номер_абонем, 'Научн_тема_философия'
FROM Научн_работник Н JOIN Пользователь П
ON Н.Номер_абонем = П.Номер_абонем
AND Н.Научная_тема = 'Философия'
UNION ALL
SELECT П.Имя_польз, П.Фамилия_польз, П.Отчество_польз, П.Номер_абонем, 'Посл_место_раб_Сбербанк'
FROM Безработный Б JOIN Пользователь П
ON Б.Номер_абонем = П.Номер_абонем
AND Б.Посл_место_раб = 'Сбербанк';

Рисунок 33 - Результат работы запроса 1
2. Выдать перечень читателей, на руках у которых находится указанное произведение (рис. 30).
SELECT П.Фамилия_польз, П.Имя_польз, П.Отчество_польз, П.Номер_абонем
FROM Пользователь П JOIN Абонемент А
ON П.Номер_абонем = А.Номер_абонем
JOIN Абонем_журнал А_ж
ON А.Номер_абонем = А_ж.Номер_абонем
JOIN Журнал_посещ Ж
ON А_ж.Номер_записи = Ж.Номер_записи
JOIN Выдача В
ON Ж.Номер_записи = В.Номер_записи
JOIN Произвед_журнал П_ж
ON Ж.Номер_записи = П_ж.Номер_записи
JOIN Произведение Пр
ON П_ж.Артикул_произв = Пр.Артикул_произв
JOIN Атрибут_произв А_п
ON Пр.Артикул_произв = А_п.Артикул_произв
WHERE А_п.Название_произв = 'Капитанская дочка'
AND В.Дата_выдачи IS NOT NULL
AND В.Срок_сдачи > sysdate;

Рисунок 34 - Результат работы запроса 2
3. Получить список читателей, на руках у которых находится указанное издание (книга, журнал и т.д) (рис. 31).
SELECT П.Фамилия_польз, П.Имя_польз, П.Отчество_польз, П.Номер_абонем
FROM Пользователь П JOIN Абонемент А
ON П.Номер_абонем = А.Номер_абонем
JOIN Абонем_журнал А_ж
ON А.Номер_абонем = А_ж.Номер_абонем
JOIN Журнал_посещ Ж
ON А_ж.Номер_записи = Ж.Номер_записи
JOIN Выдача В
ON Ж.Номер_записи = В.Номер_записи
JOIN Произвед_журнал П_ж
ON Ж.Номер_записи = П_ж.Номер_записи
JOIN Произведение Пр
ON П_ж.Артикул_произв = Пр.Артикул_произв
JOIN Атрибут_произв А_п
ON Пр.Артикул_произв = А_п.Артикул_произв
JOIN Издание И
ON Пр.Артикул_издания = И.Артикул_издания
WHERE И.Назван_издания = 'Искра'
AND В.Дата_выдачи IS NOT NULL
AND В.Срок_сдачи > sysdate;

Рисунок 35 - Результат работы запроса 3
4. Получить перечень читателей, которые в течение указанного промежутка времени получали издание с некоторым произведением, и название этого издания (рис. 32).
SELECT П.Фамилия_польз, П.Имя_польз, П.Отчество_польз, П.Номер_абонем, И.Назван_издания
FROM Пользователь П JOIN Абонемент А
ON П.Номер_абонем = А.Номер_абонем
JOIN Абонем_журнал А_ж
ON А.Номер_абонем = А_ж.Номер_абонем
JOIN Журнал_посещ Ж
ON А_ж.Номер_записи = Ж.Номер_записи
JOIN Выдача В
ON Ж.Номер_записи = В.Номер_записи
JOIN Произвед_журнал П_ж
ON Ж.Номер_записи = П_ж.Номер_записи
JOIN Произведение Пр
ON П_ж.Артикул_произв = Пр.Артикул_произв
JOIN Атрибут_произв А_п
ON Пр.Артикул_произв = А_п.Артикул_произв
JOIN Издание И
ON Пр.Артикул_издания = И.Артикул_издания
WHERE А_п.Название_произв = 'Капитанская дочка'
AND В.Дата_выдачи BETWEEN '05.09.2013' AND '17.05.2014';

Рисунок 36 - Результат работы запроса 4
5. Выдать список изданий, которые в течение некоторого времени получал указанный читатель из фонда библиотеки, где он зарегистрирован (рис. 33).
SELECT И.Назван_издания
FROM Пользователь П JOIN Абонемент Аб
ON П.Номер_абонем = Аб.Номер_абонем
JOIN Абонем_журнал А_ж
ON Аб.Номер_абонем = А_ж.Номер_абонем
JOIN Библиотека Б
ON Б.Номер_библ = Аб.Номер_библ
JOIN Журнал_посещ Ж
ON А_ж.Номер_записи = Ж.Номер_записи
JOIN Выдача В
ON Ж.Номер_записи = В.Номер_записи
JOIN Произвед_журнал П_ж
ON Ж.Номер_записи = П_ж.Номер_записи
JOIN Произведение Пр
ON П_ж.Артикул_произв = Пр.Артикул_произв
JOIN Издание И
ON Пр.Артикул_издания = И.Артикул_издания
WHERE В.Дата_выдачи BETWEEN '05.09.2013' AND '17.05.2014'
AND П.Фамилия_польз = 'Майкина'
AND П.Имя_польз = 'Ольга'
AND П.Отчество_польз = 'Киевна'
AND Б.Название_библ = 'Юношеская библ.';

Рисунок 37 - Результат работы запроса 5
6. Получить перечень изданий, которыми в течение некоторого времени пользовался указанный читатель из фонда библиотеки, где он не зарегистрирован (рис. 34).
SELECT И.Назван_издания
FROM Абонемент Аб JOIN Пользователь П
ON П.Номер_абонем = Аб.Номер_абонем
JOIN Абонем_журнал А_ж
ON Аб.Номер_абонем = А_ж.Номер_абонем
JOIN Библиотека Б
ON Б.Номер_библ = Аб.Номер_библ
JOIN Журнал_посещ Ж
ON А_ж.Номер_записи = Ж.Номер_записи
JOIN Выдача В
ON Ж.Номер_записи = В.Номер_записи
JOIN Произвед_журнал П_ж
ON Ж.Номер_записи = П_ж.Номер_записи
JOIN Произведение Пр
ON П_ж.Артикул_произв = Пр.Артикул_произв
JOIN Издание И
ON Пр.Артикул_издания = И.Артикул_издания
WHERE В.Дата_выдачи BETWEEN '05.09.2013' AND '17.05.2014'
AND П.Фамилия_польз = 'Сапин'
AND П.Имя_польз = 'Сергей'
AND П.Отчество_польз = 'Гаевич'
AND Б.Название_библ != 'Детская библ.';

Рисунок 38 - Результат работы запроса 6
7. Получить список литературы, которая в настоящий момент выдана с определенной полки некоторой библиотеки (рис. 35).
SELECT И.Назван_издания
FROM Издание И JOIN Библ_фонд Б_ф
ON Б_ф.Артикул_издания = И.Артикул_издания
JOIN Произведение Пр
ON И.Артикул_издания = Пр.Артикул_издания
JOIN Произвед_журнал П_ж
ON Пр.Артикул_произв = П_ж.Артикул_произв
JOIN Журнал_посещ Ж
ON П_ж.Номер_записи = Ж.Номер_записи
JOIN Выдача В
ON Ж.Номер_записи = В.Номер_записи
JOIN Абонем_журнал А_ж
ON Ж.Номер_записи = А_ж.Номер_записи
JOIN Абонемент А
ON А_ж.Номер_абонем = А.Номер_абонем
WHERE Ж.Дата_возврата = NULL
AND В.Срок_сдачи > sysdate
AND Б_ф.Номер_зала = '1с'
AND Б_ф.Номер_стеллажа = '1'
AND Б_ф.Номер_полки = '1'
AND А.Номер_библ = '1';

Рисунок 39 - Результат работы запроса 7
8. Выдать список читателей, которые в течение обозначенного периода были обслужены указанным библиотекарем (рис. 36).
SELECT DISTINCT П.Фамилия_польз, П.Имя_польз, П.Отчество_польз, П.Номер_абонем
FROM Выдача В JOIN Журнал_посещ Ж
ON В.Номер_записи = Ж.Номер_записи
JOIN Абонем_журнал А_ж
ON Ж.Номер_записи = А_ж.Номер_записи
JOIN Библиотекарь Б_рь
ON Ж.Номер_библ_ря = Б_рь.Номер_библ_ря
JOIN Абонемент А
ON А_ж.Номер_абонем = А.Номер_абонем
JOIN Пользователь П
ON А.Номер_абонем = П.Номер_абонем
WHERE Б_рь.Фамилия_библ_ря = 'Зонова'
AND Б_рь.Имя_библ_ря = 'Ольга'
AND Б_рь.Отчество_библ_ря = 'Баевна'
AND В.Дата_выдачи BETWEEN '05.09.2013' AND '17.05.2014';

Рисунок 40 - Результат работы запроса 8
9. Получить данные о выработке библиотекарей (число обслуженных читателей в указанный период времени) (рис. 37).
SELECT Ж.Номер_библ_ря, (COUNT(В.Дата_выдачи) + COUNT(Ж.Дата_возврата)) Количество
FROM Журнал_посещ Ж JOIN Выдача В
ON Ж.Номер_записи = В.Номер_записи
WHERE В.Дата_выдачи BETWEEN '05.09.2013' AND '17.05.2014'
GROUP BY Ж.Номер_библ_ря;

Рисунок 41 - Результат работы запроса 9
10. Получить список читателей с просроченным сроком литературы (рис. 38).
SELECT DISTINCT П.Фамилия_польз, П.Имя_польз, П.Отчество_польз, П.Номер_абонем
FROM Выдача В JOIN Журнал_посещ Ж
ON В.Номер_записи = Ж.Номер_записи
JOIN Абонем_журнал А_ж
ON Ж.Номер_записи = А_ж.Номер_записи
JOIN Абонемент А
ON А_ж.Номер_абонем = А.Номер_абонем
JOIN Пользователь П
ON А.Номер_абонем = П.Номер_абонем
WHERE Ж.Дата_возврата = NULL
AND В.Срок_сдачи < sysdate;

Рисунок 42 - Результат работы запроса 10
Все запросы работают, показывают правильные результаты. Это говорит о том, что спроектированная база данных полностью работоспособна.
