6.추추가 연습문제 해답
1. actor 테이블에서 first_name과 last_name을 연결하여(concat) 대문자(upper)로 출력되도록 쿼리 작성
sql
SELECT UPPER(CONCAT(first_name, ' ', last_name)) 'Actor Name'
FROM actor;2. actor 테이블에서 actor_id, first_name, last_name을 조회하되, first_name이 Joe인 사람을 조회
제약조건: 테이블 내 실제 값은 대문자인 JOE로 되어있지만, ‘Joe’와 같이 대문자 외에 소문자로 섞어서 조회해도 조회가 가능하도록 쿼리 작성
sql
SELECT actor_id, first_name, last_name
FROM actor
WHERE LOWER(first_name) = LOWER("Joe");3. actor 테이블에서 last_name과 총 몇 명이 동일한 last_name을 가지고 있는지 조회
그룹핑 기준
last_name
정렬 기준
- actor_count 내림차순
- last_name 오름차순
sql
SELECT last_name, COUNT(*) actor_count
FROM actor
GROUP BY last_name
ORDER BY actor_count DESC, last_name;4. 3번 문제 내용으로 동일하게 조회하되, 그룹핑 조건으로 actor_count가 3보다 큰 데이터만 조회
sql
SELECT last_name, COUNT(*) actor_count
FROM actor
GROUP BY last_name
HAVING actor_count > 3
ORDER BY actor_count desc, last_name;5. address 테이블에 대한 테이블 생성 쿼리를 조회하기 위한 쿼리 작성
sql
SHOW CREATE TABLE address;→ address 테이블 생성 시 사용된 DDL 쿼리를 조회할 수 있음
6. JOIN을 활용하여 staff의 first_name과 last_name, address, district, postal_code, city_id를 조회
sql
SELECT first_name, last_name, address, district, postal_code, city_id
FROM staff stf
LEFT JOIN address adr
ON stf.address_id = adr.address_id;→ 조인하는 테이블 간 공통되지 않는 컬럼은 별칭을 작성하지 않아도, 참조 가능(first_name, last_name 등) address_id는 두 테이블에 모두 존재하기 때문에 각각 별칭 지정 필요
7. JOIN을 활용하여 각 staff가 2005년 8월에 집계한 총 대여금액, first_name, last_name 조회
sql
SELECT stf.first_name, stf.last_name, SUM(pay.amount)
FROM staff stf
LEFT JOIN payment pay
ON stf.staff_id = pay.staff_id
WHERE month(pay.payment_date) = 8
AND year(pay.payment_date) = 2005
GROUP BY stf.first_name, stf.last_name;8. 영화 제목과 해당 영화에 등장한 배우의 총 인원 수를 조회(INNER JOIN 활용)
sql
SELECT flm.title, COUNT(*) number_of_actors
FROM film flm
INNER JOIN film_actor fim_act
ON flm.film_id = fim_act.film_id
GROUP BY flm.title
ORDER BY number_of_actors DESC;9. 영화 제목이 ‘Hunchback Impossible’인 영화는 inventory 테이블에 총 몇 개의 복제본이 있는지 조회
ex) 만약, Inventory 테이블에 A라는 영화의 복제본이 5개일 경우, 5개의 비디오를 대여 가능하다는 의미
sql
SELECT flm.title, COUNT(*) number_in_inventory
FROM film flm
INNER JOIN inventory inv
ON flm.film_id = inv.film_id
WHERE lower(flm.title) = lower('Hunchback Impossible')
GROUP BY flm.title;10. 고객의 first_name, last_name과 각 고객(customer)이 지금까지 대여 과정에서 지불한 총 금액을 조회
sql
SELECT cust.first_name, cust.last_name, SUM(pay.amount) 'Total Amount Paid'
FROM payment pay
JOIN customer cust
ON pay.customer_id = cust.customer_id
GROUP BY cust.first_name, cust.last_name
ORDER BY cust.last_name;11. 제목이 ‘K’나 ‘Q’로 시작하고, 지원 언어가 English인 모든 영화 제목 조회(서브쿼리 활용)
sql
SELECT title
FROM film
WHERE (title LIKE 'K%' OR title LIKE 'Q%')
AND language_id IN (
SELECT language_id
FROM language
WHERE name = 'English'
)
ORDER BY title;12. 'Alone Trip'에 등장하는 모든 영화 배우들의 first_name, last_name 조회(서브쿼리 활용)
sql
SELECT first_name, last_name
FROM actor
WHERE actor_id IN (
SELECT actor_id
FROM film_actor
WHERE film_id IN (
SELECT film_id FROM film WHERE LOWER(title) = LOWER('Alone Trip')
)
);13. 국적이 캐나다인 고객의 first_name과 last_name, email 조회
sql
-- Sub Query
SELECT first_name, last_name, email
FROM customer
WHERE address_id IN (
SELECT address_id
FROM address
WHERE city_id IN (
SELECT city_id
FROM city
WHERE country_id IN (
SELECT country_id
FROM country
WHERE country = 'Canada'
)
)
);
-- Join
SELECT cus.first_name, cus.last_name, cus.email
FROM customer cus
JOIN address adr
ON cus.address_id = adr.address_id
JOIN city cit
ON adr.city_id = cit.city_id
JOIN country cou
ON cit.country_id = cou.country_id
WHERE cou.country = 'Canada';14. 영화 카테고리가 가족('Family')으로 분류된 모든 영화의 제목과 출시연도 조회
sql
SELECT film_id, title, release_year
FROM film
WHERE film_id IN (
SELECT film_id
FROM film_category
WHERE category_id IN (
SELECT category_id
FROM category
WHERE name = 'Family'
)
);15. 가장 많이 대여된 영화ID(film_id)와 영화 제목, 대여 횟수를 조회
sql
SELECT A.film_id, A.title, B.times_rented
FROM film A
JOIN (
SELECT inv.film_id, COUNT(ren.rental_id) times_rented
FROM rental ren
JOIN inventory inv
ON ren.inventory_id = inv.inventory_id
GROUP BY inv.film_id
) B
ON A.film_id = B.film_id
ORDER BY B.times_rented DESC;16. 영화 가게 id(store_id)와 각 영화 가게(store)가 벌어들인 총 매출 조회
sql
SELECT A.store_id, B.sales
FROM store A
JOIN (
SELECT cus.store_id, SUM(pay.amount) sales
FROM customer cus
JOIN payment pay
ON pay.customer_id = cus.customer_id
GROUP BY cus.store_id
) B
ON A.store_id = B.store_id
ORDER BY a.store_id;17. 각 영화 가게의 id, 도시, 국가, 총 매출에 대해 조회
(활용 테이블: store, address, customer, payment, city, country)
sql
SELECT A.*, B.sales
FROM (
SELECT sto.store_id, cit.city, cou.country
FROM store sto
LEFT JOIN address adr
ON sto.address_id = adr.address_id
JOIN city cit
ON adr.city_id = cit.city_id
JOIN country cou
ON cit.country_id = cou.country_id
) A
JOIN (
SELECT cus.store_id, sum(pay.amount) sales
FROM customer cus
JOIN payment pay
ON pay.customer_id = cus.customer_id
GROUP BY cus.store_id
) B
ON A.store_id = B.store_id
ORDER BY a.store_id;18. 총 수익 기준 상위 5개에 해당하는 영화 장르와 총 수익(별칭으로 revenue라고 작명) 조회
sql
SELECT cat.name category_name, SUM( IFNULL(pay.amount, 0) ) revenue
FROM category cat
LEFT JOIN film_category flm_cat
ON cat.category_id = flm_cat.category_id
LEFT JOIN film fil
ON flm_cat.film_id = fil.film_id
LEFT JOIN inventory inv
ON fil.film_id = inv.film_id
LEFT JOIN rental ren
ON inv.inventory_id = ren.inventory_id
LEFT JOIN payment pay
ON ren.rental_id = pay.rental_id
GROUP BY cat.name
ORDER BY revenue DESC
LIMIT 5;19. view를 활용하여 18번에서 조회한 쿼리 임시 저장하기
sql
CREATE VIEW top_five_genres as
SELECT cat.name category_name, SUM( IFNULL(pay.amount, 0) ) revenue
FROM category cat
LEFT JOIN film_category flm_cat
ON cat.category_id = flm_cat.category_id
LEFT JOIN film fil
ON flm_cat.film_id = fil.film_id
LEFT JOIN inventory inv
ON fil.film_id = inv.film_id
LEFT JOIN rental ren
ON inv.inventory_id = ren.inventory_id
LEFT JOIN payment pay
ON ren.rental_id = pay.rental_id
GROUP BY cat.name
ORDER BY revenue DESC
LIMIT 5;20. 저장한 view로 다시 조회
sql
SELECT * FROM top_five_genres;21. 사용하던 view 제거
sql
DROP VIEW top_five_genres;Last updated on