НГТУ Кафедра ВСТ Лабораторная работа № 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