Нижегородский Государственный Технический Университет Лабораторная работа №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. Проверьте успешную вставку данных