Загрузка данных


-- =====================================================
--   ИНФОРМАЦИОННАЯ СИСТЕМА
--   "УПРАВЛЕНИЕ БИБЛИОТЕЧНЫМ ФОНДОМ"
-- =====================================================

CREATE DATABASE LibraryManagement;
USE LibraryManagement;

-- =====================================================
-- ТАБЛИЦА: ИЗДАТЕЛЬСТВО
-- =====================================================

CREATE TABLE Publisher (
    publisher_id INT PRIMARY KEY AUTO_INCREMENT,
    publisher_name VARCHAR(150) NOT NULL,
    director_name VARCHAR(100),
    address VARCHAR(200),
    city VARCHAR(100),
    country VARCHAR(100),
    phone VARCHAR(20),
    email VARCHAR(100),
    website VARCHAR(150),
    foundation_year INT
);

-- =====================================================
-- ТАБЛИЦА: ПОЛКА
-- =====================================================

CREATE TABLE Shelf (
    shelf_id INT PRIMARY KEY AUTO_INCREMENT,
    shelf_number VARCHAR(20) NOT NULL,
    hall_name VARCHAR(100),
    section_name VARCHAR(100),
    floor_number INT,
    max_capacity INT,
    current_books_count INT DEFAULT 0
);

-- =====================================================
-- ТАБЛИЦА: ЧИТАТЕЛЬ
-- =====================================================

CREATE TABLE Reader (
    reader_id INT PRIMARY KEY AUTO_INCREMENT,
    full_name VARCHAR(150) NOT NULL,
    birth_date DATE,
    gender VARCHAR(10),
    address VARCHAR(200),
    city VARCHAR(100),
    phone VARCHAR(20),
    email VARCHAR(100),
    passport_number VARCHAR(30),
    ticket_number VARCHAR(30) UNIQUE,
    registration_date DATE,
    status VARCHAR(30)
);

-- =====================================================
-- ТАБЛИЦА: БИБЛИОТЕКАРЬ
-- =====================================================

CREATE TABLE Librarian (
    librarian_id INT PRIMARY KEY AUTO_INCREMENT,
    full_name VARCHAR(150) NOT NULL,
    birth_date DATE,
    position_name VARCHAR(100),
    education VARCHAR(100),
    work_experience INT,
    phone VARCHAR(20),
    email VARCHAR(100),
    salary DECIMAL(10,2),
    hire_date DATE
);

-- =====================================================
-- ТАБЛИЦА: АВТОР
-- =====================================================

CREATE TABLE Author (
    author_id INT PRIMARY KEY AUTO_INCREMENT,
    full_name VARCHAR(150) NOT NULL,
    birth_year INT,
    death_year INT,
    country VARCHAR(100),
    biography TEXT
);

-- =====================================================
-- ТАБЛИЦА: ЖАНР
-- =====================================================

CREATE TABLE Genre (
    genre_id INT PRIMARY KEY AUTO_INCREMENT,
    genre_name VARCHAR(100) NOT NULL,
    description TEXT
);

-- =====================================================
-- ТАБЛИЦА: КНИГА
-- =====================================================

CREATE TABLE Book (
    book_id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    subtitle VARCHAR(200),
    isbn VARCHAR(30) UNIQUE,
    publish_year INT,
    page_count INT,
    language_name VARCHAR(50),
    book_description TEXT,
    edition_number INT,
    price DECIMAL(10,2),
    quantity_total INT,
    quantity_available INT,

    publisher_id INT,
    shelf_id INT,
    genre_id INT,

    FOREIGN KEY (publisher_id)
        REFERENCES Publisher(publisher_id),

    FOREIGN KEY (shelf_id)
        REFERENCES Shelf(shelf_id),

    FOREIGN KEY (genre_id)
        REFERENCES Genre(genre_id)
);

-- =====================================================
-- СВЯЗЬ КНИГА-АВТОР
-- (многие ко многим)
-- =====================================================

