Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технологии_Баз_Данных_2020.docx
Скачиваний:
273
Добавлен:
01.07.2020
Размер:
1.01 Mб
Скачать

1. Библиотека

Минимальный список характеристик:

  • Автор книги, название, год издания, цена, количество экземпляров, краткая аннотация;

  • номер читательского билета, ФИО, адрес и телефон читателя, дата выдачи книги читателю и дата сдачи книги читателем, отметка о выбытии.

Книга имеет много экземпляров и поэтому может быть выдана многим читателям.

Выборки:

  • Выбрать читателей, которые имеют задолженность более 4 месяцев.

SELECT Читатели.ФИО, Выдача.Дата_выдачи, Книги.Название FROM Читатели INNER JOIN (Книги INNER JOIN Выдача ON Книги.[Шифр книги] = Выдача.Щифр_книги) ON Читатели.Номер_билета = Выдача.Номер_билета WHERE (((DateDiff("m",[Выдача]![Дата_сдачи],Date()))>4) AND ((IsNull([Выдача]![Дата_сдачи_факт]))=Yes));

  • Определить книгу, которая была наиболее популярной весной 2000 года.

SELECT Книги.[Шифр книги], Count(Выдача.Дата_выдачи) AS [Count-Дата_выдачи], Книги.Автор, Книги.Название FROM Книги INNER JOIN Выдача ON Книги.[Шифр книги] = Выдача.Щифр_книги WHERE (((Выдача.Дата_выдачи) Between #3/1/2000# And #5/31/2000#)) GROUP BY Книги.[Шифр книги], Книги.Автор, Книги.Название;

  • Определить читателей, у которых на руках находятся книги на общую сумму более 100 руб.

SELECT Читатели.ФИО, Sum(Книги.Цена) AS [Sum-Цена] FROM Читатели INNER JOIN (Книги INNER JOIN Выдача ON Книги.[Шифр книги] = Выдача.Щифр_книги) ON Читатели.Номер_билета = Выдача.Номер_билета WHERE (((IsNull([Выдача]![Дата_сдачи_факт]))=Yes)) GROUP BY Читатели.ФИО HAVING (((Sum(Книги.Цена))>100));

  • Выбрать книгу, для которой наибольшее количество экземпляров находится "на полках" (не выданы читателям).

Вот тут в моей базе имеются два варианта решения. Один образовался из-за того, что я сделал поле "Выдано" в таблице книг. В этом случае достаточно двух запросов:

В первом я ищу максимальную разницу между двумя полями таблицы «Книги» - «Количество» и «Выдано». Результат – сколько лежит на полке.

Текст

SELECT Max([Количество]-[Выдано]) AS [Не выдано]

FROM Книги;

Второй – обычный запрос на выборку, условие для отбора – нужно, чтобы разница между количеством экземпляров и количеством выданных книг совпадала с максимальным количеством из первого запроса.

SELECT Книги.Автор, Книги.Название, [Книги]![Количество]-[Книги]![Выдано] AS [Не выдано]

FROM Книги, [Не выдано 1]

WHERE ((([Книги]![Количество]-[Книги]![Выдано])=[Не выдано 1]![Не выдано]));

Но, вообще-то, это читерство)) Думаю, что ожидается не такой результат, поэтому будем решать так, как будто поля «Выдано» в таблице книг нет.

2. Университет

Минимальный список характеристик:

  • Номер, ФИО, адрес и должность преподавателя, ученая степень;

  • код, название, количество часов, тип контроля и раздел предмета (дисциплины);

  • код, название, номер заведующего кафедрой;

  • номер аудитории, где преподаватель читает свой предмет, дата, время, группа.

Один преподаватель может вести несколько дисциплин и одна дисциплина может вестись несколькими преподавателями.

Примечание: Циклы дисциплин: гуманитарный, общеинженерный, математический, компьютерный и т.д.

Выборки:

  • Выбрать преподавателя, который был "без работы" весной 2001г.

SELECT Преподаватели.ФИО FROM Преподаватели WHERE (((Преподаватели.Номер) Not In (SELECT Преподаватели.Номер FROM Преподаватели LEFT JOIN Расписание ON Преподаватели.Номер = Расписание.Преподаватель WHERE (((Расписание.Дата) Between #3/1/2001# And #5/31/2001#)) GROUP BY Преподаватели.Номер)));

Тут выбираются преподаватели, которых нет (Not In) в списке преподов, работавших весной 2001 года (то есть у них нет записей в таблице «Расписание» за указанный период).

  • Определить возможные "накладки" аудиторий в расписании.

SELECT Расписание.Дата, Расписание.Время, Расписание.Аудитория, Count(Расписание.[Код записи]) AS [Count-Код записи] FROM Расписание GROUP BY Расписание.Дата, Расписание.Время, Расписание.Аудитория HAVING (((Count(Расписание.[Код записи]))>1));

SELECT Расписание.Дата, Расписание.Время, Расписание.Аудитория, Расписание.Группа, Расписание.Преподаватель, Расписание.Предмет FROM Расписание, Накладки WHERE (((Расписание.Дата)=[Накладки]![Дата]) AND ((Расписание.Время)=[Накладки]![Время]) AND ((Расписание.Аудитория)=[Накладки]![Аудитория]));

  • Вывести расписание занятий группы 'АП-17а' на март 2001г.

SELECT Расписание.Дата, Расписание.Время, Расписание.Аудитория, Расписание.Предмет, Расписание.Преподаватель FROM Группы INNER JOIN Расписание ON Группы.[Код группы] = Расписание.Группа WHERE (((Расписание.Дата) Between #3/1/2001# And #3/31/2001#) AND ((Группы.Название)="АП17а"));

  • Определить для каждой группы долю дисциплин каждого цикла в процентах.

SELECT [Предметы группы].Группа, Предметы.[Цикл предмета], Count([Предметы группы].[Предмет])*100/[Count-Предмет] AS [Процент предметов] FROM [Всего предметов] INNER JOIN (Группы INNER JOIN (Предметы INNER JOIN [Предметы группы] ON Предметы.[Код предмета] = [Предметы группы].Предмет) ON Группы.[Код группы] = [Предметы группы].Группа) ON [Всего предметов].Группа = Группы.[Код группы] GROUP BY [Предметы группы].Группа, Предметы.[Цикл предмета], [Всего предметов].[Count-Предмет];