├── README.md
├── labs
├── 01.md
├── 02.md
└── 03.md
├── project.md
└── seminars
├── 01.md
├── 02.md
├── 03.md
├── 04.md
└── 05.md
/README.md:
--------------------------------------------------------------------------------
1 | # mipt-db
2 | Материалы семинаров по курсу баз данных ФИВТ МФТИ
3 |
4 | # [Курсовой проект](./project.md)
5 |
6 | # Лабораторные работы
7 | ## Правила сдачи лаб
8 | Каждая лабораторная работа сдаётся лично. Лабораторная считается сданной, если выполнены *все* задания и студент может ответить на вопросы семинариста. Лабораторную работа можно сдать: на семинаре, на котором она была выдана, на двух следующих за ним семинарах, либо на зачете в конце семестра. Сдача всех лабораторных работ является необходимым условием для получения положительной оценки за курс.
9 |
10 | Лабы следует отправлять в виде текстового файла ("plain text", не в ворде и не в PDF). Этот файл должен быть валидным SQL: используйте однострочные комменты (два дефиса: `--`), чтобы указывать номера задач или любой другой текст, не являющийся частью запроса. Каждый запрос должен оканчиваться символом `;`. Имя файла с выполненными заданиями должно иметь формат `Lab<номер_лабы>_<номер_группы>_<Фамилия>.sql`. Пример: `Lab03_695_Kharitonov.sql`.
11 |
12 | 1. [Простейшие `SELECT`-запросы.](https://github.com/kharvd/mipt-db/blob/master/labs/01.md)
13 | 1. [Соединение таблиц.](https://github.com/kharvd/mipt-db/blob/master/labs/02.md)
14 | 1. [Группировка и агрегатные функции. Оконные функции.](https://github.com/kharvd/mipt-db/blob/master/labs/03.md)
15 |
16 | # Семинары
17 | 1. [Введение. Реляционная алгебра.](https://github.com/kharvd/mipt-db/blob/master/seminars/01.md)
18 | 2. [Реляционная алгебра (продолжение).](https://github.com/kharvd/mipt-db/blob/master/seminars/02.md)
19 | 3. [Исчисление кортежей.](https://github.com/kharvd/mipt-db/blob/master/seminars/03.md)
20 | 4. [Исчисление кортежей (продолжение). Язык SQL: оператор `SELECT`](https://github.com/kharvd/mipt-db/blob/master/seminars/04.md)
21 |
22 | Также на семинарах обсуждались следующие темы:
23 | 1. Соединение таблиц, агрегатные функции (см. лабы).
24 | 1. Вставка, изменение и удаление данных ([[1]](https://www.postgresql.org/docs/current/static/sql-insert.html), [[2]](https://www.postgresql.org/docs/current/static/sql-update.html), [[3]](https://www.postgresql.org/docs/current/static/sql-delete.html)).
25 | 1. Создание таблиц ([[1]](https://www.postgresql.org/docs/current/static/tutorial-table.html)).
26 | 1. Первичные и внешние ключи ([[1]](https://en.wikipedia.org/wiki/Unique_key), [[2]](https://en.wikipedia.org/wiki/Foreign_key))
27 | 1. Ограничения ([[1]](https://www.postgresql.org/docs/current/static/ddl-constraints.html)).
28 | 1. Представления ([[1]](https://www.tutorialspoint.com/postgresql/postgresql_views.htm), [[2]](https://www.postgresql.org/docs/current/static/tutorial-views.html), [[3]](https://www.postgresql.org/docs/current/static/sql-createview.html)).
29 | 1. Элементы entity-relationship model ([[1]](https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model)) и проектирования баз данных ([[1]](https://en.wikipedia.org/wiki/Database_design), [[2]](https://habrahabr.ru/post/193136/))
30 | 1. Работа с PostgreSQL из Python ([[1]](http://initd.org/psycopg/))
31 |
--------------------------------------------------------------------------------
/labs/01.md:
--------------------------------------------------------------------------------
1 | # Лабораторная работа №1
2 |
3 | * Выдана: 27 февраля 2017
4 | * Срок сдачи: 6 13 марта 2017
5 |
6 | ## Подготовка к работе
7 |
8 | 1. При помощи pgAdmin или `psql` (далее "клиент") подключитесь к демонстрационной базе. Для этого можно скачать базу [отсюда](https://edu.postgrespro.ru/demo_medium.zip), либо подключиться к серверу
9 |
10 | * username: mipt
11 | * password: miptpassword
12 | * database: demo
13 | * server: do.amm-info.ru
14 | * port: 43813
15 |
16 | 2. Прочитайте [PDF](https://edu.postgrespro.ru/bookings.pdf) с описанием базы данных. Используя клиент, убедитесь, что все перечисленные таблицы, функции и представления присутствуют в базе.
17 |
18 | ## Простейшие SELECT-запросы.
19 |
20 | 1. Выведите все самолёты.
21 |
22 | 2. Найдите все самолёты с дальностью полета не менее 3000 км. Выводите только модель и дальность.
23 |
24 | 3. Упорядочите результат предыдущего запроса по убыванию дальности полета и выразите дальность полета в метрах. Не забудьте назначить колонке с дальностью полета в метрах осмысленное имя при помощи конструкции AS.
25 |
26 | 4. Найдите все аэропорты, находящиеся севернее полярного круга. Выведите их в порядке с запада на восток и округлите значения широты и долготы до сотых. Hint: используйте функцию round и приведение типов.
27 |
28 | 5. Какой код имеет аэропорт города Горно-Алтайск?
29 |
30 | 6. Найдите рейсы, отправляющиеся из Горно-Алтайска в Москву (DME, SVO или VKO) и доступные для бронирования (Scheduled). Hint: используйте оператор IN.
31 |
32 | 7. Найдите все рейсы из Домодедово (DME) в Санкт-Петербург (LED), которые отправляются с 15 по 17 октября 2016 включительно. Упорядочите результат по времени отправления по возрастанию и по времени прибытия по убыванию и ограничьте выборку 10 кортежами. Выведите только номер рейса и ожидаемые время вылета и время прибытия. Hint: используйте оператор BETWEEN.
33 |
34 | 8. Выполните аналогичный запрос, что и в предыдущем пункте, но на этот раз выведите следующие 10 рейсов. Hint: используйте выражение OFFSET.
35 |
36 | 9. Выведите все коды аэропортов, куда есть рейсы из Внуково (VKO). Hint: Используйте DISTINCT чтобы убрать дубликаты.
37 |
38 | 10. Бонус: придумайте интересный запрос и реализуйте его :)
39 |
40 | ## Литература
41 | * https://www.w3schools.com/sql/ - для самых маленьких
42 | * https://www.postgresql.org/docs/current/static/index.html - документация для чётких ребят
43 | * https://www.postgresql.org/docs/current/static/tutorial-select.html
44 | * https://www.postgresql.org/docs/current/static/queries-overview.html
45 | * https://www.postgresql.org/docs/current/static/sql-select.html
46 | * https://www.pgexercises.com/ - упражнения
47 | * http://sql-ex.ru/ - еще упражнения - сотни их
48 |
--------------------------------------------------------------------------------
/labs/02.md:
--------------------------------------------------------------------------------
1 | # Лабораторная работа №2
2 |
3 | * Выдана: 9 марта 2017
4 | * Срок сдачи: 20 марта 2017
5 |
6 | ## Подготовка к работе
7 | Используйте ту же базу, что и в [лабораторной №1](./labs/01.md)
8 |
9 | ## Соединение таблиц
10 | 1. Найдите все места (`seats`) в самолётах (`aircrafts`), у которых дальность полета (`range`) меньше 3000. Выведите модель самолёта, номер места и класс обслуживания.
11 | 1. Выведите таблицу `flights`, заменив в ней колонки с кодами аэропортов на названия аэропортов. Упорядочите результат по `flight_id` в обратном порядке, выводите не более 10 кортежей.
12 | 1. Выведите все модели (`model`) самолётов, которые отправляются из аэропорта города Владивосток. Запрос не должен содержать в себе найденного заранее кода аэропорта.
13 | 1. Найдите посадочные талоны для рейсов, отправляющихся (со статусом `'On Time'` или `'Delayed'`) из Домодедово (DME) в ближайший час. Используйте функцию `bookings.now()`. Выведите номер рейса (`flight_no`), время отправления (`scheduled_departure`), номер билета (`ticket_no`) и номер посадочного талона (`boarding_no`). Упорядочите результат по времени отправления.
14 | 1. Измените запрос из предыдущего задания так, чтобы вывести только посадочные талоны на места из бизнес-класса. Hint: используйте информацию из таблицы `seats`.
15 | 1. Найдите все пары рейсов LED -> VKO, VKO -> VVO такие, чтобы время пересадки было не больше 12 часов, а самолет из Пулково отправлялся в ближайшую неделю. Выведите время отправления из Пулково, время прибытия во Внуково, время отправления из Внуково, время прибытия во Владивосток, время пересадки (между прибытием и отправлением из Внуково), общее время в пути из Пулково во Владивосток. Упорядочите записи сначала по общему времени в пути, затем по дате отправления из Пулково.
16 | 1. Выведите имена и стоимость билетов пассажиров с 10 самыми дорогими билетами.
17 | 1. Найдите все посадочные талоны выданные по билетам на имя `YULIYA MOROZOVA`, купленным за последние 7 дней. Выведите следующие атрибуты: номер бронирования (`book_ref`), дата бронирования (`book_date`), номер билета (`ticket_no`), ID рейса (`flight_id`), номер посадочного талона (`boarding_no`), номер места (`seat_no`), класс обслуживания (`fare_conditions`). Если по билету еще не выдан посадочный талон, то в соответствующих атрибутах должны стоять значения NULL. Упорядочите результат сначала по `book_ref`, затем по `book_date`. Выводите не более 50 кортежей.
18 | 1. И как всегда бонус: придумайте интересный запрос на эту тему.
19 |
20 | ## Литература
21 | * https://www.postgresql.org/docs/current/static/tutorial-join.html - Соединение таблиц
22 | * https://www.w3schools.com/sql/sql_join.asp - Соединение таблиц для самых маленьких
23 | * https://www.pgexercises.com/questions/joins/ - Упражнения
24 | * https://www.postgresql.org/docs/current/static/queries-table-expressions.html (7.2.1.1, 7.2.2) - Более подробно
25 | * https://www.postgresql.org/docs/current/static/functions-subquery.html - Подзапросы
26 | * https://www.postgresql.org/docs/current/static/queries-with.html#QUERIES-WITH-SELECT (До рекурсивных) - Псевдонимы для подзапросов
27 | * http://stackoverflow.com/questions/2577174/join-vs-sub-query - Об отличиях подзапросов и соединения таблиц
28 |
--------------------------------------------------------------------------------
/labs/03.md:
--------------------------------------------------------------------------------
1 | # Лабораторная работа №3
2 |
3 | * Выдана: 27 марта 2017
4 | * Срок сдачи: 10 апреля 2017
5 |
6 | ## Подготовка к работе
7 | Используйте ту же базу, что и в [лабораторной №1](./labs/01.md)
8 |
9 | Каждый из запросов должен выполняться не более 15 секунд на сервере, указанном в лабе №1.
10 |
11 | ## Группировка и агрегатные функции. Оконные функции.
12 | 1. Выведите наименьшую и наибольшую дальность полёта для самолетов в базе. Не забудьте дать адекватные имена колонкам.
13 | 1. Для каждой модели самолёта выведите количество мест и максимальную дальность полёта.
14 | 1. Выведите 10 пассажиров с наибольшим числом билетов (`tickets`) на их имя. В результат должны входить имя пассажира и количество билетов.
15 | 1. Добавьте к результату предыдущего запроса среднюю цену билета (см. `ticket_flights`) для каждого из 10 пассажиров. Округлите цену до 2 знаков.
16 | 1. Сколько существует различных рейсов (`flight_no`) из Москвы в Санкт-Петербург (LED)?
17 | 1. Для каждого из рейсов, вылетающих в ближайшие 3 часа из Домодедово (DME) выведите количество зарегистрировавшихся пассажиров (см. `boarding_passes`) каждого из классов обслуживания. В выводе должны присутствовать: номер рейса (`flight_no`), город назначения, ожидаемое время отправления и число мест для каждого из классов обслуживания (`Business`, `Economy` и `Comfort`). Hint: возможно, вам пригодится что-то [отсюда](https://www.postgresql.org/docs/current/static/sql-expressions.html#SYNTAX-AGGREGATES).
18 | 1. Среди пассажиров, летящих бизнес-классом на рейсе с `id = 2943` найдите тех, у кого средняя цена билета (см. `ticket_flights`) по всем рейсам меньше 20000 рублей. Выведите имя пассажира и среднюю цену билета, округлённую до 2 знаков. Упорядочите результат по средней цене от большего к меньшему.
19 | 1. Для пассажира с именем `YULIYA MOROZOVA` найдите, как росли её затраты на билеты с течением времени. Более формально: для билетов Юлии, упорядоченных по времени отправления, подсчитайте кумулятивные суммы их цен. В результате запроса должны быть следующие поля: `ticket_no`, `flight_id`, `scheduled_departure`, `amount`, а также затраты Юлии на текущий момент времени. Hint: возможно, вам пригодится [туториал по оконным функциям](https://www.postgresql.org/docs/current/static/tutorial-window.html).
20 | 1. Бонус - см. предыдущие лабы.
21 |
22 | ## Литература
23 | * https://www.postgresql.org/docs/current/static/tutorial-agg.html - Туториал
24 | * https://www.w3schools.com/sql/sql_groupby.asp - Туториал для самых маленьких
25 | * https://www.pgexercises.com/questions/aggregates/ - Упражнения
26 | * https://www.postgresql.org/docs/current/static/queries-table-expressions.html#QUERIES-GROUP
27 | * https://www.postgresql.org/docs/current/static/sql-select.html#SQL-GROUPBY
28 | * https://www.postgresql.org/docs/current/static/sql-select.html#SQL-HAVING
29 | * https://www.postgresql.org/docs/current/static/sql-expressions.html#SYNTAX-AGGREGATES
30 | * https://www.postgresql.org/docs/current/static/tutorial-window.html - про оконные функции
31 | * https://robots.thoughtbot.com/postgres-window-functions - пример на оконные функции
32 | * http://tapoueh.org/blog/2013/08/20-Window-Functions - и еще туториал
33 |
--------------------------------------------------------------------------------
/project.md:
--------------------------------------------------------------------------------
1 | # Курсовой проект
2 | Таблица с плюсиками (в личку)
3 |
4 | Основным критерием оценки по курсу БД является курсовой проект. Проект представляет собой приложение на любом языке программирования (рекомендуется Python) с использованием СУБД (рекомендуется PostgreSQL). Приложение должно решать некоторую модельную задачу из выбранной вами предметной области и предоставлять некоторый пользовательский интерфейс (консольный, графический, веб-интерфейс, REST API, телеграм-бот и т. п.)
5 |
6 | Проект выполняется в парах (в этом случае оба студента получают одинаковую оценку за проект) или в одиночку.
7 |
8 | Работа над приложением должна вестись в репозитории на Github. За правильную работу с системой контроля версий будут начисляться бонусные баллы.
9 |
10 | ## Требования
11 | * Работа с базой данных должна осуществляться посредством SQL-запросов. ORM (Object-relational mapping) использовать в данном проекте не рекомендуется.
12 | * Приложение должно осуществлять хотя бы одну операцию вставки (INSERT), изменения (UPDATE), удаления (DELETE) и выборки (SELECT) в базе данных. Для каждой из этих операций должна быть некоторая команда в пользовательском интерфейсе.
13 | * База данных должна содержать не менее трех таблиц.
14 | * Таблицы должны быть заполнены некоторыми данными (вручную или при помощи скрипта). Бекап демонстрационной базе должен лежать в репозитории.
15 |
16 | ## Критерии оценки
17 | Суммарно за проект можно получить 45 баллов. Точные критерии в гуглодоке.
18 |
19 | ## План работы
20 | Если не указано иное, **каждый день просроченного дедлайна по каждому пункту уменьшает максимальный балл по курсу на 0.15.** Настоятельно рекомендуется не откладывать проект до зачетной недели.
21 |
22 | * **10 апреля**
23 | * Проконсультироваться с семинаристом по поводу темы проекта. Сообщить о составе команды для выполнения проекта.
24 | * Создать репозиторий на Github и прислать семинаристу ссылку.
25 | * Составить и выложить в репозиторий "техническое задание" к проекту. Задание должно описывать требования к приложению с точки зрения пользователя (например, в виде [user stories](https://en.wikipedia.org/wiki/User_story)). Также задание должно содержать описание схемы базы данных - список таблиц, их атрибутов и связи между ними. **Формат выполнения задания - PDF-документ**.
26 | * **17 19 апреля** - составить DDL-скрипты (CREATE TABLE и т. п.) для создания таблиц, ограничений и индексов (при наличии). Закоммитить .sql файл в репозиторий.
27 | * **24 апреля** - жесткий дедлайн по первым двум пунктам. Если к этому моменту первые два пункта не выполнены, **максимальный балл за курс - 4 (удовл.)**.
28 | * **8 мая** - промежуточный контроль. К этому моменту должны быть в наличии прототип пользовательского интерфейса и хотя бы один запрос в базу.
29 | * **15 мая** - **жесткий дедлайн по проекту**. К этой дате проект должен быть готов и представлен преподавателю лично. Допускаются незначительные исправления и бонусные активности для повышения оценки в течение следующей недели до зачёта (заочно).
30 | * **21, 22 мая** - зачёт по курсу. Проекты не принимаются. Можно досдавать просроченные лабы.
31 |
32 | ## Примеры задач
33 |
--------------------------------------------------------------------------------
/seminars/01.md:
--------------------------------------------------------------------------------
1 | # Семинар 1
2 | Базовые понятия реляционной модели. Операции реляционной алгебры.
3 |
4 | ## Домашнее задание
5 | Даны отношения (R, M, MR - имена отношений. В скобках указаны имена их атрибутов):
6 | * изделие (атрибуты: номер, название, масса, цвет): R(#R, NR, WR , C);
7 | * производитель (атрибуты: номер, название, город, в котором расположен): M(#M, NM, LM);
8 | * изделия производителя (состав атрибутов: номер производителя, номер изделия): MR(#M, #R).
9 |
10 | ### Написать запросы на языке реляционной алгебры
11 | 1. Найти производителей из Москвы.
12 | 2. Найти изделия, которые производятся (в том числе) в Москве
13 | 3. Найти изделия, которые не производятся в Москве.
14 | 4. Найти изделия, которые производятся только в Москве.
15 | 5. В каких городах производятся все синие изделия?
16 |
17 | ## Литература
18 | * https://en.wikipedia.org/wiki/Relational_algebra
19 | * https://www.amazon.com/Introduction-Database-Systems-8th/dp/0321197844
20 |
--------------------------------------------------------------------------------
/seminars/02.md:
--------------------------------------------------------------------------------
1 | # Семинар 2
2 | Практика по реляционной алгебре в симуляторе.
3 |
4 | ## Задание
5 |
6 | Окройте http://dbis-uibk.github.io/relax/calc.htm, в левом верхнем углу выберите базу "Database Systems The Complete Book - Exercise 2.4.1". Решите следующие задания. Свои решения кидайте ВК (http://vk.com/kharvd) или на почту (kharvd на гмейле)
7 |
8 | 0. выведите все PC, у которых цена > 1000
9 | 1. выведите все PC, Laptop и Printer, у которых цена > 1000, выведите только model и price
10 | 2. выведите всех производителей лазерных принтеров
11 | 3. выведите всех производителей настольных компьютеров с памятью hd 250 Гб
12 | 4. выведите всех производителей компьютеров или лэптопов с памятью hd 80 Гб
13 | 5. склейте join'ом базы Product и Laptop. найдите аномалию глазами
14 | 10. выведите все производители, у которых в линейке есть PC такой же скорости, что и Laptop
15 | 11. выведите все PC, у которых скорость больше 2.5, а цена меньше 1000
16 | 12. выведите модели и цены вообще всех устройств у производителей, у которых в линейке нет чёрно-белых принтеров
17 | 13. выведите все ноутбуки, у которых жесткий диск 60 или 240 Гб
18 | 14. выведите все ноутбуки, у которых оперативной памяти больше, чем их цена :Р
19 |
--------------------------------------------------------------------------------
/seminars/03.md:
--------------------------------------------------------------------------------
1 | # Семинар 3
2 | Исчисление кортежей
3 |
4 | # Домашнее задание
5 | Реализовать на исчислении кортежей те же запросы, что и в задании [второго семинара](https://github.com/kharvd/mipt-db/blob/master/02.md). (По желанию) проверить в эмуляторе. Свои решения снова кидайте ВК (http://vk.com/kharvd) или на почту (kharvd на гмейле).
6 |
7 | [Эмулятор исчисления кортежей](http://www-rohan.sdsu.edu/~eckberg/relationalcalculusemulator.html)
8 |
9 | Для вашего удобства поднята БД в облаке:
10 | * username: mipt
11 | * password: miptpassword
12 | * database: shop
13 | * server: do.amm-info.ru:43812
14 |
15 | Также можно использовать базу `relcalc` с теми же креденшлами для работы с примерами из раздела Help эмулятора.
16 |
17 | ## Литература
18 | * http://nptel.ac.in/courses/IIT-MADRAS/Intro_to_Database_Systems_Design/pdf/3.1_Tuple_Relational_Calculus.pdf
19 | * http://www.cs.sfu.ca/CourseCentral/354/zaiane/material/notes/Chapter3/node11.html (Можно листать страницы)
20 | * https://www.amazon.com/Introduction-Database-Systems-8th/dp/0321197844
21 |
--------------------------------------------------------------------------------
/seminars/04.md:
--------------------------------------------------------------------------------
1 | # Введение в SQL. Оператор `SELECT`
2 |
3 | # Лабораторная работа №1
4 | [Ссылка](https://github.com/kharvd/mipt-db/blob/master/labs/01.md)
5 | * Выдана: 27 февраля 2017
6 | * Срок сдачи: 6 13 марта 2017
7 |
8 | ## Литература
9 | * https://www.w3schools.com/sql/ - для самых маленьких
10 | * https://www.postgresql.org/docs/current/static/index.html - документация для чётких ребят
11 | * https://www.postgresql.org/docs/current/static/queries-overview.html
12 | * https://www.postgresql.org/docs/current/static/sql-select.html
13 | * https://www.pgexercises.com/ - упражнения
14 | * http://sql-ex.ru/ - еще упражнения - сотни их
15 |
--------------------------------------------------------------------------------
/seminars/05.md:
--------------------------------------------------------------------------------
1 | # Соединение таблиц
2 |
3 | ## Литература
4 | * https://www.postgresql.org/docs/current/static/tutorial-join.html
5 | * https://www.postgresql.org/docs/current/static/queries-table-expressions.html#QUERIES-FROM
6 | * https://www.postgresql.org/docs/current/static/sql-select.html#SQL-FROM
7 | * https://www.w3schools.com/sql/sql_join.asp
8 | * https://pgexercises.com/questions/joins/
9 |
--------------------------------------------------------------------------------