bd_lab1_2010x

advertisement
НГТУ
Кафедра ВСТ
Лабораторная работа № 1
MySQL
Выполнил:
Квасов Н. А.
Макарова К. С.
Синенков Е. С.
Проверил:
Супруненко А. В.
Нижний Новгород
2010г.
1. Создайте новую базу данных MySQL, выполнив запрос
CREATE DATABASE имя_базы;
CREATE DATABASE library;
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 — срок, на который выдана книга (в днях).
Используйте архитектуру MyISAM.
CREATE TABLE authors (id SMALLINT, lastName VARCHAR(20), firstName VARCHAR(20),
midName VARCHAR(20), birthDate DATE)
ENGINE = MyISAM CHARSET = cp1251;
CREATE TABLE books (id INT, authorID SMALLINT, title VARCHAR(255),
ISBN VARCHAR(15),cnt TINYINT)
ENGINE = MyISAM CHARSET = cp1251;
CREATE TABLE readers (id SMALLINT, name VARCHAR(50), address VARCHAR(255),
phone VARCHAR(11))
ENGINE = MyISAM CHARSET = cp1251;
CREATE TABLE orders (id MEDIUMINT, bookID INT, readersID SMALLINT,
orderDate DATETIME, duration TINYINT)
ENGINE = MyISAM CHARSET = cp1251;
3. Заполните таблицы данными.
INSERT INTO authors VALUES
(0, "Strugatskii", "Boris", "Andreevich", '1949-07-26'),
(1,"Pexov","Alex","Segeeich",'1890-12-03'),
(2,"Chexov","Anton","Pavlovich",'1912-02-09');
INSERT INTO books VALUES
(0, 2, "Bishnvii sad", "1-1111-1111-1", 5),
(1,0,"Obitamii ostov","2-2222-2222-2",7),
(2,1,"Gnici Vetra","3-3333-3333-3",2);
INSERT INTO readers VALUES
(0, "Nikita", "Dzerginsk, Chkalova, 29-18", "524853"),
(1,"Klavdia","Dzerginsk, Griboedova, 37-9","75637"),
(2,"Egorka","NN,Zvezdinka,6-123","324287365");
INSERT INTO orders VALUES
(0, 1, 2,'2010-01-01 01:00:00', 8),
(1,2,3,'2009-12-12 14:15:45',8),
(2,3,1,'2010-02-02 18:10:15',8);
4. Обеспечьте ссылочную целостность данных при помощи триггеров. Проверьте вставкой,
изменением и удалением связанных данных.
CREATE TRIGGER au_del BEFORE DELETE
ON authors FOR EACH ROW
BEGIN
DELETE FROM books WHERE authorID=OLD.ID;
END;
CREATE TRIGGER au_up BEFORE UPDATE
ON authors FOR EACH ROW
BEGIN
UPDATE books SET authorID=NEW.ID
WHERE authorID=OLD.ID;
END;
CREATE TRIGGER readers_up BEFORE UPDATE
ON readers FOR EACH ROW
BEGIN
UPDATE orders SET readerID=NEW.ID
WHERE readerID=OLD.ID;
END;
CREATE TRIGGER books_del BEFORE DELETE
ON books FOR EACH ROW
BEGIN
DELETE FROM orders WHERE bookID=OLD.ID;
END;
CREATE TRIGGER books_up BEFORE UPDATE
ON books FOR EACH ROW
BEGIN
UPDATE orders SET bookID=NEW.ID
WHERE bookID=OLD.ID;
END;
CREATE TRIGGER readers_del BEFORE DELETE
ON readers FOR EACH ROW
BEGIN
DELETE FROM readers WHERE
readerID=OLD.ID;
END;
5. При помощи триггера ограничьте максимальный срок выдачи книги 14 днями. Проверьте
ограничение вводом некорректных данных.
CREATE TRIGGER orders_ins BEFORE INSERT
ON orders FOR EACH ROW
BEGIN
IF NEW.duration>14 THEN
SET NEW.duration=14;
END IF;
END;
CREATE TRIGGER orders_up BEFORE UPDATE
ON orders FOR EACH ROW
BEGIN
IF NEW.duration>14 THEN
SET NEW.duration=14;
END IF;
END;
6. Выполните следующие запросы выборки:
6.1Вывести список всех книг в библиотеке с указанием автора, названия, ISBN и количества
экземпляров, отсортированный по фамилии автора в алфавитном порядке.
SELECT title, ISBN, cnt, lastName, firstName,
midName
FROM books, authors
WHERE authors.id= books.authorId
ORDER BY lastName
6.2Вывести список читателей, живущих в Нижнем Новгороде.
SELECT name, address
FROM readers
WHERE locate('NN',readers.address)>0
6.3Вывести список имён читателей, имеющих на руках книги, с указанием количества взятых
ими книг. Результат отсортировать по количеству взятых книг по убыванию.
SELECT name, count(readers.id)
FROM readers, orders
WHERE orders.readersID=readers.id
GROUP BY readersID
ORDER BY count(readers.id) DESC
6.4Вывести список имён читателей, взявших книги на срок, больший, чем средний срок
выдачи книг. Результат отсортировать по имени читателя в алфавитном порядке.
SELECT name
FROM readers,orders
WHERE orders.duration >
(SELECT AVG(duration) FROM orders )
AND orders.readersID=readers.id
GROUP BY name
ORDER BY readers.name
6.5Вывести список фамилий авторов и их инициалов (в одном поле), родившихся
до 1917 года.
SELECT CONCAT_WS('
',lastName,firstName,midName)
FROM authors
WHERE birthDate < '1917.01.01'
6.6Вывести список имён авторов (фамилия, имя, отчество, разделённые пробелом, в одном
поле), чьи книги находятся на руках у читателей, с указанием количества выданных книг
для каждого автора. Результат отсортировать по имени автора в обратном алфавитном
порядке.
SELECT CONCAT_WS('
',lastName,firstName,midName), COUNT(bookID)
FROM authors,orders,books
WHERE books.id=orders.bookID AND
authors.id=books.authorID
GROUP BY bookID
ORDER BY lastName DESC
6.7Вывести список имён читателей, которые превысили срок выдачи книги (на сегодняшний
день), а также дату предполагаемого возврата книги. Результат отсортировать по имени
читателя в алфавитном порядке.
SELECT name, DATE_ADD(orderDate,INTERVAL
duration DAy)
FROM readers,orders
WHERE
DATE_ADD(Date(orders.orderDate),INTERVAL
duration DAy)<CURRENT_DATE AND
orders.readersID=readers.id
GROUP BY name
ORDER BY readers.name
7,8,9. Используя оператор GRANT создать пользователя с привилегией SELECT, INSERT и DELETE
на таблицу authors.
От имени созданного пользователя выполните запрос выборки к таблице books. Убедитесь
в успешном выполнении запроса. Попытайтесь выполнить вставку или изменение данных
в таблице books и выборку из других таблиц базы.
GRANT select, insert, delete
ON books
TO user
IDENTIFIED BY 'user'
SELECT id,title
FROM books
Download