diff --git a/.ipynb_checkpoints/README-checkpoint.md b/.ipynb_checkpoints/README-checkpoint.md new file mode 100644 index 0000000..cb11550 --- /dev/null +++ b/.ipynb_checkpoints/README-checkpoint.md @@ -0,0 +1,84 @@ +![logo_ironhack_blue 7](https://user-images.githubusercontent.com/23629340/40541063-a07a0a8a-601a-11e8-91b5-2f13e4e6b441.png) + +# LAB | SQL Subqueries + +
+ +

Learning Goals

+
+ + This lab allows you to practice and apply the concepts and techniques taught in class. + + Upon completion of this lab, you will be able to: + +- Use advanced SQL queries (e.g., subqueries, window functions) to perform more complex data manipulations and analysis. + +
+
+ +
+ +
+ +

Prerequisites

+
+ +Before this starting this lab, you should have learnt about: + +- SELECT, FROM, ORDER BY, LIMIT, WHERE, GROUP BY, and HAVING clauses. DISTINCT, AS keywords. +- Built-in SQL functions such as COUNT, MAX, MIN, AVG, ROUND, DATEDIFF, or DATE_FORMAT. +- JOIN to combine data from multiple tables. +- Subqueries + +
+
+ +
+ + +## Introduction + +Welcome to the SQL Subqueries lab! + +In this lab, you will be working with the [Sakila](https://dev.mysql.com/doc/sakila/en/) database on movie rentals. Specifically, you will be practicing how to perform subqueries, which are queries embedded within other queries. Subqueries allow you to retrieve data from one or more tables and use that data in a separate query to retrieve more specific information. + +## Challenge + +Write SQL queries to perform the following tasks using the Sakila database: + +1. Determine the number of copies of the film "Hunchback Impossible" that exist in the inventory system. +2. List all films whose length is longer than the average length of all the films in the Sakila database. +3. Use a subquery to display all actors who appear in the film "Alone Trip". + +**Bonus**: + +4. Sales have been lagging among young families, and you want to target family movies for a promotion. Identify all movies categorized as family films. +5. Retrieve the name and email of customers from Canada using both subqueries and joins. To use joins, you will need to identify the relevant tables and their primary and foreign keys. +6. Determine which films were starred by the most prolific actor in the Sakila database. A prolific actor is defined as the actor who has acted in the most number of films. First, you will need to find the most prolific actor and then use that actor_id to find the different films that he or she starred in. +7. Find the films rented by the most profitable customer in the Sakila database. You can use the customer and payment tables to find the most profitable customer, i.e., the customer who has made the largest sum of payments. +8. Retrieve the client_id and the total_amount_spent of those clients who spent more than the average of the total_amount spent by each client. You can use subqueries to accomplish this. + +## Requirements + +- Fork this repo +- Clone it to your machine + + +## Getting Started + +Complete the challenges in this readme in a `.sql`file. + +## Submission + +- Upon completion, run the following commands: + +```bash +git add . +git commit -m "Solved lab" +git push origin master +``` + +- Paste the link of your lab in Student Portal. + + + diff --git a/subqueries.sql b/subqueries.sql new file mode 100644 index 0000000..00974c5 --- /dev/null +++ b/subqueries.sql @@ -0,0 +1,104 @@ +USE sakila + +-- 1. Determine the number of copies of the film "Hunchback Impossible" that exist in the inventory system. +SELECT COUNT(i.inventory_id) AS num_copies +FROM inventory i +JOIN film f ON i.film_id = f.film_id +WHERE f.title = 'Hunchback Impossible'; + +-- 2. List all films whose length is longer than the average length of all the films in the Sakila database. +SELECT title +FROM film +WHERE length > (SELECT AVG(length) FROM film); + +-- 3. Use a subquery to display all actors who appear in the film "Alone Trip". +SELECT first_name, last_name +FROM actor +WHERE actor_id IN ( + SELECT actor_id + FROM film_actor + JOIN film f ON film_actor.film_id = f.film_id + WHERE f.title = 'Alone Trip' +); + +-- Bonus: + +-- 4. Identify all movies categorized as family films. +SELECT f.title +FROM film f +JOIN film_category fc ON f.film_id = fc.film_id +JOIN category c ON fc.category_id = c.category_id +WHERE c.name = 'Family'; + +-- 5. Retrieve the name and email of customers from Canada using both subqueries and joins. + +-- Using a subquery: +SELECT first_name, last_name, email +FROM customer +WHERE address_id IN ( + SELECT address_id + FROM address + JOIN city ON address.city_id = city.city_id + JOIN country ON city.country_id = country.country_id + WHERE country.country = 'Canada' +); + +-- Using a join: +SELECT c.first_name, c.last_name, c.email +FROM customer c +JOIN address a ON c.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 +WHERE co.country = 'Canada'; + +-- 6. Determine which films were starred by the most prolific actor in the Sakila database. +-- First, find the most prolific actor: +SELECT actor_id +FROM film_actor +GROUP BY actor_id +ORDER BY COUNT(film_id) DESC +LIMIT 1; + +-- Now use the most prolific actor's actor_id to find the films they starred in: +SELECT f.title +FROM film f +JOIN film_actor fa ON f.film_id = fa.film_id +WHERE fa.actor_id = (SELECT actor_id + FROM film_actor + GROUP BY actor_id + ORDER BY COUNT(film_id) DESC + LIMIT 1); + +-- 7. Find the films rented by the most profitable customer in the Sakila database. +-- First, find the most profitable customer: +SELECT customer_id +FROM payment +GROUP BY customer_id +ORDER BY SUM(amount) DESC +LIMIT 1; + +-- Now use the most profitable customer's customer_id to find the films they rented: +SELECT f.title +FROM rental r +JOIN inventory i ON r.inventory_id = i.inventory_id +JOIN film f ON i.film_id = f.film_id +WHERE r.customer_id = ( + SELECT customer_id + FROM payment + GROUP BY customer_id + ORDER BY SUM(amount) DESC + LIMIT 1 +); + +-- 8. Retrieve the client_id and the total_amount_spent of those clients who spent more than the average of the total_amount spent by each client. +SELECT customer_id, SUM(amount) AS total_amount_spent +FROM payment +GROUP BY customer_id +HAVING total_amount_spent > ( + SELECT AVG(total_amount_spent) + FROM ( + SELECT customer_id, SUM(amount) AS total_amount_spent + FROM payment + GROUP BY customer_id + ) AS subquery +);