📁 Блок: 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;