Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions 01-introduction/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Домашнее задание к лекции «Введение в БД. Типы БД»

## Задание 1 (практика)

Спроектировать схему — таблицы и связи между ними — для музыкального сайта. Требования:

- на сайте должна быть возможность увидеть список музыкальных жанров;
- для каждого жанра можно получить список исполнителей, которые выступают в соответствующем жанре;
- для каждого исполнителя можно получить список его альбомов;
- для каждого альбома можно получить список треков, которые в него входят;
- у жанра есть название;
- у исполнителя есть имя (псевдоним) и жанр, в котором он исполняет;
- у альбома есть название, год выпуска и его исполнитель;
- у трека есть название, длительность и альбом, которому этот трек принадлежит.

Результатом работы является изображение в формате PNG, содержащее схему БД.

Для создания схем можно воспользоваться удобной платформой [app.diagrams.net](https://app.diagrams.net/) или любым другим графическим редактором.

Краткая шпаргалка по созданию схем БД на платформе [app.diagrams.net](https://app.diagrams.net/) находится в личном кабинете в занятии «Введение в базы данных. Типы баз данных».

## Задание 2 (подготовка к следующей лекции)

Необходимо установить PostgreSQL на свой ПК.

### Windows

[Видеоинструкция](https://embed.new.video/uyjUq9B3qYo6BbbkzG71Ny).

[Ссылка на PostgreSQL для Windows](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads).

### Linux (на примере Ubuntu 20.04)

[Видеоинструкция](https://embed.new.video/cRQW4Z2YnxZUxzKRLWwnPF).

Команды для установки:

```bash
# PostgreSQL
sudo apt update && sudo apt install postgresql-12

# pgAdmin4
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" |sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update && sudo apt install pgadmin4
```

### Mac OS X

[Видеоинструкция](https://clck.ru/32zuuG)

Команды для установки:

```bash
brew install postgresql

postgres -V

pg_ctl -D /usr/local/var/postgres start

createuser -P -s postgres
```

## Задание 3 (подготовка к следующей лекции)

На следующей лекции мы будем использовать программу DBeaver Community для работы с СУБД. Это бесплатная программа, вы можете заранее скачать её [по ссылке](https://dbeaver.io/download/) и установить на свой компьютер.

Обратите внимание, что это задание является рекомендацией, для полноценного участия в лекции DBeaver вам не потребуется, вы можете установить эту программу позже или вообще использовать что-то другое.
38 changes: 38 additions & 0 deletions 02-creation/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Домашнее задание к лекции «Работа с SQL. Создание БД»

## Задание

### Обязательная часть

Будем развивать схему для музыкального сервиса.

Ранее существовало ограничение, что каждый исполнитель поёт строго в одном жанре, пора его убрать. Исполнители могут петь в разных жанрах, как и одному жанру могут принадлежать несколько исполнителей.

Аналогичное ограничение было и с альбомами у исполнителей — альбом мог выпустить только один исполнитель. Теперь альбом могут выпустить несколько исполнителей вместе. Как и исполнитель может принимать участие во множестве альбомов.

С треками ничего не меняем, всё так же трек принадлежит строго одному альбому.

Но появилась новая сущность — сборник. Сборник имеет название и год выпуска. В него входят различные треки из разных альбомов.

_Обратите внимание_: один и тот же трек может присутствовать в разных сборниках.

Задание состоит из двух частей

1. Спроектировать и нарисовать схему, как в [первой домашней работе](../01-introduction). Прислать изображение со схемой.
2. Написать SQL-запросы, создающие спроектированную БД. Прислать ссылку на файл, содержащий SQL-запросы.

_Примечание:_ можно прислать сначала схему, получить подтверждение, что схема верная, и после этого браться за написание запросов.

---

### Дополнительное (необязательное) задание

Спроектировать отношение или схему из нескольких отношений «Сотрудник». У каждого сотрудника есть следующие параметры:

1. Имя.
2. Отдел.
3. Начальник (ссылка на начальника).

_Примечание:_ начальник — тоже сотрудник. Отдел можно хранить строкой, можно идентификатором — не принципиально.

Необходимо написать SQL-запрос, создающий таблицу «Сотрудник», и прислать ссылку на файл с этим запросом.
161 changes: 161 additions & 0 deletions 04-dml/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
# Домашнее задание к лекции «Продвинутая выборка данных»

## Задание 1

Продолжаем работать со своей базой данных. В этом задании заполните базу данных из домашнего задания к занятию "Работа с SQL. Создание БД". В ней должно быть:

- не менее 4 исполнителей,
- не менее 3 жанров,
- не менее 3 альбомов,
- не менее 6 треков,
- не менее 4 сборников.

Внимание: должны быть заполнены все поля каждой таблицы, в том числе таблицы связей исполнителей с жанрами, исполнителей с альбомами, сборников с треками.

## Ответ 1

CREATE TABLE Исполнители (
Идентификатор INT PRIMARY KEY,
Имя VARCHAR(255)
);

CREATE TABLE Жанры (
Идентификатор INT PRIMARY KEY,
Название VARCHAR(255)
);

CREATE TABLE Альбомы (
Идентификатор INT PRIMARY KEY,
Название VARCHAR(255),
Год_выпуска INT
);

CREATE TABLE Треки (
Идентификатор INT PRIMARY KEY,
Название VARCHAR(255),
Идентификатор_альбома INT,
FOREIGN KEY (Идентификатор_альбома) REFERENCES Альбомы(Идентификатор)
);

CREATE TABLE Сборники (
Идентификатор INT PRIMARY KEY,
Название VARCHAR(255),
Год_выпуска INT
);

CREATE TABLE Исполнители_Жанры (
Идентификатор INT PRIMARY KEY,
Идентификатор_исполнителя INT,
Идентификатор_жанра INT,
FOREIGN KEY (Идентификатор_исполнителя) REFERENCES Исполнители(Идентификатор),
FOREIGN KEY (Идентификатор_жанра) REFERENCES Жанры(Идентификатор)
);

CREATE TABLE Исполнители_Альбомы (
Идентификатор INT PRIMARY KEY,
Идентификатор_исполнителя INT,
Идентификатор_альбома INT,
FOREIGN KEY (Идентификатор_исполнителя) REFERENCES Исполнители(Идентификатор),
FOREIGN KEY (Идентификатор_альбома) REFERENCES Альбомы(Идентификатор)
);

CREATE TABLE Альбомы_Треки (
Идентификатор INT PRIMARY KEY,
Идентификатор_альбома INT,
Идентификатор_трека INT,
FOREIGN KEY (Идентификатор_альбома) REFERENCES Альбомы(Идентификатор),
FOREIGN KEY (Идентификатор_трека) REFERENCES Треки(Идентификатор)
);

CREATE TABLE Сборники_Треки (
Идентификатор INT PRIMARY KEY,
Идентификатор_сборника INT,
Идентификатор_трека INT,
FOREIGN KEY (Идентификатор_сборника) REFERENCES Сборники(Идентификатор),
FOREIGN KEY (Идентификатор_трека) REFERENCES Треки(Идентификатор)
);

## Задание 2

Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже.

Внимание: результаты запросов не должны быть пустыми, учтите это при заполнении таблиц.

1. Название и продолжительность самого длительного трека.
2. Название треков, продолжительность которых не менее 3,5 минут.
3. Названия сборников, вышедших в период с 2018 по 2020 год включительно.
4. Исполнители, чьё имя состоит из одного слова.
5. Название треков, которые содержат слово «мой» или «my».


## Ответ 2

SELECT Название, Продолжительность
FROM Треки
WHERE Продолжительность = (SELECT MAX(Продолжительность) FROM Треки);

SELECT Название
FROM Треки
WHERE Продолжительность >= 3.5;

SELECT Название
FROM Сборники
WHERE Год_выпуска BETWEEN 2018 AND 2020;

SELECT Имя
FROM Исполнители
WHERE Имя NOT LIKE '% %';

SELECT Название
FROM Треки
WHERE Название LIKE '%мой%' OR Название LIKE '%my%';


## Задание 3

Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже.

Внимание: результаты запросов не должны быть пустыми, при необходимости добавьте данные в таблицы.

1. Количество исполнителей в каждом жанре.
2. Количество треков, вошедших в альбомы 2019–2020 годов.
3. Средняя продолжительность треков по каждому альбому.
4. Все исполнители, которые не выпустили альбомы в 2020 году.
5. Названия сборников, в которых присутствует конкретный исполнитель (выберите его сами).

## Ответ 3

SELECT Жанры.Название AS Жанр, COUNT(*) AS Количество_исполнителей
FROM Жанры
LEFT JOIN Исполнители ON Жанры.Идентификатор = Исполнители.Идентификатор_жанра
GROUP BY Жанры.Название;

SELECT COUNT(*) AS Количество_треков
FROM Треки
JOIN Альбомы ON Треки.Идентификатор_альбома = Альбомы.Идентификатор
WHERE Альбомы.Год_выпуска BETWEEN 2019 AND 2020;

SELECT Альбомы.Название AS Название_альбома, AVG(Треки.Продолжительность) AS Средняя_продолжительность
FROM Треки
JOIN Альбомы ON Треки.Идентификатор_альбома = Альбомы.Идентификатор
GROUP BY Альбомы.Название;

SELECT Исполнители.Имя
FROM Исполнители
LEFT JOIN Альбомы ON Исполнители.Идентификатор = Альбомы.Идентификатор_исполнителя
WHERE YEAR(Альбомы.Год_выпуска) <> 2020 OR Альбомы.Год_выпуска IS NULL;

SELECT Сборники.Название
FROM Сборники
JOIN Сборники_Треки ON Сборники.Идентификатор = Сборники_Треки.Идентификатор_сборника
JOIN Треки ON Сборники_Треки.Идентификатор_трека = Треки.Идентификатор
WHERE Треки.Идентификатор_исполнителя = 1;


---

Результатом работы будет три файла в формате `.sql`:

- с INSERT-запросами (задание 1),
- с SELECT-запросами (задание 2,3,4),
- с CREATE-запросами (из предыдущей домашней работы).
71 changes: 71 additions & 0 deletions 05-psycopg/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Домашнее задание к лекции «Работа с PostgreSQL из Python»

Создайте программу для управления клиентами на Python.

Требуется хранить персональную информацию о клиентах:

- имя,
- фамилия,
- email,
- телефон.

Сложность в том, что телефон у клиента может быть не один, а два, три и даже больше. А может и вообще не быть телефона, например, он не захотел его оставлять.

Вам необходимо разработать структуру БД для хранения информации и несколько функций на Python для управления данными.

1. Функция, создающая структуру БД (таблицы).
1. Функция, позволяющая добавить нового клиента.
1. Функция, позволяющая добавить телефон для существующего клиента.
1. Функция, позволяющая изменить данные о клиенте.
1. Функция, позволяющая удалить телефон для существующего клиента.
1. Функция, позволяющая удалить существующего клиента.
1. Функция, позволяющая найти клиента по его данным: имени, фамилии, email или телефону.

Функции выше являются обязательными, но это не значит, что должны быть только они. При необходимости можете создавать дополнительные функции и классы.

Также предоставьте код, демонстрирующий работу всех написанных функций.

Результатом работы будет `.py` файл.

---

## Подсказка

> Не читайте этот раздел сразу, попытайтесь сначала решить задачу самостоятельно :)

<details>

<summary>Каркас кода</summary>

```py
import psycopg2

def create_db(conn):
pass

def add_client(conn, first_name, last_name, email, phones=None):
pass

def add_phone(conn, client_id, phone):
pass

def change_client(conn, client_id, first_name=None, last_name=None, email=None, phones=None):
pass

def delete_phone(conn, client_id, phone):
pass

def delete_client(conn, client_id):
pass

def find_client(conn, first_name=None, last_name=None, email=None, phone=None):
pass


with psycopg2.connect(database="clients_db", user="postgres", password="postgres") as conn:
pass # вызывайте функции здесь

conn.close()
```

</details>
Loading