워크북 실습을 진행하기 전에 먼저 [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 |
-- 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 필드를 비교할 때마다 내부 쿼리가 실행된다.
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 |