bd_lab2x

advertisement
Нижегородский Государственный Технический Университет
Лабораторная работа №1
по дисциплине: «Базы данных»
Тема: «MySQL»
Выполнили студенты группы 10-В
Кульнев Андрей
Блажнов Илья
Сидоренко Олег
Проверил:
Супруненко А.В.
г. Нижний Новгород
2014г.
1. Создайте новую базу данных MySQL, выполнив запрос CREATE DATABASE имя_базы;
CREATE DATABASE Lab2;
2. Выберите созданную базу и при помощи оператора CREATE TABLE создайте таблицы:
authors — авторы
id — идентификатор автора, первичный ключ;
lastName, firstName и midName — фамилия (индекс), имя и отчество автора соответственно;
birthDate — дата рождения автора.
books — книги
id — идентификатор книги, первичный ключ;
authorId — идентификатор автора, внешний ключ к authors.id;
title — название книги;
ISBN — ISBN книги;
cnt — количество экземпляров книги.
readers — читатели
id — идентификатор читателя, первичный ключ;
name — имя (Ф. И. О.) читателя;
address — адрес читателя;
phone — телефон читателя.
orders — выдача книг
id — идентификатор выдачи, первичный ключ;
bookId — идентификатор взятой книги, внешний ключ к books.id;
readerId — идентификатор читателя, внешний ключ к readers.id;
orderDate — дата и время выдачи книги;
duration — срок, на который выдана книга (в днях).
Используйте архитектуру InnoDB.
USE Lab2;
CREATE TABLE authors
(id SMALLINT PRIMARY KEY, lastName VARCHAR(20), firstName VARCHAR(20), midName
VARCHAR(20), birthDATE DATE)
ENGINE=InnoDB CHARSET = cp1251;
CREATE TABLE readers
(id MEDIUMINT PRIMARY KEY, name VARCHAR(50), address VARCHAR(255), phone
VARCHAR(11))
ENGINE=InnoDB CHARSET = cp1251;
CREATE TABLE books
(id INT NOT NULL PRIMARY KEY, authorId SMALLINT, title VARCHAR(255), ISBN
VARCHAR(15),cnt TINYINT,
FOREIGN KEY (authorId) REFERENCES authors(Id)
ON DELETE CASCADE
ON UPDATE CASCADE
)
ENGINE=InnoDB CHARSET = cp1251;
CREATE TABLE orders
(id MEDIUMINT PRIMARY KEY, bookId INT, readerId MEDIUMINT, orderDate DATETIME, duration
TINYINT,
FOREIGN KEY (bookId) REFERENCES books(Id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
FOREIGN KEY (readerId) REFERENCES readers(Id)
ON DELETE RESTRICT
ON UPDATE CASCADE
)
ENGINE=InnoDB CHARSET = cp1251;
При создании внешнего ключа:
CASCADE – означает распространение действий родительской таблицы на дочерние: то есть, если
значение ключа в родительской таблице изменится, то оно автоматически (!без специальных
запросов) изменится и в дочерних таблицах.
RESTRICT — означает, что нельзя редактировать значение ключа или удалять строки из
родительской таблицы, пока есть соответствующие внешние ключи в дочерних таблицах (это
правило является правилом по умолчанию).
3. Заполните таблицы данными.
USE lab2;
INSERT INTO authors
(id, lastName, firstName, midName, birthDATE)
VALUES
(1,'Достоевский','Фёдор','Михайлович','1821-10-30'),
(2,'Толстой','Лев','Николаевич','1828-08-28'),
(3,'Гоголь','Николай','Васильевич','1809-03-31'),
(4,'Булгаков','Михаил','Афанасьевич','1891-05-15');
INSERT INTO books
(id, authorId, title, ISBN, cnt)
VALUES
(1, 1, 'Преступление и наказание', '9781443430906', 4),
(2, 2, 'Война и мир', '9780143039990', 1),
(3, 3, 'Мёртвые души', '9780307797810', 4),
(4, 4, 'Мастер и Маргарита', '9780141180144', 2),
(5, 1, 'Идиот', '9780850670356', 9),
(6, 2, 'Анна Каренина', '9780191500374', 3),
(7, 3, 'Тарас Бульба', '9788475618425', 12),
(8, 4, 'Собачье сердце', '9781409087953', 4);
INSERT INTO readers
(id, name, address, phone)
VALUES
(1, 'Белов Дмитрий Викторович', 'г. Нижний Новгород ул. Пролетарская д. 7 кв. 29', '89073552152'),
(2, 'Панов Антон Васильевич', 'г. Москва ул. Новикова д. 5 кв. 21', '89013552632'),
(3, 'Котов Александр Петрович', 'г. Владимир ул. Ленина д. 12 кв. 2', '89083558374'),
(4, 'Слёзкин Константин Андреевич', 'г. Нижний Новгород ул. Рабочая д. 5 кв. 29', '89023536152'),
(5, 'Малова Зоя Павловна', 'г. Нижний Новгород ул. Калинина д. 8 кв. 32', '89084752152'),
(6, 'Давыдова Светлана Антоновна', 'г. Москва ул. Победы д. 1 кв. 4', '89049372152'),
(7, 'Бобкова Екатерина Карловна', 'г. Самара ул. Автомобильная д. 6 кв. 29', '89073556624');
INSERT INTO orders
(id, bookId, readerId, orderDate, duration)
VALUES
(1, 1, 1, '2014-02-23 19:12:42', 14),
(2, 2, 3, '2014-02-15 08:42:34', 4),
(3, 3, 3, '2014-02-04 13:32:12', 9),
(4, 4, 4, '2014-02-01 20:02:21', 2),
(5, 4, 1, '2014-02-28 14:58:38', 5),
(6, 8, 1, '2014-02-19 14:09:13', 14),
(7, 6, 1, '2014-02-03 11:49:35', 13),
(8, 5, 1, '2014-02-09 15:12:18', 12),
(9, 1, 5, '2014-02-10 09:31:32', 11),
(10, 7, 7, '2014-02-26 14:51:16', 10),
(11, 7, 7, '2014-02-21 16:55:29', 7),
(12, 1, 5, '2014-02-17 14:43:56', 7);
Authors
Books
Orders
readers
4. Проверьте целостность данных в таблицах при изменении и удалении.
Пример 1: Изменим значение Id книги «Мастер и Маргарита» в таблице books с 4 на 99 и проверим,
изменилось ли соответствующее значение bookId в таблице orders.
Для изменения данных выполним следующее:
UPDATE lab2.books SET id=99 WHERE id=4
Теперь проверим таблицы books и orders:
Books
Orders
Пример 2: Попытаемся удалить какого-нибудь читателя, который взял какую-нибудь книгу. В
результате данное действие не должно быть выполнено, т.к. в таблице orders будет информация о
заказе неизвестного читателя.
DELETE FROM readers WHERE id=1
Результат:
5. Оператором CREATE VIEW создайте представления следующих запросов выборки (для
связи таблиц используйте JOIN):
5.1Вывести список выдач книг за сегодняшний день с указанием автора, названия книги,
имени читателя, а также отдельной строкой вывести суммарное количество выданных сегодня
книг.
CREATE OR REPLACE VIEW view51 AS
SELECT title AS Title_AND_cout , concat(lastName,' ',firstName,' ',midName) AS FIO , name AS readername
FROM books, authors, readers
LEFT OUTER JOIN orders
ON DATE(orders.orderDate)=DATE(NOW())
WHERE orders.bookId=books.id AND books.authorId=authors.id AND orders.readerId=readers.id
UNION
SELECT count(orders.id), NULL, NULL
FROM orders
WHERE DATE(orders.orderDate)= DATE(NOW());
5.2 Вывести список имён всех читателей (в том числе и тех, у кого нет книг на руках) с
указанием количества взятых ими книг за последние две недели.
CREATE OR REPLACE VIEW view52 AS
SELECT name, count(orders.readerId) AS cnt
FROM readers
LEFT OUTER JOIN orders
ON orders.readerId=readers.id
WHERE date_sub(DATE(NOW()), INTERVAL 14 DAY)<orderDate
GROUP BY readerId;
6. Выполните произвольный INSERT-запрос к любой из таблиц, заключив эти запросы в
конструкцию
START TRANSACTION;
INSERT readers
VALUES
(18,'Волрадова Карина Эдуардовна','Дубаи','89785641273');
ROLLBACK
7. Проверьте отсутствие вставки данных
8. Замените ROLLBACK на COMMIT. Выполните запрос снова.
START TRANSACTION;
INSERT readers
VALUES
(18,'Волрадова Карина Эдуардовна','Дубаи','89785641273');
COMMIT;
9. Проверьте успешную вставку данных
Download