SQL(데이터분석_사전캠프)

사전캠프 SQL 4주차 - Subquery와 JOIN

pinehouse13 2025. 4. 25. 23:44

오늘은 저녁약속이 있기 때문에 TIL을 길게 적을 시간이 없다.

 

바로 본론으로 들어가자.

 

 

오늘의 핵심 학습 키워드

# Subquery #LEFT JOIN #INNER JOIN

 

1. Subquery

 

지금까지 sql 코드를 작성하면서 테이블을 참조하기 위해 from 절을 다음과 같은 형태로 사용해왔다.

from 테이블 명

 

하지만, from은 테이블 명 외에도 sql 구문 자체를 참조하는 것도 가능하다.

 

예를 들어, food_orders 테이블에서 아래와 같은 조건으로 출력한다고 가정해보자.

1. 각 음식점을 지역별(시,도)로 구분한다.

2. 각 음식점의 평균 배달시간을 20분 이하, 20~30분, 30분 초과 세 개의 그룹으로 구분한다. 

 

select restaurant_name,
       sido,
       case when avg_time<=20 then '<=20'
            when avg_time>20 and avg_time <=30 then '20<x<=30'
            when avg_time>30 then '>30' end time_segment
from 
(
select restaurant_name,
       substring(addr, 1, 2) sido,
       avg(delivery_time) avg_time
from food_orders
group by 1, 2
) a

 

위와 같이, 먼저 각 음식점의 시, 도와 평균 배달시간을 구한 후, 해당 sql 구문 자체를 참조해 평균 배달시간을 구하는 코드를 사용 할 수 있다.

 

각 음식점의 시, 도와 평균 배달시간의 그룹을 구분한 출력결과

 

2. LEFT JOIN, INNER JOIN

 

JOIN은 두 개의 서로 다른 테이블에서 정보를 참조하고 싶은 경우 사용하는 구문이며, LEFT JOIN과 INNER JOIN 두 가지 구문이 존재한다.

FROM 테이블1 LEFT JOIN 테이블2 ON 테이블1.KEY컬럼=테이블2.KEY컬럼

 

JOIN 구문은 위와 같은 형태로 사용되며, LEFT JOIN과 INNER JOIN의 공통점과 차이점은 다음과 같다.

 

공통점 : 테이블1과 테이블2의 KEY 컬럼 둘 다 정보가 있는 경우, 해당 정보를 출력한다.

LEFT JOIN : 테이블2의 KEY컬럼에 정보가 없더라도 테이블1의 KEY 컬럼에 정보가 있다면, 해당 정보들도 출력한다.

INNER JOIN :  테이블1과 테이블2의 KEY 컬럼 둘 중 하나라도 정보가 없는 경우, 해당 정보들은 출력하지 않는다.

 

예시를 보면 보다 잘 이해할 수 있을 것이다.

 

food_orders와 customers 테이블에서 고객 이름, 연령, 성별, 주문 식당 컬럼 조회하기.

 

상기 조건을 코드로 적어보면 아래와 같이 입력 할 수 있다.

select distinct c.name,
       c.age,
       c.gender,
       f.restaurant_name
from food_orders f left join customers c on f.customer_id=c.customer_id
order by c.name

 

우선, LEFT JOIN을 사용한 경우의 출력결과를 확인해보자.

 

LEFT JOIN 사용 시 출력결과

 

위와같이, 1행에서 14행까지의 정보는 food_orders 테이블에는 데이터가 있으나 customers 테이블에는 정보가 없는 경우 LEFT JOIN 사용 시 정보가 없는 부분이 null 값으로 노출되게 된다.

 

INNER JOIN 사용 시 출력결과

 

반면 INNER JOIN 사용 시, 두 테이블 중 한 테이블이라도 정보가 없다면 해당 정보는 출력되지 않기 때문에, 위와 같이 null 값이 없는 출력결과를 확인할 수 있다.