워크북 실습을 진행하기 전에 먼저 [MYSQL] JOIN과 서브쿼리에 대해 공부했다.

참고 자료는 다음과 같다.

https://inpa.tistory.com/entry/MYSQL-📚-JOIN과-서브쿼리-차이-및-변환-💯-정리


[ 상품 목록 테이블 - product ]

id name cost year city
1 chair 245 2017 Chicago
2 armchair 500 2018 Chicago
3 desk 900 2019 Los Angeles
4 lamp 85 2017 Cleaveland
5 bench 2000 2018 Seattle
6 stool 2500 2020 Austin
7 tv table 2000 2020 Austin

[ 판매 이력 테이블 - sale ]

id product_id(외래키) price year city
1 2 2000 2020 Chicago
2 2 590 2020 New York
3 2 790 2020 Cleveland
5 3 800 2019 Clevenland
6 4 100 2020 Detroit
7 5 2300 2019 Seattle
8 7 2000 2020 New York

Q. 2,000 달러에 팔린 product의 이름과 가격을 알고 싶다고 가정해보자.

-- sale에서 2000원에 팔린 product_id와 projuct테이블의 id와 일치한 것을 가져온다.
SELECT name, cost
FROM product
WHERE id =
( 
  SELECT product_id
  FROM sale
  WHERE price = 2000
  AND product_id = product.id 
);

→ 아이디를 비교하는 과정에서 각 id와 product_id 필드를 비교할 때마다 내부 쿼리가 실행된다.

Inner Join으로 변환

SELECT p.name, p.cost
FROM product AS p
JOIN sale AS s -- inner join
ON p.id = s.product_id
WHERE s.price = 2000;

중첩 서브 퀴리 (복수행)

판매된 상품의 이름과 가격을 알고 싶을 때는

SELECT name, cost
FROM product
WHERE id IN ( SELECT product_id FROM sale );
-- 서브 쿼리가 반환한 product_id 목록은 sale 테이블에서 가져왔기 때문에, 이는 오직 판매된 상품을 의미.
name cost
armchair 500
lamp 85
bench 2000
desk 900