Практика: создание базы «Библиотека»
Мы прошли три лекции по базам данных. Теперь — время практики. Мы создадим базу данных «Библиотека» с нуля: от пустого окна SSMS до готовых запросов с JOIN и агрегатными функциями.
Authors, Books, Readers, Loans. Наполним их данными и напишем запросы для настоящих отчётов.
Цель и задачи
Цель: получить практические навыки создания базы данных и написания SQL-запросов в MS SQL Server.
Что мы сделаем
- 1 Создадим базу данных
LibraryDB. - 2 Создадим таблицы
Authors,Books,Readers,Loans. - 3 Настроим первичные и внешние ключи.
- 4 Заполним таблицы тестовыми данными.
- 5 Напишем запросы с
JOIN,GROUP BY,HAVING. - 6 Построим отчёт: кто какие книги брал и когда.
Схема базы данных
Вот как устроена наша база. Четыре таблицы, три связи.
Loans.Шаг 1: запускаем SSMS
Открываем SQL Server Management Studio (SSMS — программа для работы с MS SQL Server).
Что делаем
- Запускаем SSMS.
- В окне подключения вводим параметры:
- Server type: Database Engine
- Server name:
localhost\SQLEXPRESS(или имя вашего экземпляра) - Authentication: Windows Authentication
- Нажимаем Connect.
services.msc).Шаг 2: создаём базу данных
В SSMS нажимаем New Query — открывается окно для SQL-запросов. Пишем первую команду.
CREATE DATABASE LibraryDB— создаёт базу данных с именем LibraryDB.GO— разделитель пакетов команд (в MS SQL Server).USE LibraryDB— говорим серверу: «дальше работаем в этой базе».
Шаг 3: таблица Authors
Создаём таблицу авторов. У неё будет только идентификатор и имя — этого достаточно.
IDENTITY(1,1) означает: первая запись получит Id = 1, каждая следующая — на 1 больше.Шаг 4: таблица Books
Таблица книг. У каждой книги есть автор — ссылка на Authors.Id.
FOREIGN KEY (AuthorId) REFERENCES Authors(Id) гарантирует: нельзя добавить книгу с несуществующим автором.Шаг 5: таблица Readers
Таблица читателей. Здесь хранятся те, кто берёт книги в библиотеке.
YYYY-MM-DD. Например, '2026-10-24' — 24 октября 2026 года.Шаг 6: таблица Loans
Таблица выдач. Она связывает книги и читателей: кто какую книгу взял и когда вернул.
Шаг 7: заполняем Authors
Добавим трёх авторов. Id не указываем — его автоматически присвоит IDENTITY.
Проверим результат:
Шаг 8: заполняем Books
Добавим книги. Каждая привязана к автору через AuthorId.
Проверим:
AuthorId = 99, которого нет в Authors, — база выдаст ошибку внешнего ключа. Это защита от «сиротских» записей.Шаг 9: заполняем Readers
Добавим читателей библиотеки.
Проверим:
'YYYY-MM-DD'. Это стандартный формат для MS SQL Server.Шаг 10: заполняем Loans
Добавим записи о выдачах книг. Здесь есть и возвращённые книги, и те, что ещё на руках.
BookId = 4 («Гарри Поттер») выдана дважды — Ивану и Ольге. Это нормально: одну и ту же книгу могут брать разные читатели в разное время.Проверка: что получилось
Прежде чем писать сложные запросы, убедимся, что данные на месте.
Запрос 1: книги с авторами
Первый запрос — соединяем Books и Authors, чтобы увидеть название книги и имя автора.
Результат:
Запрос 2: книги Толстого
Найдём все книги Льва Толстого.
Результат:
WHERE применяется к результатам соединения. Мы ищем по имени автора, но оно находится в таблице Authors.Запрос 3: кто что брал
Соединяем три таблицы: книги, читатели и выдачи.
Результат:
INNER JOIN. Это стандартный приём в SQL.Запрос 4: невозвращённые книги
Найдём книги, которые ещё на руках. У них ReturnDate = NULL.
Результат:
NULL нельзя использовать = NULL. Это всегда даст пустой результат. Нужно IS NULL или IS NOT NULL.Запрос 5: сколько книг у каждого автора
Используем GROUP BY и COUNT, чтобы посчитать книги по авторам.
Результат:
LEFT JOIN, чтобы даже авторы без книг попали в результат (с 0). С INNER JOIN они бы исчезли.Запрос 6: активные читатели
Найдём читателей, которые взяли больше одной книги.
Результат:
HAVING COUNT(l.Id) > 1 — фильтрует уже сгруппированные результаты. В WHERE так нельзя.Запрос 7: статистика по годам
Посмотрим, сколько книг издано в каждом десятилетии.
Результат:
(Year / 10) * 10 округляет год вниз до десятков. 1833 → 1830, 1997 → 1990. Это простой способ группировать по десятилетиям.Запрос 8: самая популярная книга
Найдём книгу, которую брали чаще всего.
Результат:
Сводка всех запросов
Вот что мы научились делать в этой практике.
Самостоятельные задания
Попробуйте написать эти запросы сами, без подсказок. Если что-то не получается — вернитесь к соответствующим слайдам.
- Выведите всех читателей, зарегистрированных после 1 сентября 2026 года.
- Выведите все книги Стивена Кинга.
- Найдите читателей, которые брали книги, но ещё не вернули ни одной.
- Посчитайте, сколько раз каждая книга была выдана.
- Найдите автора, у которого больше всего книг.
- Выведите список всех книг с указанием автора и года, отсортированный по году издания (от старых к новым).
Что вы освоили
Подведём итоги практики.
- ✅ CREATE DATABASE — создание базы данных.
- ✅ CREATE TABLE — создание таблиц с типами.
- ✅ PRIMARY KEY, IDENTITY — первичные ключи и автонумерация.
- ✅ FOREIGN KEY — внешние ключи и связи между таблицами.
- ✅ INSERT INTO — добавление данных, в том числе с NULL.
- ✅ INNER JOIN, LEFT JOIN — соединение двух и трёх таблиц.
- ✅ WHERE, IS NULL — фильтрация строк.
- ✅ GROUP BY, HAVING — группировка и фильтрация групп.
- ✅ COUNT, ORDER BY — статистика и сортировка.
Домашнее задание
Задания для самостоятельной работы. Первые три обязательны, остальные — для оценки «отлично».
- Добавьте ещё двух авторов и трёх книг.
- Добавьте нового читателя и оформите ему выдачу книги.
- Напишите запрос: «все книги с авторами и годами издания, отсортированные по автору».
- Найдите читателя, который взял больше всего книг.
- Найдите автора, чьи книги ни разу не брали.
- Посчитайте средний год издания книг по каждому автору.
Что дальше?
Мы научились работать с базой данных через SSMS — вручную. Но настоящие приложения работают с базой программно. Именно этим займёмся на следующей практике.
- Практика 2: подключение Java к MS SQL Server через JDBC.
- Драйвер
mssql-jdbc,Connection,PreparedStatement,ResultSet. - Консольное приложение, которое читает и пишет данные в нашу базу «Библиотека».
Спасибо за работу!
📚
База «Библиотека» готова!
Вы создали четыре связанные таблицы, заполнили их данными и написали восемь настоящих SQL-запросов. Теперь вы умеете работать с базой данных вручную.