Нижегородский Государственный Технический Университет

Лабораторная работа №1

по дисциплине: «Базы данных»

Тема: «MySQL»

Выполнил студент группы 10-В-1

Проверил:

г. Нижний Новгород

2014г.

1. Создайте новую базу данных MySQL, выполнив запрос

CREATE DATABASE IF NOT EXISTS library;

2. Выберите созданную базу и при помощи оператора CREATE TABLE создайте таблицы. Используйте архитектуру MyISAM.

CREATE TABLE authors

(

id SMALLINT PRIMARY KEY, lastName VARCHAR(20), firstName VARCHAR(20), midName VARCHAR(20), birthDate DATE

) ENGINE = MyISAM DEFAULT CHARSET = utf8;

CREATE TABLE books

(

id INT PRIMARY KEY, authorId SMALLINT, title VARCHAR(255), ISBN VARCHAR(15), cnt TINYINT

) ENGINE = MyISAM DEFAULT CHARSET = utf8;

CREATE TABLE readers

(

id MEDIUMINT PRIMARY KEY, name VARCHAR(50), address VARCHAR(255), phone VARCHAR(11)

)ENGINE = MyISAM DEFAULT CHARSET = utf8;

CREATE TABLE orders

(

id MEDIUMINT PRIMARY KEY, bookId INT, readerId MEDIUMINT, orderDate DATETIME, duration TINYINT

)ENGINE = MyISAM DEFAULT CHARSET = utf8;

3. Заполните таблицы данными.

INSERT authors

(id, lastName, firstName, midName, birthDate)

VALUES

(1,'Рагозин','Степан','Максимович','1892-10-07')

,(2,'Алашев','Ростислав','Антонович','1908-01-23')

,(3,'Хилков','Артур','Эдгарович','1934-07-12')

,(4,'Шлоссман','Элеонора','Вильевна','1925-09-15');


INSERT books

(id, authorId, title, ISBN, cnt)

VALUES

(1,1,'Сознание Мира','978-3-16-1484-0',15)

,(2,1,'Старый Моряк','978-5-69-1204-7',12)

,(3,2,'Ручная Антилопа','978-5-28-0044-2',11)

,(4,2,'Римский Апрель','978-5-93-3470-7',31)

,(5,3,'Американец Эдди','978-3-54-0152-3',29)

,(6,3,'Актерская Эмоция','978-5-28-0267-2',27)

,(7,4,'Эксперимент Волна','978-5-89-9822-6',25)

,(8,4,'Эра Вещества','978-5-93-4212-4',8);


INSERT orders

(id, bookId, readerId, orderDate, duration)

VALUES

(1,5,2,'2014-01-12 10:11',15)

,(2,4,1,'2014-01-14 11:47',22)

,(3,3,2,'2014-01-15 17:06',13)

,(4,8,2,'2014-01-18 15:28',17)

,(5,5,3,'2014-01-29 13:29',25)

,(6,4,1,'2014-02-04 16:36',20)

,(7,5,4,'2014-02-07 16:27',20)

,(8,6,3,'2014-02-21 15:08',7);


INSERT readers

(id, name, address, phone)

VALUES

(1,'','NN, Акимова, 7','88996217520')

,(2,'','SRV, Ленина, 25','88531056620')

,(3,'','DZR, Советов, 11','88224777323')

,(4,'','NN, Прямая, 6','88992704985')

,(5,'','NN, Бекетова, 23','88991736948');




4. Обеспечьте ссылочную целостность данных при помощи триггеров. Проверьте вставкой, изменением и удалением связанных данных.

CREATE TRIGGER authors_delete BEFORE DELETE

НЕ нашли? Не то? Что вы ищете?

ON authors FOR EACH ROW

       DELETE FROM books WHERE authorId=OLD. id;

CREATE TRIGGER authors_update BEFORE UPDATE

ON authors FOR EACH ROW

       UPDATE books SET authorId=NEW. id

       WHERE authorId=OLD. id;

CREATE TRIGGER books_delete BEFORE DELETE

ON books FOR EACH ROW

       DELETE FROM orders WHERE bookId=OLD. id;

CREATE TRIGGER books_update BEFORE UPDATE

ON books FOR EACH ROW

       UPDATE orders SET bookId=NEW. id

       WHERE bookId=OLD. Id;

CREATE TRIGGER readers_delete BEFORE DELETE

ON readers FOR EACH ROW

       DELETE FROM orders WHERE readerId=OLD. Id;

CREATE TRIGGER readers_update BEFORE UPDATE

ON readers FOR EACH ROW

       UPDATE orders SET readerId=NEW. Id

       WHERE readerId=OLD. Id;

Пример:

Изменим значение id в таблице readers и посмотрим, изменилось ли это значение в таблице orders.

UPDATE readers

