Вы находитесь на странице: 1из 7

Реляционные базы данных

Практически во всех задачах, которые встречались нам ранее, данные поступали из


стандартного ввода или из файла вроде input.txt. Однако в реальных приложениях
очень часто данные нужно хранить между запусками и периодически
модифицировать. В принципе данные можно хранить в простых текстовых файлах и
обновлять их там же. Но это не очень удобно и не слишком надёжно, если речь идёт
о больших приложениях.

Понятие база данных — крайне общее. Это — совокупность данных, организованная


так, чтобы они могли быть найдены и обработаны при помощи ЭВМ. Сейчас
практически всегда, когда употребляется словосочетание «база данных», имеется в
виду какой-нибудь конкретный подход для хранения и обработки данных, или даже
конкретное ПО (конкретная «СУБД», система управления базами данных), которое
всё это реализует.

В этой теме мы будем работать с реляционными базами данных. «Реляционные» —


это от слова relations — отношения. Если забить на формализм, то суть подхода в
следующем. Существует ровно две сущности: элемент (value) и таблица (table).
Элемент — это какой-то кусочек данных, которые мы храним: число, строка, время и
т.п. Таблица — ну, это прямоугольная таблица, в которой есть строки и столбцы.
Множество столбцов (их имён и типов) называется заголовком таблицы.
При помощи таблиц можно хранить разнообразные отношения (relations), в том
числе чертовски сложные. Например, вот так можно хранить граф:

Таблица «вершины»
Node
A
B
C
Node
D
E
F
G
Таблица «рёбра»
from to
A B
B C
B D
B E
C E
D E
E F
G D

На множестве всех таблиц определены операции, которые все вместе называются


«реляционной алгеброй». Вот список почти всех таких операций:

• переименование таблицы — любую таблицу можно переименовать и получить


новую таблицу с новым именем;
• переименование столбцов — если поменять в таблице имена столцбов, то тоже
получится таблица;
• объединение таблиц — если у двух таблиц одинаковый заголовок (множество
столбцов), то их можно объединить: в результате будет таблица с тем же
заголовком, и множеством строк, в которой каждая либо лежит в первой, либо во
второй таблице, либо в обеих;
• пересечение таблиц — если у двух таблиц одинаковый заголовок, то их можно
пересечь: в результате будет таблица с тем же заголовком, и множеством строк, в
которой каждая лежит и в первой, и во второй таблице;
• произведение таблиц — у получившийся таблицы будет суммарное количество
столбцов, а строки — все возможные наборы, которые начинаются на строчку
первой таблицы и заканчиваются на строку второй;
• выборка из таблицы — у любой таблицы можно взять подмножество строк.
Получится таблица с тем же заголовком и частью строк;
• проекция таблицы — у любой таблицы можно взять подмножество столбцов,
после чего удалить (или не удалять) дубликаты. Получится таблица, в котором
меньше столбов, и столько же, либо меньше строк (из-за удаления дублей);
• добавление строк — в таблицу можно добавить новую строку с данными, и
получить таблицу с тем же заголовком, но одной «бонусной» строкой;
• добавление столбцов — в таблицу можно добавить столбец с данным именем,
значения которого в каждой строчке определяется функцией от значений во всех
остальных столбцах данной строки.
• соединение таблиц — если у двух таблиц есть общие столбцы, то соединение
таблиц — это новая таблица со всеми уникальными столбцами, строки которой
«склеены» по совпадающим значениям общих столбцов. Эта операция — это
композиция произведения, выборки и проекции: в произведении таблиц берём
только те пары, где значения общих столбцов одинаковы. После чего удаляем
общие столбцы;
Примеры всех этих операций будут дальше. Примечательно в них только то, что все
они берут на вход одну или две таблицы и, может быть, какие-нибудь
дополнительные данные, а на выходе всегда получают новую таблицу. Именно из-за
замкнутости это всё называют «алгеброй».

SQL — язык структурированных запросов


Для того, чтобы формально описывать эти реляционные операции над таблицами,
придуман специальный язык: SQL (Structured Query Language, язык
структурированных запросов). У языка SQL есть некий стандарт (последняя
версия ISO/IEC 9075:2016), однако конкретные «фразы» и богатство возможностей
языка сильно зависят от конкретной реализации. Кроме реляционных операций
язык позволяет создавать новые пустые таблицы с заданными столбцами,
добавлять в таблицы новые записи, изменять и удалять строчки, изменять
структуру таблиц, объявлять взаимосвязи между таблицами и т.п.

Вот примеры некоторых операций для типичной реализации SQL:

Операция Пример запроса


