[SQL 2-2강 (2)] JOIN, LEFT, CASE

2021. 5. 20.·🤓 기술 학습 & 공부 기록/컴퓨터 일반

[강의명]
패스트캠퍼스 SQL 100제 + 자격증 완성 온라인 완주반

[수강목록]
생각대로 SQL - 3

[강의내용]

 

생각대로 SQL - 3

 

문제10번) country가 china가 아닌 지역에 사는, 고객의 이름(first_name, last_name)과 , email, phonenumber, country, city 를 알려주세요

 

country 테이블을 추가로 조인하여 where절에서 not china를 설정해야 한다.

 

SELECT c.first_name, c.last_name, c.email, a.phone, co.country, ct.city
FROM customer c 
JOIN address a ON c.address_id = a.address_id
JOIN city ct ON a.city_id = ct.city_id 
JOIN country co ON ct.country_id = co.country_id
WHERE co.country <> 'China';

 

문제12번) Music 장르이면서, 영화길이가 60~180분 사이에 해당하는 영화의 title, description, length 를 알려주세요.
   -  영화 길이가 짧은 순으로 정렬해서 알려주세요. 

 

title, description, length 컬럼은 film테이블에 있다. category 테이블에서 category값이 music인 정보를 찾아야하는데, category 테이블에 도달하기 위해서는 중계 역할을 하는 film_category 테이블을 거쳐야 한다.

 

film_category 테이블

SELECT f.title, f.description, f.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
WHERE c.name = 'Music'
AND f.length BETWEEN 60 AND 180
ORDER BY f.length;

 

문제13번) actor 테이블을 이용하여,  배우의 ID, 이름, 성 컬럼에 추가로 'Angels Life' 영화에 나온 영화 배우 여부를 Y , N 으로 컬럼을 추가 표기해주세요. 해당 컬럼은 angelslife_flag로 만들어주세요.

 

어려웠던 문제이므로 자세하게 들여다본다.

 

내가 작성한 답안은 (Y값이 잘 나오는지 검사를 위해 맨 밑에 ORDER BY절을 추가했음)

 

SELECT a.actor_id, a.first_name, a.last_name,
       CASE WHEN f.title IN ('Angels Life') THEN 'Y'
            ELSE 'N'
       END AS angelslife_flag
FROM actor a 
JOIN film_actor fa ON a.actor_id = fa.actor_id
JOIN film f ON fa.film_id = f.film_id
ORDER BY angelslife_flag desc;

 

쿼리 결과

 

중복된 값이 등장하는 오류가 발생했다.

이를 수정하기 위해 DISTINCT를 걸었으나...

 

쿼리 결과

 

Y값에 해당하는 배우들은 N값을 달고 또 등장하는 오류가 있다.

이러한 배경에는 배우들은 여러 작품을 촬영하므로, film 테이블을 조인하면서 여러 배우들이 테이블에 등장하게 되는 것에 있다.

그래서 모범답안을 참조했다.

 

SELECT a.actor_id, a.first_name, a.last_name, 
       CASE WHEN angels_actor.actor_id IS NOT NULL THEN 'Y'
            ELSE 'N'
       END AS angelslife_flag
FROM actor a
LEFT JOIN (SELECT f.film_id, f.title, fa.actor_id 
		   FROM film f 
		   JOIN film_actor fa ON f.film_id = fa.film_id
		   WHERE title = 'Angels Life'
	 ) AS angels_actor ON a.actor_id = angels_actor.actor_id;

 

우선, angels_actor라고 이름붙인 서브쿼리를 통해 Angels Life에 출연한 배우들의 정보를 따로 추출하여 서브쿼리(angels_actor 테이블)에 넣었다.

서브쿼리 결과 (angels_actor 테이블)

여기에 나타나는 actor_id값을 통해 angelslife_flag에서 Y/N을 가려주면 된다.

LEFT JOIN을 사용하여 Angels Life에 출연하지 않은 배우들을 따로 NULL값으로 출력할 수 있다. NULL인 값은 CASE절을 통해 angelslife_flag로 나타내면 된다.

 

쿼리 결과

 

문제14번) 대여일자가 2005-06-01~ 14일에 해당하는 주문 중에서 , 직원의 이름(이름 성) = 'Mike Hillyer' 이거나 
고객의 이름이 (이름 성) ='Gloria Cook'  에 해당 하는 rental 의 모든 정보를 알려주세요.
 - 추가로 직원이름과, 고객이름에 대해서도  fullname 으로 구성해서 알려주세요.

 

rental 테이블에 staff 테이블과 customer 테이블을 조인하면 된다. rental_date는 년월일 + 시각까지 나와있기 때문에

DATE함수를 통해 년월일만으로 바꿔준다.

 

또한, '2005-06-01' 처럼 따옴표를 붙여줘야함에 주의 한다.

 

그리고, 직원의 이름(이름 성) = 'Mike Hillyer' 이거나 고객의 이름이 (이름 성) ='Gloria Cook' 이어야 하므로, A OR B를 괄호로 감싸주어야 한다.

 

SELECT r.*, s.first_name || ' ' || s.last_name AS fullname_staff,
	   c.first_name || ' ' || c.last_name AS fullname_customer
FROM rental r 
JOIN staff s ON r.staff_id = s.staff_id
JOIN customer c ON r.customer_id = c.customer_id 
WHERE date(r.rental_date) BETWEEN '2005-06-01' AND '2005-06-14'
and (s.first_name || ' ' || s.last_name = 'Mike Hillyer'
OR c.first_name || ' ' || c.last_name = 'Gloria Cook');

 

쿼리 결과

 

 

'🤓 기술 학습 & 공부 기록/컴퓨터 일반' 카테고리의 다른 글
  • [SQL 2-4강 (1)] GROUP BY, HAVING, JOIN, CASE, ROUND
  • [SQL 2-3강] GROUP BY, HAVING
  • [SQL 2-2강 (1)] JOIN, NATURAL JOIN
  • [SQL 2-1강 (2)] SELF JOIN, FULL, CROSS
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (510)
      • 🎨 프론트엔드 공부 (247)
        • JS & TS (86)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
[SQL 2-2강 (2)] JOIN, LEFT, CASE
상단으로

티스토리툴바