
Subquery가 필요한 경우
Subquery의 기본 구조
SELECT col1, special_col
FROM
( /* subquery */
SELECT col1, col2, special_col
FROM table1
) a
SELECT col1, col2
FROM table1
WHERE col1 = (SELECT col1 FROM table2)
음식점의 총 주문 수량과 주문 금액 확인하고 주문 수량을 기반으로 수수료 할인율 구하기
SELECT restaurant_name, sum_price, sum_quantity, CASE WHEN sum_quantity <= 5 THEN 0.1 WHEN sum_quantity > 15 AND sum_price >= 300000 THEN 0.005 ELSE 0.01 END discount_rate FROM ( SELECT restaurant_name, SUM(price) sum_price, SUM(quantity) sum_quantity FROM food_orders GROUP BY 1 ) a
필요한 데이터가 꼭 하나의 테이블에 모여있지는 않은데 다른 테이블에서 데이터를 가져올 수 있는 방법이 JOIN문을 활용하는 것
주문 정보
| 고객 ID | 주문번호 | 고객이메일 |
|---|---|---|
| A | 123 | aaa@naver.com |
| B | 456 | bbb@gmail.com |
| C | 789 | ccc@daum.net |
고객 정보
| 고객 ID | 전화번호 | 연령 |
|---|---|---|
| A | 010-123-123 | 45 |
| B | 010-567-567 | 37 |
| C | 010-789-789 | 25 |
이렇게 테이블 두개가 있을 때 주문 정보에서 고객 정보의 전화번호가 필요할 때가 있다. 이때 두 테이블의 공통 칼럼인 고객 ID를 기준으로 JOIN해 전화번호 정보를 가져올 수 있다.
조인한 결과
| 주문번호 | 이메일 | 고객ID | 전화번호 | 연령 |
|---|---|---|---|---|
| 123 | aaa@naver.com | A | 010-123-123 | 45 |
| 456 | bbb@gmail.com | B | 010-567-567 | 37 |
| 789 | ccc@daum.net | C | 010-789-789 | 25 |
종류
LEFT JOIN : 공통 칼럼(키값)을 기준으로 하나의 테이블에 값이 없더라도 모두 조회되는 경우를 의미
INNER JOIN : 공통 칼럼(키값)을 기준으로 두 테이블 모두에 있는 값만 조회되는 경우를 의미
/* LEFT JOIN */
SELECT 조회할 칼럼
FROM 테이블1 a LEFT JOIN 테이블2 b on a.공통컬럼명 = b.공통컬럼명
/* INNER JOIN */
SELECT 조회할 칼럼
FROM 테이블1 a INNER JOIN 테이블2 b on a.공통컬럼명 = b.공통컬럼명
구조는 똑같은데 중요한 건 LEFT JOIN과 INNER JOIN의 차이이며 언제 사용할지에 대한 판단이 중요함
LEFT JOIN은 두 테이블의 공통이 아닌 부분도 데이터가 보여지고 INNER JOIN은 두 테이블의 공통인 부분만 보여진다는 차이가 있음
👀
강의를 듣고 subquery 실습을 할 때 고민하는 시간이 많이 들었다. 추가 학습의 필요성을 느꼈다.
예전에 QueryDSL을 이용해 query 문을 짤 때 join 특성을 생각하지 않아서 inner join으로 query를 짠 적이 있다. 필요한 데이터가 누락된 것을 보고 left join으로 변경했었는데 이번 교육을 들으면서 그때 생각이 많이 났다.
다음 기회에 query 문을 짜야 한다면 왜 해당 query를 생각했는지 고민하고 그때와 같은 실수를 하지 않아야겠다.