├── 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 | --------------------------------------------------------------------------------