1. Основы реляционных баз данных
Структура и логика реляционных баз данных: от теории к первым запросам
Представьте, что вы управляете крупным университетом. У вас есть информация о 15 000 студентов, 500 преподавателях, расписании занятий, оценках и стипендиях. Если попытаться хранить все эти данные в обычных текстовых файлах или даже в огромных таблицах электронных таблиц, вы быстро столкнетесь с хаосом. Поиск нужной информации будет занимать часы, а при обновлении данных неизбежно возникнут ошибки.
Именно для решения проблемы надежного хранения, быстрого поиска и безопасного изменения огромных массивов информации были созданы специализированные системы.
> Данные — это новая нефть. Но, как и нефть, они бесполезны, пока не очищены и не структурированы. > > Wired
Для работы с информацией в IT-индустрии используются базы данных (БД) — структурированные хранилища информации. Однако сама по себе база данных — это просто набор файлов на жестком диске. Чтобы с этими файлами можно было безопасно и быстро работать, используется Система управления базами данных (СУБД) — сложный программный комплекс, который выступает посредником между пользователем и физическими файлами.
Анатомия реляционной модели
Исторически существовало множество способов организации данных: иерархические (в виде дерева), сетевые (в виде графа). Но стандартом де-факто стала реляционная модель.
Слово реляционный происходит от английского термина relation (отношение). В математике и теории баз данных под «отношением» понимается то, что мы в быту называем обычной двумерной таблицей.
Реляционная база данных состоит из множества взаимосвязанных таблиц. Каждая таблица имеет строгую структуру:
* Столбец (атрибут или поле) — описывает одно конкретное свойство объекта. Например, в таблице студентов могут быть столбцы «Имя», «Фамилия», «Год поступления». * Строка (кортеж или запись) — содержит информацию об одном конкретном экземпляре объекта. Одна строка — это один конкретный студент со всеми его характеристиками.
Как таблицы связываются между собой
Главная сила реляционных баз данных заключается в отсутствии дублирования информации. Если студент учится на факультете «Информатика», мы не пишем слово «Информатика» напротив его фамилии каждый раз. Мы создаем отдельную таблицу факультетов, а в таблице студентов оставляем лишь ссылку на нужный факультет.
Для организации таких связей используются ключи:
Пример с числами: в таблице Faculties факультет «Информатика» имеет ID = 5. В таблице Students у студента Ивана в столбце faculty_id (внешний ключ) будет стоять число 5. СУБД понимает эту связь и по запросу может объединить данные.
Язык SQL: инструмент общения с СУБД
Для управления реляционными базами данных используется язык SQL (Structured Query Language — язык структурированных запросов). Это декларативный язык. В отличие от классического программирования, где вы пишете, как получить результат (шаг за шагом), в SQL вы описываете, что хотите получить, а СУБД сама решает, как это сделать наиболее эффективно.
Команды SQL делятся на несколько логических групп. Для успешной сдачи экзамена критически важно различать две основные группы: DDL и DML.
| Группа команд | Расшифровка | Назначение | Основные операторы |
| :--- | :--- | :--- | :--- |
| DDL | Data Definition Language | Работа со структурой (создание, изменение, удаление самих таблиц) | CREATE, ALTER, DROP |
| DML | Data Manipulation Language | Работа с данными (добавление, чтение, изменение, удаление строк внутри таблиц) | SELECT, INSERT, UPDATE, DELETE |
DDL: Проектирование структуры (создание и изменение таблиц)
Прежде чем записывать данные, необходимо подготовить для них место — создать таблицу и жестко задать типы данных для каждого столбца.
Создание таблицы (CREATE)
Допустим, нам нужно создать таблицу для хранения информации о книгах в библиотеке.
Разберем логику этого запроса:
* CREATE TABLE books — команда СУБД создать новую таблицу с именем books.
* Внутри скобок перечисляются столбцы и их типы данных.
* INT означает целое число. Приписка PRIMARY KEY указывает, что book_id — это уникальный идентификатор.
* VARCHAR(100) — текстовая строка переменной длины, максимум 100 символов.
* DECIMAL(8, 2) — точное дробное число, где всего 8 цифр, из которых 2 находятся после запятой (идеально для хранения денег, например, 1500.50 руб.).
Изменение структуры (ALTER)
Жизнь меняется, и требования к базе данных тоже. Представьте, что через год работы библиотеки руководство решило выдавать книгам рейтинг. Нам нужно добавить новый столбец в уже существующую таблицу. Для этого используется команда ALTER.
Эта команда аккуратно добавит новый столбец rating ко всем существующим строкам, заполнив их пустотой (специальным значением NULL, которое означает отсутствие данных), не повредив при этом уже сохраненную информацию.
DML: Манипулирование данными
Когда «каркас» базы данных готов, в дело вступает язык манипулирования данными. Это те команды, которые используются в повседневной работе приложений каждую секунду.
Добавление данных (INSERT)
Чтобы добавить новую книгу в нашу таблицу, мы используем оператор INSERT INTO.
Здесь мы сначала указываем, в какие именно столбцы хотим вставить данные, а затем через ключевое слово VALUES передаем сами значения в строгом соответствии с порядком столбцов. Текст обязательно берется в одинарные кавычки, а числа пишутся без них.
Чтение данных (SELECT)
Команда SELECT — абсолютный чемпион по частоте использования. Она позволяет извлекать данные, фильтровать их и производить вычисления.
Для успешной сдачи экзамена необходимо понимать логический порядок выполнения этого запроса внутри СУБД. Он отличается от того порядка, в котором мы пишем код:
FROM books. СУБД находит нужную таблицу на диске.WHERE publish_year >= 2020. СУБД отбрасывает все книги, изданные до 2020 года. В математическом смысле здесь проверяется условие , где — год издания конкретной строки.SELECT title, price. СУБД «отрезает» лишние столбцы (например, автора и ID) и возвращает пользователю только названия и цены.Обновление данных (UPDATE)
Если цена книги изменилась, нам нужно обновить существующую запись.
Важное правило безопасности: оператор UPDATE почти всегда должен сопровождаться условием WHERE. Если вы напишете просто UPDATE books SET price = 1500.00;, СУБД послушно установит эту цену абсолютно для всех книг в библиотеке, что приведет к катастрофе.
Удаление данных (DELETE)
Когда книга списана, ее нужно удалить из базы.
Как и в случае с обновлением, отсутствие WHERE приведет к полному удалению всех строк из таблицы. Сама таблица (ее структура) при этом останется, но будет пустой.
Итоги
* Реляционная база данных хранит информацию в виде двумерных таблиц (отношений), состоящих из строк (записей) и столбцов (атрибутов).
* Связь между таблицами обеспечивается за счет совпадения значений Первичного ключа (Primary Key) одной таблицы и Внешнего ключа (Foreign Key) другой.
* Язык SQL делится на подмножества: DDL отвечает за структуру (создание и изменение таблиц), а DML — за сами данные (добавление, чтение, обновление, удаление).
* Логический порядок обработки запроса SELECT начинается с определения источника данных (FROM), затем идет фильтрация строк (WHERE), и лишь затем выборка нужных столбцов (SELECT).