~~NOTOC~~
====== MySQL: Przykłady zapytań na bazie Sakila ======
{{:notatki:pasted:20250513-160056.png?900}}\\
Schemat bazy danych.
Baza sakila jest to przykładowa baza jeżeli wybierzemy to będzie instalowana razem ze środowiskiem MySQL community.
Zapytania można wykonać i zaobserwować wyniki za pomocą aplikacji: https://wiki.ostrowski.net.pl/php_mysql/sakila.php
===== Lista wszystkich filmów z długością i oceną =====
SELECT title, length, rating
FROM film;
===== Top 10 najdłuższych filmów =====
SELECT title, length
FROM film
ORDER BY length DESC
LIMIT 10;
===== Liczba filmów w każdej kategorii =====
SELECT c.name AS category, COUNT(*) AS film_count
FROM film_category fc
JOIN category c ON fc.category_id = c.category_id
GROUP BY c.name
ORDER BY film_count DESC;
===== Średnia długość filmu w każdej kategorii =====
SELECT c.name AS category, AVG(f.length) AS avg_length
FROM film f
JOIN film_category fc ON f.film_id = fc.film_id
JOIN category c ON fc.category_id = c.category_id
GROUP BY c.name;
===== Aktorzy, którzy wystąpili w największej liczbie filmów =====
SELECT a.first_name, a.last_name, COUNT(*) AS film_count
FROM actor a
JOIN film_actor fa ON a.actor_id = fa.actor_id
GROUP BY a.actor_id
ORDER BY film_count DESC
LIMIT 10;
===== Filmy dostępne w więcej niż 1 języku (jeśli dotyczy) =====
SELECT f.title, l.name AS language
FROM film f
JOIN language l ON f.language_id = l.language_id;
===== Lista filmów i nazwisk aktorów w nich grających =====
SELECT f.title, a.first_name, a.last_name
FROM film f
JOIN film_actor fa ON f.film_id = fa.film_id
JOIN actor a ON fa.actor_id = a.actor_id
ORDER BY f.title;
===== Klienci, którzy zapłacili najwięcej (Top 10) =====
SELECT c.first_name, c.last_name, SUM(p.amount) AS total_spent
FROM customer c
JOIN payment p ON c.customer_id = p.customer_id
GROUP BY c.customer_id
ORDER BY total_spent DESC
LIMIT 10;
===== Ilość wypożyczeń każdego filmu =====
SELECT f.title, COUNT(r.rental_id) AS rental_count
FROM film f
JOIN inventory i ON f.film_id = i.film_id
JOIN rental r ON i.inventory_id = r.inventory_id
GROUP BY f.film_id
ORDER BY rental_count DESC;
===== Najczęściej wypożyczany film =====
SELECT f.title
FROM film f
JOIN inventory i ON f.film_id = i.film_id
JOIN rental r ON i.inventory_id = r.inventory_id
GROUP BY f.film_id
ORDER BY COUNT(*) DESC
LIMIT 1;
===== Klienci z miasta "Dallas" =====
SELECT c.first_name, c.last_name, a.address
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city ci ON a.city_id = ci.city_id
WHERE ci.city = 'Dallas';
===== Lista kategorii filmów, których średnia długość przekracza 120 minut =====
SELECT c.name AS category, AVG(f.length) AS avg_length
FROM film f
JOIN film_category fc ON f.film_id = fc.film_id
JOIN category c ON fc.category_id = c.category_id
GROUP BY c.name
HAVING AVG(f.length) > 120;
===== Lista wszystkich klientów z liczbą ich wypożyczeń =====
SELECT c.first_name, c.last_name, COUNT(r.rental_id) AS rentals
FROM customer c
JOIN rental r ON c.customer_id = r.customer_id
GROUP BY c.customer_id
ORDER BY rentals DESC;
===== Filmy bez wypożyczeń =====
SELECT f.title
FROM film f
LEFT JOIN inventory i ON f.film_id = i.film_id
LEFT JOIN rental r ON i.inventory_id = r.inventory_id
WHERE r.rental_id IS NULL;
===== Liczba klientów w każdym kraju =====
SELECT co.country, COUNT(*) AS customer_count
FROM customer cu
JOIN address a ON cu.address_id = a.address_id
JOIN city ci ON a.city_id = ci.city_id
JOIN country co ON ci.country_id = co.country_id
GROUP BY co.country
ORDER BY customer_count DESC;
===== Średni czas trwania wypożyczenia (w dniach) =====
SELECT AVG(DATEDIFF(return_date, rental_date)) AS avg_rental_duration
FROM rental
WHERE return_date IS NOT NULL;
===== Filmy zawierające słowo "Action" w opisie =====
SELECT title, description
FROM film
WHERE description LIKE '%Action%';
===== Filmy z aktorem "PENELOPE GUINESS" =====
SELECT f.title
FROM film f
JOIN film_actor fa ON f.film_id = fa.film_id
JOIN actor a ON fa.actor_id = a.actor_id
WHERE a.first_name = 'PENELOPE' AND a.last_name = 'GUINESS';
===== Lista klientów, którzy wypożyczyli film w 2006 roku =====
SELECT DISTINCT c.first_name, c.last_name
FROM customer c
JOIN rental r ON c.customer_id = r.customer_id
WHERE YEAR(r.rental_date) = 2006;
===== Średnia liczba wypożyczeń per klient =====
SELECT AVG(rental_count) AS avg_rentals_per_customer
FROM (
SELECT customer_id, COUNT(*) AS rental_count
FROM rental
GROUP BY customer_id
) AS sub;