← К оглавлению занятия

💻 Примеры

📁 Блок: Revision / MySQL и Colab ⏱️ Время изучения: ~90 мин 🎯 Сложность: Повторение

⚡ Кратко: суть занятия

Revision 1 повторяет подключение MySQL из Python и практику SQL по базе sakila.

В Python используется mysql-connector-python: подключение, cursor, execute, fetchall, description, DataFrame и close.

SQL-повторение начинается с поиска фильмов по LIKE "%LION%" и подсчёта таких фильмов.

JOIN film, film_category и category нужен для вывода фильмов с категориями.

ORDER BY length DESC LIMIT 10 показывает самые длинные фильмы.

GROUP BY category и HAVING фильтруют категории по количеству фильмов.

Оконные функции AVG(...) OVER (PARTITION BY name) и DENSE_RANK() OVER (...) добавляют агрегаты без схлопывания строк.

Топ-3 ошибки: забыть закрыть соединение, фильтровать Horror по неверному category_id, путать GROUP BY и оконную агрегацию.

Выполнимые примеры

Подключение MySQL в Colab

После запроса обязательно закрыть cursor и connection.

import mysql.connector
import pandas as pd

connection = mysql.connector.connect(
    host="MYSQL_HOST",
    user="MYSQL_USER",
    password="MYSQL_PASSWORD",
    database="sakila"
)
cursor = connection.cursor()
cursor.execute("SELECT title, length FROM film LIMIT 10")
rows = cursor.fetchall()
columns = [col[0] for col in cursor.description]
df = pd.DataFrame(rows, columns=columns)
print(df.head())
cursor.close()
connection.close()

Фильмы с LION

LIKE ищет подстроку в названии.

SELECT *
FROM film
WHERE title LIKE "%LION%";

SELECT COUNT(*) AS lion_films
FROM film
WHERE title LIKE "%LION%";

Фильмы категории Horror

Источник даёт подсказку join film и film_category и фильтр по category_id.

SELECT f.title, fc.category_id
FROM film AS f
JOIN film_category AS fc ON fc.film_id = f.film_id
WHERE fc.category_id = 11;

Фильм и категория

category добавляет читаемое имя категории.

SELECT f.title, c.name AS category_name
FROM film AS f
JOIN film_category AS fc ON fc.film_id = f.film_id
JOIN category AS c ON c.category_id = fc.category_id;

Количество по категориям

GROUP BY собирает фильмы по category name.

SELECT c.name, COUNT(f.title) AS films
FROM film AS f
JOIN film_category AS fc ON fc.film_id = f.film_id
JOIN category AS c ON c.category_id = fc.category_id
GROUP BY c.name;

Окно по категории

Средняя длина категории видна рядом с каждым фильмом.

SELECT f.title, c.name, f.length,
       AVG(f.length) OVER (PARTITION BY c.name) AS avg_category_length,
       DENSE_RANK() OVER (ORDER BY f.length DESC) AS length_rank
FROM film AS f
JOIN film_category AS fc ON fc.film_id = f.film_id
JOIN category AS c ON c.category_id = fc.category_id;