오늘은 저녁약속이 있기 때문에 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을 사용한 경우의 출력결과를 확인해보자.
위와같이, 1행에서 14행까지의 정보는 food_orders 테이블에는 데이터가 있으나 customers 테이블에는 정보가 없는 경우 LEFT JOIN 사용 시 정보가 없는 부분이 null 값으로 노출되게 된다.
반면 INNER JOIN 사용 시, 두 테이블 중 한 테이블이라도 정보가 없다면 해당 정보는 출력되지 않기 때문에, 위와 같이 null 값이 없는 출력결과를 확인할 수 있다.
'SQL(데이터분석_사전캠프)' 카테고리의 다른 글
사전캠프 SQL 5주차 - 피벗테이블 (0) | 2025.04.28 |
---|---|
사전캠프 SQL 3주차 - 문자 포맷 가공, 다중조건설정 (0) | 2025.04.24 |
사전캠프 SQL 2주차 - SQL로 범주별 연산, 정렬하기 (0) | 2025.04.23 |
사전캠프 SQL 1주차 - SQL 기초문법 알아보기 (1) | 2025.04.22 |