오늘은 다시 SQL을 학습하기로 했다.

 

시작은 간단한 복습 부터 !

마침 저번 강의 내용이 희미해져 가고있었다.

 

    1. 문자변경과 조건문
    👉 문자 변경
    1. REPLACE : 지정한 문자를 다른 문자로 변경
    2. SUBSTRING : 특정 문자만 추출
    3. CONCAT : 여러 문자를 합하여 포맷팅
    👉 조건문
    1. IF : if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
    2. CASE WHEN END : case when 조건1 then 값(수식)1
                                                when 조건2 then 값(수식)2
                                                else 값(수식)3 end

 

오늘 학습 내용

  • Subquery 를 활용하여 복잡한 연산을 수행한다
  • Join 을 활용하여 여러개의 테이블에 있는 데이터를 한 번에 조회하고 연산한다

Subquery 는 한 번에 하기 힘든 여러 연산을 차근 차근 풀어서 쓸 때 사용한다고 이해했다.

컬럼의 평균값(AVG) 을 구한다음에 조건에 따라 해당 평균값에 추가로 연산해야 하는 경우 라던지, 

조건 자체를 연산의 결과로 하고 싶을 때 사용한다.

select restaurant_name,
       case when sum_of_quantity<=5 then 0.1
            when sum_of_quantity>15 and sum_of_price>=300000 then 0.005
            else 0.01 end ratio_of_add
from 
(
select restaurant_name,
       sum(quantity) sum_of_quantity,
       sum(price) sum_of_price
from food_orders
group by 1
) a

 

이 경우는,

restaurant_name 별로 quantity의 합, price의 합계를 먼저 구한다음

Subquery를 활용하여 추가로 합계된 값을 조건에 따라 case 로 나눠 표시해주도록 한 내용이다.

 

꽤 복잡하고 실습 과정에서 생각을 정리하는 시간이 길어졌다.

이해는 됐지만 정리가 제대로 안되었기 때문인데,

우선도를 파악하는 것이 중요했다.

 

제시된 문제에 따라 가장 먼저 mainquery에 기재할 내용과 이후 subquery 를 통해 마무리할 최종결과값을 나누어 생각해야한다.

그렇기 때문에, subquery를 잘 활용하기 위해선 문법보다는 우선 문제 자체를 해석하는 능력이 중요하다.

식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기
- 평균 음식 주문 금액 기준 : 5,000 / 10,000 / 30,000 / 30,000 초과
- 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상

 

위 문제를 보고 나는 10분 가량은 아무것도 할 수 없었다. 

문제 자체를 이해를 못했기 때문이다...

(문제가 다소 불친절한 감도 있지만)

 

어디서 부터 시작해야 하지? 

식당별 이니까, restaurant_name 을 group by 해야하고,

평균 음식 주문 금액은 avg(price), 평균 연령은 avg(age) 로 구해놓고 subquery 로 넘어간다.

subquery 에서 나머지 조건에 해당하는 부분을 case when 구문으로 나누어 표시되도록 하면 끝 !

SELECT restaurant_name,
	   avg_price,
	   avg_age,
		case when avg_price <= 5000  then 'price_group1' 
	        when avg_price  >  5000 and avg_price <= 10000 then 'price_group2'
	        when avg_price  > 10000 and avg_price <= 30000 then 'price group3'
	        when avg_price  > 30000 then 'price group4' end 'price group',
	    case when avg_age < 30 then 'age_group1'
	         when avg_age >= 30 and avg_age < 40 then 'age_group2'
	         when avg_age >= 40 and avg_age < 50 then 'age_group3'
	         else 'age_group4' end 'age group'
FROM
(
SELECT f.restaurant_name ,
	   f.price,
	   c.age,
	   AVG(f.price) avg_price ,
	   avg(c.age) avg_age
from food_orders f inner join customers c on f.customer_id =c.customer_id
group by 1
order by 1
) T

위와 같이 풀이 해 보았다. 잘 작동하는 듯 하다.



추가로, 
Join  에 대해서도 학습했는데, 

한 테이블 내에서가 아닌, 여러 테이블에서 데이터를 가져와야 하는 경우 사용한다.

 

따라서 테이블을 불러오는 From 뒤에 사용되며, 

from food_orders a left join customers b on a.customer_id=b.customer_id

위와 같이 From 메인 테이블 left join 불러올 테이블 on 메인 테이블.기준컬럼 = 불러울테이블.기준컬럼 

이라고 할 수 있다.

기억해야할 점은 두 테이블에 공통된 데이터가 있어야 한다는 것이다.

당연히, 기준도 없이 아무 테이블이나 마구잡이로 합칠 수 없다는 것

추가로
Left join의 경우 테이블에 빈 데이터가 있는 경우에 공백으로 불러오며

Inner join의 경우 두 테이블 모두 데이터가 있는 경우만 조회한다.

 

+ Recent posts