내일배움캠프 5일차 TIL - SQL의 subquery와 join

iy·2023년 12월 25일

TIL

목록 보기
4/37

Subquery

  • 여러번의 연산을 한 번의 SQL문으로 수행하기
  1. Subquery가 필요한 경우

    • 여러번의 연산을 수행할 때
    • 조건문에 연산 결과를 사용해야 할 때
    • 조건에 Query 결과를 사용하고 싶을 때
  2. Subquery의 기본 구조

    • Query 안에 sub로 들어간 구문
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

  • 필요한 데이터가 서로 다른 테이블에 있을 때 조회할 수 있는 방법
  1. JOIN이 필요한 경우

필요한 데이터가 꼭 하나의 테이블에 모여있지는 않은데 다른 테이블에서 데이터를 가져올 수 있는 방법이 JOIN문을 활용하는 것

  1. JOIN의 기본 원리와 종류
  • 원리
    • 서로 다른 테이블에서 원하는 정보가 있을 때 우선 두 테이블이 갖고 있는 공통 정보를 기준으로 데이터를 가져온다고 생각하면 됨

주문 정보

고객 ID주문번호고객이메일
A123aaa@naver.com
B456bbb@gmail.com
C789ccc@daum.net

고객 정보

고객 ID전화번호연령
A010-123-12345
B010-567-56737
C010-789-78925

이렇게 테이블 두개가 있을 때 주문 정보에서 고객 정보의 전화번호가 필요할 때가 있다. 이때 두 테이블의 공통 칼럼인 고객 ID를 기준으로 JOIN해 전화번호 정보를 가져올 수 있다.

조인한 결과

주문번호이메일고객ID전화번호연령
123aaa@naver.comA010-123-12345
456bbb@gmail.comB010-567-56737
789ccc@daum.netC010-789-78925
  • 종류

    1. LEFT JOIN : 공통 칼럼(키값)을 기준으로 하나의 테이블에 값이 없더라도 모두 조회되는 경우를 의미

    2. INNER JOIN : 공통 칼럼(키값)을 기준으로 두 테이블 모두에 있는 값만 조회되는 경우를 의미

  1. 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를 생각했는지 고민하고 그때와 같은 실수를 하지 않아야겠다.

0개의 댓글