<아티클 스터디>
- 데이터를 분석하여 문제를 해결하는 것도 좋지만 그 결과가 잘못되진 않았는지에 대해 다시 생각해볼 필요가 있다. 누구나 어떤 문제를 직면할때, 최대한 빠르게 해결하고 싶을 것 같다. 이러한 생각과 연관짓는 것을 잘하는 사람의 강점을 합쳤을 때, 성급한 일반화의 오류가 발생한다고 생각한다.
그러니 현재 하고 있는 데이터 분석 과정을 객관적으로 잘 파악하며 다양한 오류들을 범하고 있는것은 아닌지 왜 그런 결과가 나온것인지 더블체크를 할 필요가 있다.
+그 데이터는 잘못 해석되었습니다.
<오늘 배운 것 요약>
- SQL 4주차
여러 번의 연산을 한 번의 SQL문으로 수행 (Subquery)
1. Subquery가 필요한 경우
- 여러번의 연산을 수행해야 할 때
- 조건문에 연산 결과를 사용해야 할 때
- 조건에 Query 결과를 사용하고 싶을 때
2. 기본 구조 query1 ( query2 )
select column1, "컬럼2"
from
(
select column1, column2 "컬럼2"
from table1
) a
3. 예시
예) 주문 테이블에서 음식점명, 가격, 주소 가져오기
select restaurant_name,
price,
addr
from
(
select restaurant_name,
price,
addr
from food_orders
) a 필요한 데이터가 서로 다른 테이블에 있을때 (JOIN)
1. Join 이 필요한 경우
- 주문 가격 (주문테이블)/ 결제 수단(결제테이블)
- 주문한 사람(주문 + 고객 테이블)
2. 기본 원리, 종류
원리: 엑셀의 VLOOKUP과 유사
JOIN의 종류
1. ~1 1 LEFT JOIN ~2 2 on 1.same_column=2.same_column
; 둘 중 하나만 있어도 모두 조회
기본 구조
select 조회 할 컬럼
from 테이블1 1 left join 테이블2 2 on 1.공통컬럼명=2.공통컬럼명
2. ~1 1 INNER JOIN ~2 2 on 1.same_column=2.same_column
; 둘 다 있어야 조회 = 둘 중 하나만 있는건 조회 안됨
기본 구조
select 조회 할 컬럼
from 테이블1 1 inner join 테이블2 2 on 1.공통컬럼명=2.공통컬럼명
이때 '공통 값'을 묶는 것이기에 컬럼명은 달라도 괜찮음!
- 예시
주문 테이블과 결제 테이블을 order_id를 기준으로 inner_join으로 묶어보기
(조회 컬럼: order_id, restaurant_name, price, pay_type, vat)
select f.order_id,
f.restaurant_name,
f.price,
p.pay_type
p.vat
from food_orders f inner join payments p on f.order_id=p.order_id
- 4주차 숙제
문제: 식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기
<지시사항>
1. 평균 음식 주문 금액 기준 : 5,000 / 10,000 / 20,000 / 30,000 초과
2. 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상
3. 두 테이블 모두에 데이터가 있는 경우만 조회, 식당 이름 순으로 오름차순 정렬
select a.restaurant_name,
case when avg_price>=30000 then '3만원 초과'
when avg_price>=20000 then '2만원'
when avg_price>=10000 then '1만원'
when avg_price<=5000 then '5천원' end 금액대,
case when avg_age>=50 then '50대 이상'
when avg_age>=40 then '40대'
when avg_age>=30 then '30대'
else '~20대' end 나이대
from
(
select f.restaurant_name,
avg(price) avg_price,
avg(age) avg_age
from food_orders f inner join customers c on f.customer_id=c.customer_id
group by 1
) a
order by 1