13. SQL ( JOIN ) 서로 다른 테이블의 데이터를 붙여 조회하기

김요한·2024년 6월 25일

JOIN

  • 필요한 데이터가 두 개인데 각자 다른 테이블에 있을 때 사용

LEFT JOIN

  • A테이블에 값이 없더라도 모두 조회되는 경우 이다.

  • 위와 같이 B에는 데이터가 없더라도 A에만 있는 데이터를 불러온다.

INNER JOIN

  • A와 B 두 테이블에 공통된 값만 조회한다.
  • 위와 같이 LEFT JOIN에는 없던 주문번호 14번은 제외되고 조회되었다.

JOIN의 기본구조

-- LEFT JOIN
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
--  테이블1에 a라는 as를 줄 수 있다./그럼으로써 컬럼을 쉽게 불러올 수 있다.!
---INNER JOIN
select조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명

JOIN 예시 - 고객의 주문 식당 조회하기

select *
from food_orders a left join payments b on a.order_id=b.order_id
where cuisine_type='Korean'
    1. 아래 사진처럼 food_orders와 payments테이블이 order_id의 공통된 컬럼으로 묶였다.

  1. 음식점 타입이 'Korean'인 food_orders와 payments테이블 두개의 컬럼을 JOIN하였다.
    select뒤에 작성하는 컬럼명은 join할때 사용하였던 a. 또는 b.의 Alias를 붙여 사용해준다.
select a.order_id,
       a.restaurant_name,
       a.price,
       b.pay_type,
       b.vat
from food_orders a left join payments b on a.order_id=b.order_id
where cuisine_type='Korean'

Subquery와 JOIN을 활용한 예시

  • 50세 이상 고객의 연령에 따라 경로 할인율을 적용하고, 음식 타입별로 원래 가격과 할인 적용 가격 합을 구하기
    (조회 컬럼 : 음식 타입, 원래 가격, 할인 적용 가격, 할인 가격)
    할인 : 나이-50 '' 0.005
  • 고객 정보가 없는 경우도 포함하여 조회, 할인 금액이 큰 순서대로 정렬
select cuisine_type,
       sum(price) "원래 가격",
       sum(price)-sum(discount_price) "할인 적용 가격",
       sum(discount_price) "할인 가격" 
from 
(
select a.cuisine_type,
       price,               
       price*((b.age-50)*0.005) discount_price #50세 이상 할인율 연산 컬럼 생성
from food_orders a inner join customers b on a.customer_id=b.customer_id
where b.age>=50  # 음식주문과 고객테이블을 INNER JOIN하며 나이가 50이상인 조건설정
) t
group by 1       # 음식 타입을 기준으로 카테고리화하  
order by 4 desc # 할인가격을 내림차순(desc)로 높은 순 부터 조회한다. 

0개의 댓글