과제를 위한 안내- 준비단계
다운로드 파일 클릭 시,
아래 사진과 같은 페이지가 나오는데,
페이지를 다른 이름으로 저장
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!
똑같다!
심화) 과제 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
'Wecode - Project 3 (부트캠프) > Project 3 과정' 카테고리의 다른 글
sprint 2 - 목요일 standing meeting (0) | 2023.10.19 |
---|---|
Project 3: AWS 서버 연결 성공 (0) | 2023.10.19 |
Project 3- 주문 api. ->작성 후 수정 (0) | 2023.10.18 |
Project 3 - [주문 api] postman 통신 시도 + 그 전에 거쳐야 할 작업들 (0) | 2023.10.18 |
Project 3 - 프론트에 보내줄 api 생각하는 과정 (0) | 2023.10.18 |