Skip to content
Open
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
80 changes: 80 additions & 0 deletions lab-sql-joins.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
USE sakila;

-- 1. List the number of films per category.
SELECT c.name, COUNT(fc.film_id) AS film_count
FROM category AS c
JOIN film_category AS fc ON c.category_id = fc.category_id
JOIN film AS f ON fc.film_id = f.film_id
GROUP BY c.name
ORDER BY film_count DESC;

-- 2. Retrieve the store ID, city, and country for each store.
SELECT s.store_id, ct.city, c.country
FROM store AS s
LEFT JOIN address AS a ON s.address_id = a.address_id
LEFT JOIN city AS ct ON a.city_id = ct.city_id
LEFT JOIN country AS c ON ct.country_id = c.country_id;

-- 3. Calculate the total revenue generated by each store in dollars.
SELECT s.store_id, SUM(p.amount) AS total_revenue
FROM store AS s
JOIN staff AS st ON s.store_id = st.store_id
JOIN payment AS p ON st.staff_id = p.staff_id
GROUP BY s.store_id
ORDER BY total_revenue DESC;

-- 4. Determine the average running time of films for each category.
SELECT c.name AS category, ROUND(AVG(f.length), 2) AS avg_duration
FROM category AS c
JOIN film_category AS fc ON c.category_id = fc.category_id
JOIN film AS f ON fc.film_id = f.film_id
GROUP BY c.name
ORDER BY avg_duration DESC;

-- Bonus:
-- 5. Identify the film categories with the longest average running time.
SELECT c.name AS category, ROUND(AVG(f.length), 2) AS avg_duration
FROM category AS c
JOIN film_category AS fc ON c.category_id = fc.category_id
JOIN film AS f ON fc.film_id = f.film_id
GROUP BY c.name
ORDER BY avg_duration DESC
LIMIT 5;

-- 6. Display the top 10 most frequently rented movies in descending order.
SELECT f.title AS film, COUNT(r.rental_id) AS rental_count
FROM film AS f
JOIN inventory as i ON f.film_id = i.film_id
JOIN rental AS r ON i.inventory_id = r.inventory_id
GROUP BY f.film_id, f.title
ORDER BY rental_count DESC
LIMIT 10;

-- 7. Determine if "Academy Dinosaur" can be rented from Store 1.
SELECT f.title AS film, i.store_id
FROM film AS f
JOIN inventory AS i ON f.film_id = i.film_id
WHERE f.title = 'Academy Dinosaur' AND i.store_id = 1;
-- Or:
SELECT
CASE
WHEN COUNT(*) > 0 THEN f.title
ELSE 'No'
END AS available_in_store_1
FROM film f
JOIN inventory i ON f.film_id = i.film_id
WHERE f.title = 'Academy Dinosaur'
AND i.store_id = 1;

-- 8. Provide a list of all distinct film titles, along with their availability status in the inventory.
-- Include a column indicating whether each title is 'Available' or 'NOT available.
-- ' Note that there are 42 titles that are not in the inventory, and this information can be obtained using a CASE statement combined with IFNULL."
SELECT
f.title,
CASE
WHEN IFNULL(i.inventory_id, 0) = 0 THEN 'NOT available'
ELSE 'Available'
END AS availability_status
FROM film f
LEFT JOIN inventory i
ON f.film_id = i.film_id;