개인공부

[SQL] LEFT JOIN 과 INNER JOIN 차이

여연찌 2024. 3. 20. 20:32

 

식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기

- 평균 음식 주문 금액 기준 : 5,000 / 10,000 / 30,000 / 30,000 초과

- 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상

 

-- 내가 작성한 쿼리문

SELECT restaurant_name
     , CASE WHEN AVG(A_price) <= 5000 THEN 'price_group1'
            WHEN AVG(A_price) > 5000 AND AVG(A_price) <= 10000 THEN 'price_group2'
            WHEN AVG(A_price) > 10000 AND AVG(A_price) <= 30000 THEN 'price_group3'
            WHEN AVG(A_price) > 30000  THEN 'price_group4'
            END "평균음식주문금액"
     , CASE WHEN AVG(A_age) < 30 THEN 'age_group1'
            WHEN AVG(A_age) BETWEEN 30 AND 39 THEN 'age_group2'
            WHEN AVG(A_age) BETWEEN 40 AND 49 THEN 'age_group3'
            ELSE 'age_group4'
            END "평균연령"
FROM
(
SELECT f.restaurant_name
     , AVG(f.price) A_price
     , AVG(c.age) A_age
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id 
GROUP BY 1
) a
GROUP BY 1
ORDER BY restaurant_name
-- 학습자료의 쿼리문

select restaurant_name,
       case when price <=5000 then 'price_group1'
            when price >5000 and price <=10000 then 'price_group2'
            when price >10000 and price <=30000 then 'price_group3'
            when price >30000 then 'price_group4' end price_group,
       case when age <30 then 'age_group1'
            when age between 31 and 39 then 'age_group2'
            when age between 40 and 49 then 'age_group3'
            else 'age_group4' end age_group
from
(
select a.restaurant_name,
       avg(price) price,
       avg(age) age
from food_orders a inner join customers b on a.customer_id=b.customer_id
group by 1
) t
order by 1

 

LEFT JOIN 을 사용 할 경우

메인쿼리에 GROUP BY 를 한번 더 해줘야 하는데

INNER JOIN 을 사용 할 경우에는

GROUP BY 를 한번 더 사용하지 않아도 정상적으로 출력한다.

 

 

 

Q. GROUP BY 를 하지 않았을 경우 1개의 행만 추출을 하는데 왜일까?

 

* LEFT JOIN 과 INNER JOIN 의 차이를 알아보았다.

 

강의 영상을 따라서 LEFT JOIN 을 할 경우 

SELECT f.restaurant_name
     , AVG(f.price) A_price
     , AVG(c.age) A_age
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id 
GROUP BY 1
ORDER BY 3

+

고객테이블의 NULL 값도 같이 추출이 되는데

 

 

 

INNER JOIN 을 할 경우

select a.restaurant_name,
       avg(price) price,
       avg(age) age
from food_orders a inner join customers b on a.customer_id=b.customer_id
GROUP BY 1
ORDER BY 3

+

주문이력과 고객테이블 모두 값이 있을 때 출력을 한다

 

 

 

+

'wichcraft' 음식점은 price 는 있으나 age 데이터는 입력되어 있지 않은 것으로 보인다

 

 

Q. 'wichcraft' 음식점은 어떤 정보를 가지고 있는가?

SELECT restaurant_name , price, age
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id 
WHERE restaurant_name = 'wichcraft'

 

A. 

고객테이블의 age 컬럼에는 데이터가 입력되어있지 않다.

 

Q. 해당 음식점 외에 다른 음식점들은 모두 정보를 가지고 있나?

* 주문이력에는 있고, 고객테이블에는 없는 데이터 값

SELECT f.customer_id , restaurant_name , price, age
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id 
WHERE c.customer_id IS NULL

+

23건 있음...

 

 

Q. 이 데이터 중에 왜 'wichcraft' 행만 출력이 되었는지?

Q. GROUP BY 를 하지 않았을 경우 1개의 행만 추출을 하는데 왜일까?

 

아직 위 2가지 질문은 해결되지 않았다.

해결되는데로 수정할 예정!