CREATE TABLE BookAuthor (
    book_author_id INT PRIMARY KEY AUTO_INCREMENT,

    book_id INT,
    author_id INT,

    FOREIGN KEY (book_id)
        REFERENCES Book(book_id),

    FOREIGN KEY (author_id)
        REFERENCES Author(author_id)
);

-- =====================================================
-- ТАБЛИЦА: ВЫДАЧА КНИГ
-- =====================================================

CREATE TABLE Issue (
    issue_id INT PRIMARY KEY AUTO_INCREMENT,

    issue_date DATE NOT NULL,
    expected_return_date DATE,
    actual_return_date DATE,

    issue_status VARCHAR(50),
    fine_amount DECIMAL(10,2) DEFAULT 0,

    notes TEXT,

    reader_id INT,
    book_id INT,
    librarian_id INT,

    FOREIGN KEY (reader_id)
        REFERENCES Reader(reader_id),

    FOREIGN KEY (book_id)
        REFERENCES Book(book_id),

    FOREIGN KEY (librarian_id)
        REFERENCES Librarian(librarian_id)
);

-- =====================================================
-- ТАБЛИЦА: БРОНИРОВАНИЕ КНИГ
-- =====================================================

CREATE TABLE Reservation (
    reservation_id INT PRIMARY KEY AUTO_INCREMENT,

    reservation_date DATE,
    expiration_date DATE,
    reservation_status VARCHAR(50),

    reader_id INT,
    book_id INT,

    FOREIGN KEY (reader_id)
        REFERENCES Reader(reader_id),

    FOREIGN KEY (book_id)
        REFERENCES Book(book_id)
);

-- =====================================================
-- ТАБЛИЦА: ШТРАФЫ
-- =====================================================

CREATE TABLE Fine (
    fine_id INT PRIMARY KEY AUTO_INCREMENT,

    fine_date DATE,
    amount DECIMAL(10,2),
    payment_status VARCHAR(50),
    reason TEXT,

    reader_id INT,
    issue_id INT,

    FOREIGN KEY (reader_id)
        REFERENCES Reader(reader_id),

    FOREIGN KEY (issue_id)
        REFERENCES Issue(issue_id)
);

-- =====================================================
-- ТЕСТОВЫЕ ДАННЫЕ
-- =====================================================

INSERT INTO Genre (genre_name, description)
VALUES
('Программирование', 'Книги по IT и программированию'),
('Роман', 'Художественная литература'),
('Наука', 'Научная литература');

INSERT INTO Publisher (
    publisher_name,
    director_name,
    address,
    city,
    country,
    phone,
    email,
    website,
    foundation_year
)
VALUES
(
    'Эксмо',
    'Иванов А.А.',
    'ул. Ленина 10',
    'Москва',
    'Россия',
    '+7-999-111-22-33',
    'info@eksmo.ru',
    'www.eksmo.ru',
    1991
),
(
    'АСТ',
    'Петров В.В.',
    'пр. Мира 25',
    'Санкт-Петербург',
    'Россия',
    '+7-999-555-66-77',
    'contact@ast.ru',
    'www.ast.ru',
    1989
);

INSERT INTO Shelf (
    shelf_number,
    hall_name,
    section_name,
    floor_number,
    max_capacity
)
VALUES
('A-12', 'Главный зал', 'Программирование', 1, 100),
('B-07', 'Художественный зал', 'Романы', 2, 150);

INSERT INTO Author (
    full_name,
    birth_year,
    country
)
VALUES
('Лев Толстой', 1828, 'Россия'),
('Герберт Шилдт', 1951, 'США');

INSERT INTO Reader (
    full_name,
    birth_date,
    gender,
    address,
    city,
    phone,
    email,
    passport_number,
    ticket_number,
    registration_date,
    status
)
VALUES
(
    'Иванов Иван Иванович',
    '2000-04-12',
    'Мужской',
    'ул. Гагарина 15',
    'Москва',
    '+7-999-123-45-67',
    'ivanov@mail.ru',
    '4510 123456',
    'RB-1001',
    CURDATE(),
    'Активен'
);