Создание таблицы CREATE TABLE students (name TEXT, age NUMERIC);
INSERT INTO students VALUES ('Вася', 13), ('Маша',
Добавление строчки 14);
Запрос всех данных SELECT * FROM students;
SELECT * FROM students UNION SELECT * FROM
Объединение таблиц students;
SELECT * FROM students INTERSECT SELECT * FROM
Пересечение таблиц students;
Произведение таблиц SELECT * FROM students CROSS JOIN teachers;
Выборка из таблицы SELECT * FROM students WHERE age < 14;
Проекция таблицы SELECT age FROM students;
Добавление столбцов SELECT students.*, age*365 as days FROM students;
Cоединение таблиц SELECT * FROM students JOIN names USING (name);
Запрос данных с select stud.name as surname, stud.age as old from
переимнованием students as stud;
Переименование таблицы в
ALTER TABLE names RENAME TO names2;
базе
Переименование столбцов в
ALTER TABLE names2 RENAME COLUMN name TO rname;
базе
SQLite
SQLite — это, пожалуй, самая распространённая СУБД — система управления базами
данных. Коротко говоря, SQLite — это одна из программ, которая позволяет
работать с базой данных и делать всё, описанное выше. Она очень компактна,
быстра, и встроена почти всюду: в браузеры, телефоны, языки программирования и
т.п. Её код передан в общественное достояние, она — одно из наиболее
протестированного и надёжного ПО в мире.

Для экспериментов со своими данными удобнее всего установить sqlitebrowser.


Документация о всех командах, которые «понимает» SQLite на sqlite.org.
Запросы данных, ввод-вывод
Во всех задачах на подготовку запросов даётся база данных в db-файле (который при
желании можно скачать). В каждой задаче нужно подготовить SQL-запрос, который
решает поставленную задачу. И текст самого запроса необходимо сдать в
проверяющую систему. Если запросов несколько, то они должны быть отделены
точкой с запятой. Готовить запросы удобно во встроенной в эту страницу систему.
(Только не пытайте использовать Internet Explorer, в нём работать не будет).

База «Студенты»
В первой части листка все забросы касаются базы «Школьники», в которой ровно
одна таблица students:

Таблица students
Имя столбца Тип Смысл
Id INTEGER уникальный id школьника
Name TEXT Имя школьника
surname TEXT Фамилия школьника
Gender TEXT Пол: м/ж
Age INTEGER Возраст, полных лет
avg_score INTEGER Средний балл
Class TEXT Класс
classroom TEXT «Домашняя» аудитория
supervisor TEXT Классный руководитель
last_update TIMESTAMP Дата и время последнего изменения
При необходимости скачать базу можно по ссылке. Первые 5 её строк выглядят так:
i name surna gen a avg_sc cla classro superv last_up
d me der g ore ss om isor date
e
2019-
Иллар Осипо 1 10 02-16
1 м 4.6596 216 Душин
ион в 5 Б 10:02:4
8
2019-
1 04-05
2 Педро Лукин м 4.4163 8Д 316 Душин
3 23:41:2
2
2019-
Гретел Токар 1 11 05-15
3 ж 3.969 306 Юрков
ь ева 5 Б 02:50:0
9
2019-
Пасту 1 Белоус 03-19
4 Марк м 4.7221 7В 213
хов 2 ов 05:00:5
4
5 Мэлс Кругл м 1 3.6567 10 216 Душин 2019-
ов 6 Б 04-07
18:38:4
7
Синтаксис SQL и syntax diagrams
Синтакс языка SQL удобно изображать при помощи диаграмм такого вида (они
называются railroad diagrams):

Чтобы получить валидный запрос, нужно пройти от начала до конца любым


способом. Более того, можно сделать такую схему, что только те запросы, которые
получаются таким образом, будут валидными. Их можно найти
на sqlite.org/syntaxdiagrams.html. Схема выше — упрощённая схема select-запроса
(запрос данных).

Упражнение. Для каждого из запросов ниже пройдите по схеме и разберитесь, как


это работает.
• select name
• from students
• where surname = 'Шашков'

• values ('Вася', 1), ('Коля', 2)
• select distinct class,
• case when supervisor = 'Шашков' then true else false end as godmode
• from students
• order by class
• select class, max(height)
• from students
• group by class having count(*) > 10
• order by 2
• limit 10
Запросы на выборку данных из одной таблицы
Школьники из 9Б
Выведите фамилию и имя всех школьников из 9Б. В получившейся таблице должны
быть два столбца и 24 строки.

Необходимые столцбы перечисляются после ключевого слова SELECT. Условия отбора


указываются после ключевого слова WHERE. Первые 2 строчки ответа —

surname name
Карасев Педро
Колосова Елизавета

Классные руководители
Выведите отсортированный список всех классных руководителей.

Для отбора чего-то уникального используется ключевое слово DISTINCT. Для


упорядочивания — ORDER BY. При этом можно указывать либо выражения, по
которым нужно сортировать, либо номера столбцов итоговой таблицы. Первая
строчка ответа —

supervisor
Белоусов

Никита, Антон и Алевтина


Выведите имя, фамилию, класс каждого школьника с именем Никита, Антон или
Алевтина в порядке убывания среднего балла.

Для проверки принадлежности списку пригодится конструкция IN (..,..,..), она


работает почти так же, как и в питоне, только . Для обращения порядка сортировки
— ключевое слово DESC. Первая строчка ответа —

name surname class


Никита Николаев 7Д

Вам также может понравиться