오늘은 다시 SQL을 학습하기로 했다.
시작은 간단한 복습 부터 !
마침 저번 강의 내용이 희미해져 가고있었다.
-
- 문자변경과 조건문
- REPLACE : 지정한 문자를 다른 문자로 변경
- SUBSTRING : 특정 문자만 추출
- CONCAT : 여러 문자를 합하여 포맷팅
- IF : if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
- 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의 경우 두 테이블 모두 데이터가 있는 경우만 조회한다.
'사전캠프' 카테고리의 다른 글
10일차 - [왕초보] 웹개발 종합반 (1) | 2024.07.02 |
---|---|
9일차 - [왕초보] 웹개발 종합반 (0) | 2024.07.01 |
7일차 - Javascript 톺아보기 (0) | 2024.06.27 |
6일차 - [왕초보] 웹개발 종합반 (0) | 2024.06.26 |
5일차 - 액셀보다 쉽고 빠른 SQL (0) | 2024.06.25 |