INSERT INTO Librarian (
    full_name,
    birth_date,
    position_name,
    education,
    work_experience,
    phone,
    email,
    salary,
    hire_date
)
VALUES
(
    'Смирнова Анна Сергеевна',
    '1985-06-11',
    'Главный библиотекарь',
    'Высшее',
    12,
    '+7-999-888-77-66',
    'smirnova@library.ru',
    65000,
    '2015-03-01'
);

INSERT INTO Book (
    title,
    subtitle,
    isbn,
    publish_year,
    page_count,
    language_name,
    book_description,
    edition_number,
    price,
    quantity_total,
    quantity_available,
    publisher_id,
    shelf_id,
    genre_id
)
VALUES
(
    'Java: Полное руководство',
    'Подробный справочник',
    '978-5-17-123456-7',
    2021,
    1200,
    'Русский',
    'Книга по языку Java',
    12,
    2500,
    10,
    7,
    1,
    1,
    1
),
(
    'Война и мир',
    'Роман-эпопея',
    '978-5-17-765432-1',
    2018,
    1300,
    'Русский',
    'Классический роман',
    3,
    1800,
    5,
    4,
    2,
    2,
    2
);

INSERT INTO BookAuthor (book_id, author_id)
VALUES
(1, 2),
(2, 1);

INSERT INTO Issue (
    issue_date,
    expected_return_date,
    actual_return_date,
    issue_status,
    fine_amount,
    notes,
    reader_id,
    book_id,
    librarian_id
)
VALUES
(
    '2025-05-01',
    '2025-05-15',
    NULL,
    'Выдана',
    0,
    'Книга выдана в хорошем состоянии',
    1,
    1,
    1
);

INSERT INTO Reservation (
    reservation_date,
    expiration_date,
    reservation_status,
    reader_id,
    book_id
)
VALUES
(
    CURDATE(),
    DATE_ADD(CURDATE(), INTERVAL 7 DAY),
    'Активно',
    1,
    2
);

-- =====================================================
-- ПРИМЕРЫ SQL-ЗАПРОСОВ
-- =====================================================

-- Все книги библиотеки

SELECT * FROM Book;

-- Книги и их авторы

SELECT
    Book.title,
    Author.full_name AS author
FROM Book
JOIN BookAuthor
ON Book.book_id = BookAuthor.book_id
JOIN Author
ON BookAuthor.author_id = Author.author_id;

-- Выданные книги

SELECT
    Reader.full_name,
    Book.title,
    Issue.issue_date,
    Issue.expected_return_date,
    Issue.issue_status
FROM Issue
JOIN Reader
ON Issue.reader_id = Reader.reader_id
JOIN Book
ON Issue.book_id = Book.book_id;

-- Просроченные книги

SELECT
    Reader.full_name,
    Book.title,
    Issue.expected_return_date
FROM Issue
JOIN Reader
ON Issue.reader_id = Reader.reader_id
JOIN Book
ON Issue.book_id = Book.book_id
WHERE Issue.expected_return_date < CURDATE()
AND Issue.actual_return_date IS NULL;

-- Количество книг по жанрам

SELECT
    Genre.genre_name,
    COUNT(Book.book_id) AS total_books
FROM Genre
LEFT JOIN Book
ON Genre.genre_id = Book.genre_id
GROUP BY Genre.genre_name;

-- Книги определенного издательства

SELECT
    Book.title,
    Publisher.publisher_name
FROM Book
JOIN Publisher
ON Book.publisher_id = Publisher.publisher_id
WHERE Publisher.publisher_name = 'Эксмо';

-- Читатели со штрафами

SELECT
    Reader.full_name,
    Fine.amount,
    Fine.payment_status
FROM Fine
JOIN Reader
ON Fine.reader_id = Reader.reader_id;