Вы проектируете базу данных для небольшой городской библиотеки. Библиотека хранит книги, ведёт учёт читателей и фиксирует каждую выдачу книги.
Авторы (authors)
- Уникальный идентификатор
- Имя автора — обязательное
- Страна — необязательная
Книги (books)
- Уникальный идентификатор
- Название — обязательное
- Год издания — целое число, необязательное
- Количество страниц — целое число, необязательное, не может быть отрицательным
- Ссылка на автора — обязательная
Читатели (readers)
- Уникальный идентификатор
- Имя читателя — обязательное
- Email — обязательный, уникальный
- Дата регистрации — текст, обязательный
Выдачи (loans)
- Уникальный идентификатор
- Ссылка на книгу — обязательная
- Ссылка на читателя — обязательная
- Дата выдачи — текст, обязательный
- Дата возврата — текст, необязательная (если книга ещё не возвращена —
NULL) - Одна и та же книга не может быть выдана одному читателю дважды одновременно — составной
UNIQUEпоbook_idиreader_id
authors books
┌─────────────┐ ┌──────────────────────┐
│ id INT │◄───────│ author_id INT │
│ name TEXT │ │ id INT (PK) │
│ country TEXT│ │ title TEXT │
└─────────────┘ │ year INT │
│ pages INT │
└──────────────────────┘
▲
readers │
┌──────────────────┐ loans │
│ id INT (PK) │ ┌────────┴─────────────┐
│ name TEXT │ │ id INT (PK) │
│ email TEXT │ │ book_id INT │
│ reg_date TEXT │◄──│ reader_id INT │
└──────────────────┘ │ loan_date TEXT │
│ return_date TEXT │
└──────────────────────┘
- Все первичные ключи —
INTEGER PRIMARY KEY AUTOINCREMENT - Внешние ключи объявлены через
FOREIGN KEY ... REFERENCES - Ограничения
NOT NULLрасставлены согласно описанию CHECKна столбцеpages— значение должно быть больше 0- Составной
UNIQUEнаloansпо(book_id, reader_id)
Создайте файл library_seed.sql и заполните каждую таблицу данными согласно описанию ниже. Для каждой таблицы — от 5 до 7 строк. Используйте многострочный INSERT INTO ... VALUES.
Авторы (5–6 записей): Несколько отечественных и зарубежных авторов. Например: Лев Толстой (Россия), Фёдор Достоевский (Россия), Джордж Оруэлл (Великобритания), Габриэль Гарсиа Маркес (Колумбия), Харпер Ли (США). Можно добавить своего.
Книги (6–7 записей): По одной-две книги на автора. Укажите реальные годы издания и примерное количество страниц. Например: "Война и мир" (1869, 1274 стр.), "Преступление и наказание" (1866, 608 стр.), "1984" (1949, 328 стр.), "Скотный двор" (1945, 112 стр.), "Сто лет одиночества" (1967, 448 стр.), "Убить пересмешника" (1960, 336 стр.).
Читатели (5–7 записей):
Читатели с разными email-адресами. Даты регистрации в формате YYYY-MM-DD — разброс от 2023 до 2024 года. Например: Анна Петрова (anna@mail.ru, 2023-03-15), Сергей Волков (sergey@mail.ru, 2023-07-22), Мария Соколова (maria@gmail.com, 2023-11-05), Игорь Зайцев (igor@yandex.ru, 2024-01-18), Елена Морозова (elena@gmail.com, 2024-04-10), Павел Орлов (pavel@mail.ru, 2024-05-30)
Выдачи (6–7 записей):
- Несколько выдач уже завершены (есть
return_date) - Несколько книг ещё на руках (
return_date=NULL) - Один читатель должен иметь минимум две выдачи (разные книги)
- Одна книга должна встречаться в двух разных выдачах (разным читателям, в разное время)
Напишите SQL-запросы для каждого из заданий. Каждый запрос — отдельный файл или отдельный блок в одном файле library_queries.sql.
Запрос 1. Выведите все книги с именем автора. Столбцы: title, author_name, year. Отсортируйте по году издания.
Запрос 2. Найдите все книги которые сейчас находятся на руках у читателей (не возвращены). Выведите: название книги, имя читателя, дату выдачи.
Запрос 3. Выведите читателей которые брали книги хотя бы один раз. Используйте EXISTS. Выведите name и email.
Запрос 4. Посчитайте сколько книг написал каждый автор в базе. Выведите имя автора и количество книг. Отсортируйте по убыванию.
Запрос 5. Найдите книги которые ни разу не выдавались. Выведите title и year.
Запрос 6. Посчитайте сколько раз каждая книга была выдана (включая книги с нулём выдач). Выведите title и loan_count. Отсортируйте по убыванию.
Запрос 7. Найдите читателя который взял больше всего книг. Выведите name и количество выдач.
Запрос 8. Выведите все выдачи с полной информацией: имя читателя, название книги, имя автора, дата выдачи, дата возврата. Если книга не возвращена — в столбце return_date должно быть значение 'не возвращена' вместо NULL (используйте COALESCE(loans.return_date, 'не возвращена')). Отсортируйте по дате выдачи.
Запрос 9. Используя CTE, найдите авторов у которых средний объём книг (страниц) выше среднего по всей библиотеке. Выведите имя автора и среднее количество страниц.
Запрос 10. Используя транзакцию: добавьте нового читателя, выдайте ему одну из существующих книг. Зафиксируйте транзакцию и проверьте результат через SELECT.
library_seed.sql— создание таблиц и наполнение даннымиlibrary_queries.sql— все 10 запросов с комментариями (-- Запрос 1,-- Запрос 2, ...)