SET id=10

WHERE id=4;

Следовательно, триггер работает

5. При помощи триггера ограничьте максимальный срок выдачи книги 14 днями. Проверьте ограничение вводом некорректных данных.


delimiter $$

CREATE TRIGGER orders_insertn BEFORE INSERT

ON orders FOR EACH ROW

       IF NEW. duration > 14

               THEN SET NEW. duration = 14;

END IF$$

delimiter ;

delimiter $$

CREATE TRIGGER orders_insertn BEFORE UPDATE

ON orders FOR EACH ROW

       IF NEW. duration > 14

               THEN SET NEW. duration = 14;

END IF$$

delimiter ;

Пример

INSERT orders

(id, bookId, readerId, orderDate, duration)

VALUES

(9,5,4,'2014-02-07 16:25',20);

6. Выполните следующие запросы выборки:

6.1 Вывести список читателей, живущих в Нижнем Новгороде.

Предполагаемые id: 1,4,5

SELECT * FROM readers

WHERE locate('NN',address)!=0

6.2 Вывести список всех книг в библиотеке с указанием автора, названия, ISBN и количества экземпляров, отсортированный по фамилии автора в алфавитном порядке.

Предполагаемые books. authorId: 2,2,1,1,3,3,4,4

SELECT authorId, lastName, firstName, midName, title, ISBN, cnt

FROM authors, books

WHERE authors. id=books. authorId

ORDER BY lastName

6.3 Вывести список имён читателей, имеющих на руках книги, с указанием количества взятых ими книг. Результат отсортировать по количеству взятых книг по убыванию.

Предполагаемые readerId: 2,1,3,4

SELECT readerId, name, count(readers. id)

FROM readers, orders

WHERE readers. id=orders. readerId

GROUP BY readerId

ORDER BY count(readers. id) DESC

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

Предполагаемые readerId:1,4,3

SELECT readerId, name, duration

FROM readers, orders

WHERE (orders. duration > (SELECT AVG(orders. duration) FROM orders)) AND (readers. id=orders. readerId)

GROUP BY readers. id

ORDER BY readers. name

6.5 Вывести список фамилий авторов и их инициалов (в одном поле), родившихся до 1917 года, чьи книги брали читать за последнюю неделю.

Для опыта изменим orderDate в таблице orders с id 3 и 6 так, чтобы получились следующие данные:

Итак, предполагаемые authorId:2

SELECT authors. id, concat_ws(' ',lastName, firstName, midName), birthDate, orders. orderDate

FROM authors, orders, books

WHERE (date_add(orderDate, INTERVAL 8 DAY)>DATE(NOW())) AND birthDate < '1917-01-01' AND books. id=orders. bookId AND authors. id=books. authorId

GROUP BY authors. id

6.6 Вывести список имён авторов (фамилия, имя, отчество, разделённые пробелом, в одном поле), чьи книги находятся на руках у читателей, с указанием количества выданных книг для каждого автора. Результат отсортировать по имени автора в обратном алфавитном порядке.

Предполагаемые id: 4,3,2

SELECT authors. id, concat_ws(' ',lastName, firstName, midName), count(orders. bookId)

FROM authors, orders, books

WHERE books. id=orders. bookId AND authors. id=books. authorId

GROUP BY authors. id

ORDER BY firstName DESC

6.7 Вывести список имён читателей, которые превысили срок выдачи книги (на сегодняшний день), а также дату предполагаемого возврата книги. Результат отсортировать по имени читателя в алфавитном порядке.

Предполагаемые orders. id:2,1,4,3,5. Однако при группировке по имени читателя, некоторые id будут отсутствовать

SELECT name, date_add(orderDate, INTERVAL duration DAY), orders. id

FROM orders, readers

WHERE date_add(orderDate, INTERVAL duration DAY)< DATE(NOW())) AND readerId=readers. id

GROUP BY name

ORDER BY readers. name

7. Используя оператор GRANT создайте пользователя с привилегией SELECT на таблицу authors.

GRANT select ON authors

TO new_user@localhost

IDENTIFIED BY 'pass'

8. От имени созданного пользователя выполните запрос выборки к таблице authors. Убедитесь в успешном выполнении запроса. Попытайтесь выполнить вставку или изменение данных в таблице authors и выборку из других таблиц базы.

SELECT * FROM authors

INSERT authors

(id, lastName)

VALUES

(5,'Иванов')

UPDATE authors

SET lastName='Иванов'

WHERE id=1

SELECT * FROM books

9. Задайте созданному пользователю привилегии INSERT и DELETE. Проверьте результаты.

GRANT delete, insert ON authors

TO new_user@localhost

IDENTIFIED BY 'pass'

INSERT authors

(id, lastName)

VALUES

(5,'Иванов');

DELETE FROM authors

WHERE id=5;