Wecode - Project 3 (부트캠프)/Project 3 과정

[sql 복습] mysql 과제 2-1, 2-2번 ; SQL Advanced

JBS 12 2023. 10. 18. 23:29

과제를 위한 안내- 준비단계 

다운로드 파일 클릭 시, 

아래 사진과 같은 페이지가 나오는데, 

 

페이지를 다른 이름으로 저장 

 

sql_advanced_assignment 를 download 후, 

 

.sql 파일이 있는 경로로 가서  

sql_advanced_assignment 있는 '파일'로 가서,

 

> terminal 켜서 sql_advanced_assignmen가 다운로드 된 파일로 ('다운로드' 파일에 있으니  ; cd download) 

>  거기에서 명령어 입력

      mysql -u root -p sql_advanced_assignment < sql_advanced_assignment.sql 입력

mysql 비번 치고

 

 

그럼 vscode 아무거나 열면, 

sql_advanced_assignment  데이터베이스가 들어가 있다. 

mysql로 show databases;  해도 들어가 있다


과제 2-1 

정답

mysql >

SELECTmovies.id AS movie_id, movies.title, movies.rate, movies.open_date, distributors.business_name AS distributors_name

FROM movies

LEFT JOIN distributors  ON movies.distributor_id = distributors.id

WHERE open_date >= '2022-03-01';


문제 분석 

1) movie 테이블의 id, title, rate, open_date ;distributer_name을 제외한 모든 칼럼이 출력되지만, 

2) movie_id를 3,4,5만 뽑아내야 하고 

3)movie 테이블의 distributer_name 칼럼은, id가 아니라, name

 

방향 

1. movies 테이블은 distributer_id인데 

결과 테이블은 distributor_name 인 것으로 보아, fk 로 join 하는 거고,

 

2. distributores테이블의 칼럼 이름은 business_name 인데, 

결과 테이블은 distributor_name 인 것으로 보아, AS (혹은 생략으로 바로 이어 써서 가능) 로 'distributor_name'로 명명해 준 것을 예측 후 해보기 


풀이

한번에 하려고 하지 말자

left join 하는 테이블도 바꿔가며,
칼럼도 일단 모두 뽑고, 결과 보고 나서, 그 다음에 원하는 칼럼만 뽑고, 

똑같은, 원하는 테이블이 나오기만 하면 된다

일단, join 등을 위한, movies, distributors 테이블들 출력해보기 

출력해보고, 보면서 힌트를 얻는 것이다 (결과표만 보고 답이 보이길 생각하는게 아니라)

movies 테이블 칼럼 형태 보고 

 

시도 1 

mysql> 

SELECT 

       movies.id, movies.title, movies.rate, movies.open_date, distributors.business_name AS distributors_name

FROM

       movies

LEFT JOIN distributors  

       ON movies.distributor_id = distributors.id;

 

답과 비교해보기

결과표와 내가 출력한 표 보면서, 퀴리문 고치기 

 

mysql >

SELECT

       movies.id AS movie_id, movies.title, movies.rate, movies.open_date, distributors.business_name AS distributors_name

FROM

       movies

LEFT JOIN distributors  

       ON movies.distributor_id = distributors.id

WHERE open_date >= '2022-03-01';

나는 3개의 열만 뽑아내기 위해,
movie Id 3,4,5만 뽑아내거나, distributor Id로 접근했는데,

그게 아니라 문제가 주어진 대로
[ '2020-03-01' 이후 ] 로 접근 하라고 했구나 

open_date 칼럼 에서 
      --> WHERE open_date >= '2022-03-01';

그 후 찍어낸 정답 mysql! 

 

똑같다!  

1답과 비교해보기


심화) 과제 2-2 : Group By

 

문제 속의 hint

- 특정 에이전시 회사 =  Agencyfluent 의 소속 배우 정보 

- 해당 배우들이 출연한 영화 목록 

 

관련된 

actors, agencis, movie_actors 테이블들을 출력해 보았다. 

1. 결과 테이블의 actor_id , actor_name은 agency_id가 모두 1 인 'Agencyfluent' 소속 
2. movies를 filmography 라 칭해서 -> 'movies AS filmography' 를 써야 한다 

 

 

 

 

 

시도 1

 

mysql>

SELECT

    actors.id AS actor_id, actors.name AS actor_name, actors.agency_id, movies_actors.movie_id, movies_actors.actor_id  

 

FROM actors

 

LEFT JOIN movies_actors

ON  actors.id = movies_actors.actor_id;

 

시도 1 을 결과 표와 비교 

 

 

시도 2 

mysql>

SELECT

    actors.id AS actor_id, actors.name AS actor_name, actors.agency_id, movies_actors.movie_id AS filmography

 

FROM actors

 

LEFT JOIN movies_actors

ON  actors.id = movies_actors.actor_id;

 

시도 3 

mysql>

SELECT

    actors.id AS actor_id, actors.name AS actor_name, actors.agency_id, movies_actors.movie_id AS filmography

FROM actors

LEFT JOIN movies_actors ON  movies_actors.actor_id = actors.id  

LEFT JOIN movies ON  movies.id = movies_actors.movie_id ; 

위 코드랑 달라진 게 없네

 

정답코드 

SELECT 

      actors.id AS actor_id, actors.name AS actor_name, JSON_ARRAYAGG(movies.title)

FROM actors

JOIN movies_actors ON movies_actors.actor_id = actors.id

JOIN movies ON movies.id = movies_actors.movie_id

GROUP BY actors.id;


---
SELECT

     actors.id AS actor_id, actors.name AS actor_name, JSON_ARRAYAGG(movies.title)

FROM actors

JOIN movies_actors ON movies_actors.actor_id = actors.id

JOIN movies ON movies.id = movies_actors.movie_id

WHERE actors.agency_id = 1

GROUP BY actors.id;


 

위아래 결과를 만든느 차이 : WHERE actors.agency_id = 1