Определяю атрибуты и их типы значений
Данное отношение находится в первой нормальной форме, поскольку все его атрибуты являются неделимыми, и имеет составной ключ: Код клиента, код зала, код тренера, код абонемента.
Некоторые атрибуты зависят только от части составного ключа. Устраним частичную зависимость и переведем это отношение во вторую нормальную форму путем декомпозиции основного отношения на следующие отношения:
1)код клиента, фамилия имя, телефон, код тренера;
2) код абонемента, описание, цена, код зала;
3) код зала, наименование;
4) код тренера, фамилия имя тренера, оклад;
5) код клиента, код абонемента, месяц, произведена оплата.
Отношения 1,2,3,4,5 находятся в третьей нормальной форме, поскольку они находятся во второй нормальной форме, и каждый неключевой атрибут нетранзитивно зависит от первичного ключа.
Определение ключей и создание связей схемы связей.
В 1-ой таблице первичный ключ – код клиента, атрибут код тренера является внешним ключом к таблице 4.
Во 2-ой таблице первичный ключ- код абонемента. Атрибут код зала является внешним ключом по отношению к таблице 3.
В 3-ей таблице первичный ключ- код зала.
В 4-ой таблице первичный ключ – код тренера.
В 5-ой таблице составной первичный ключ - код клиента, код абонемента, месяц.
Создам схему связей между атрибутами таблиц для обеспечения целостности БД.
Создание файла базы данных в Microsoft Access.
Создадим файл спроектированной БД в СУБД Microsoft Access. Для этого запускаю программу Microsoft Access, выбераю в окне команду Создать файл, затем в окне Создание файла выберем пункт Новая база данных и укажем диск, каталог и имя «Спорт клуб».
Создадим таблицы, для этого выберем объект Таблицы и кнопку Создать. В режиме Конструктор создадим таблицы.
С помощью запроса изменю структуру таблицы: В таблицу Тренеры добавлю атрибут Телефон:
ALTER TABLE Тренеры ADD COLUMN Телефон CHAR(10);
В окне базы данных выберу объект Таблицы, установлю курсор на нужную таблицу и нажму кнопку Открыть. В режиме Таблицы введу записи в таблицы. Получаю:
Изменение структуры таблиц с помощью SQL запроса
С помощью SQL-запроса изменю структуру таблицы Залы. Добавлю атрибут Площадь, тип данных – числовой.
ALTER TABLE Залы ADD COLUMN Площадь FLOAT;
Создание SQL запросов в MS Access для манипулирования данными
Запрос на создание таблицы Тренеры:
CREATE TABLE Тренеры (Код_тренера INT NOT NULL PRIMARY KEY, Фамилия_имя_тренера CHAR (40) NOT NULL, Оклад MONEY NOT NULL);
Запрос на добавление данных в таблицу Залы:
INSERT INTO Залы (Код_зала, Наименование)
VALUES (1001, 'Бассейн 25м');
Запрос на обновление данных в таблице Абонементы – ежемесячную цену поднимем на 10%
UPDATE Абонементы SET Абонементы.Цена = "Цена*1,1";
Запрос на удаление данных из таблицы Учет – удалим записи января месяца:
DELETE Учет.Месяц
FROM Учет
WHERE Учет.Месяц="январь";
SQL запросы в Access для выборки данных
Напишу запросы SQL для выборки данных.
Выберу клиентов, занимающихся в бассейне 25м:
SELECT Клиенты.Код_клиента, Клиенты.Фамилия, Клиенты.Имя, Залы.Код_зала
FROM Клиенты INNER JOIN (Залы INNER JOIN (Абонементы INNER JOIN Учет ON Абонементы.Код_абонемента=Учет.Код_абонемента) ON Залы.Код_зала=Абонементы.Код_зала) ON Клиенты.Код_клиента=Учет.Код_клиента
GROUP BY Клиенты.Код_клиента, Клиенты.Фамилия, Клиенты.Имя, Залы.Код_зала
HAVING (((Залы.Код_зала)=1001));
Получаю:
Подсчитаю количество человек, занимающихся у каждого тренера:
SELECT Тренеры.Код_тренера, Тренеры.Фамилия_имя_тренера, Count(Клиенты.Код_клиента) AS Количество
FROM Тренеры INNER JOIN Клиенты ON Тренеры.Код_тренера = Клиенты.Код_тренера
GROUP BY Тренеры.Код_тренера, Тренеры.Фамилия_имя_тренера;
Получим:
Вычислю премию для тренеров с больше чем одним клиентом в виде 40% от оклада:
SELECT Тренеры.Код_тренера, Тренеры.Фамилия_имя_тренера, Count(Клиенты.Код_клиента) AS Количество, [Оклад]*0.4 AS Премия
FROM Тренеры INNER JOIN Клиенты ON Тренеры.Код_тренера=Клиенты.Код_тренера
GROUP BY Тренеры.Код_тренера, Тренеры.Фамилия_имя_тренера, [Оклад]*0.4
HAVING (((Count(Клиенты.Код_клиента))>1));
Выберу клиентов-должников
SELECT Клиенты.Код_клиента, Учет.Произведена_оплата
FROM Клиенты INNER JOIN Учет ON Клиенты.Код_клиента = Учет.Код_клиента
WHERE (((Учет.Произведена_оплата)=No));
Создание однотабличного подзапроса:
SELECT Клиенты.Код_клиента, Клиенты.Фамилия, Клиенты.Имя
FROM Клиенты
WHERE (((Клиенты.Код_клиента) In (SELECT Учет.Код_клиента FROM Учет
WHERE (Учет.Месяц)="июнь")));