25.2.26 TIL

황효정·2025년 2월 26일

데이터 분석

목록 보기
7/88

sql 강의 3-7에서
[실습]- 지역과 배달시간을 기반으로 배달수수료 구하기 (식당 이름, 주문 번호 함께 출력)

(지역 : 서울, 기타 - 서울일 때는 수수료 계산 * 1.1, 기타일 때는 곱하는 값 없음
 시간 : 25분, 30분 - 25분 초과하면 음식 가격의 5%, 30분 초과하면 음식 가격의 10%)

라는 조건을 주었을 때 진짜로 어떻게 코드를 짜야하는지 어려웠다.
일단 내가 할 수 있었던 것은 테이블 파악하기. 이 실습문제에서의 테이블은 지역과 배달시간 및 음식 가격 이라는 조건이 있었기 때문에 food_orders라는 테이블에서 쿼리를 뽑아야 한다는 것을 바로 파악할 수 있었다. 꿀팁을 하나 써보자면, 디비버에서 from 문을 친 다음에 스페이스바를 누르면 그 테이블이 쫘라락 하고 나오기도 한다. 거기서 어떤 테이블에 어떤 값들이 있는지를 확인할 수도 있다.(요건 디비버 하면서 얻게된 팁)

그 다음으로는 사용해야 할 컬럼 파악하기: 친절하게 문제에 나와있듯이
지역=addr, 배달시간=delivery_time, 음식 가격=price를 사용해야 한다.

여기까지는 모든 문제에서 그렇듯 아주 쉽다. 이 다음이 문제임.
일단 조건이 2개인 점. 이것을 과연 어떻게 이어야 할 것인가. 가 내 궁금증이었음.
하다가 도저히 모르겠어서 강의를 이어서 수강하였다.-> 선생님이 하신 방법: 조건이 두개인데, 일단은 한 조건을 먼저 쓰고(ex. 시간 조건) 그 이후에 지역조건을 시간 조건 뒤에다가 붙여넣는 방식을 사용하셨다.

조금 더 자세하게 풀어보자면 먼저 문제 자체에서 파악하는 것
(지역과 배달시간을 기반으로)배달수수료를 구해라. 라고 했기 때문에 select 절에다가 이 배달수수료 수식을 적는다.(근데 이렇게 생각하는게 맞는거야? 튜터님께 질문을 해볼까,,?) 일단은 그래요 강의에서는 시간을 먼저 구했음. 보다가 아 그러면 한번 시간보다 지역을 case when 구문으로 먼저 써줘볼까? 라고 했는데, 왜 강사님이 시간은 나중에 덧붙였는지 깨닫게 되었다.-> 왜냐하면 지역에 주는 조건은 단 두개였음. 이 조건도 자세히 보면 '지역이 1.서울일 때는 수수료를 계산하고 2.서울 이외의 지역일 때는 계산하지 않는다.' 였기 때문에 사실 case when 구문보다는 생각을 해보면 if구문이 더 맞다는 것을 알 수 있음. if구문: if(조건, 조건을 충족할 때, 조건을 충족하지 않을 때)
그래서 다시 돌아오면 case when구문은 '시간' 조건에 주기 적절하다는 것임.

시간구문: (1.25분을 초과하면 음식가격의 5%, 2.30분을 초과하면 음식가격의 10%)이고, 텍스트로 적혀있지는 않지만 만약 25분 이하이면 아무런 초과 가격이 붙지 않는다는 것을 알수 있다.

so,, 실전에 적용해본다면
select case when delivery_time>30 then price0.1
when delivery_time>25 then price
0.05
else 0 end (as) '수수료'
from food_orders
이렇게 적어볼 수 있는 것이다. 여기서 주의할 점은 텍스트 조건의 순서대로 case when 구문의 첫번째 조건으로delivery_time>25 를 주면 안된다는 것인데, 이것은 case when 구문의 특징을 살펴보면 알 수 있다.

위에서부터 깔때기마냥 걸러져 내려오기 때문에 순서대로 적어야 한다는 것.
+그리고 저 구문에 해당하지 않는 나머지의 값이(ex.17)아무조건도 없다면 그냥 else0(숫자0)이라고 써주면 됨.(새로 알게 된 사실)

그리고오 다시 돌아와서
select case when delivery_time>30 then price0.1
when delivery_time>25 then price
0.05
else 0 end (as) '수수료'
from food_orders
이렇게 적은 것은 시간에 대한 조건이고, 여기다가 위에서 말했던 지역에 대한 if절 조건을 저 case when 구문에다가 덧붙이는 것이다.
select case when delivery_time>30 then price0.1if(addr like '%서울%, 1.1, 1(기타일 때는 곱하는 값 없음))
when delivery_time>25 then price0.05if(addr like '%서울%, 1.1, 1)
else 0 end (as) '수수료'
from food_orders
이렇게 적어주면 된다는 것이다. 완성 구문을 써보자면
select case when delivery_time>30 then price0.1if(addr like '%서울%, 1.1, 1)
when delivery_time>25 then price0.05if(addr like '%서울%, 1.1, 1)
else 0 end (as) '수수료'
, restaurant_name, order_id
from food_orders

이렇게 완성된다. 휴- 한 문제 하는데 시간이 많이 걸리는구만,,, 근데 어쨌든 내가 계속 진도 나가면서 뭔가 확실하지 않는 부분들에 있어서는 자꾸 뒤의 자료를 뒤지는 나의 모습을 발견하여 하나 배울 때 좀 확실하게 개념 정리할 부분들은 정리하고 가야겠다 싶었음.

<<라이브세션>>25.2.26
sql 테이블 결합:union함수, join함수

-union함수: 테이블 수직결합! union을 알아봅시다!

union의 결과는 두 개의 테이블이 수직결합된 형태이다.
두개 이상의 테이블도 결합이 가능하다.
union/union all 기본구조
컬럼 순서가 같고, 그 형식이 같아야 함

select 컬럼1, 컬럼2, 컬럼3..
from 테이블명1
union (all) #수직결합 명시
select 컬럼1, 컬럼2, 컬럼3..
from 테이블명2

-두 테이블에 중복되는 데이터가 있을땐?
경우에 따라서는 중복되는 데이터가 필요할 수도있고, 필요하지 않을 수도 있다.
union은 중복되는 데이터를 제거하여 하나의 결과값만을 output으로 반환한다.
반면, union all은 중복되는 데이터를 모두 표기해준다.

특히, UNION을 이용한 두 테이블 결합시 아래 두가지 조건을 모두 만족해야 함.
1. 열의 갯수순서모든 쿼리에서 동일해야 함.
2. 두 테이블의 컬럼 이름이 일치해야 함.
위 두 가지의 조건을 만족할 경우, union과 union all은 2개 이상의 테이블도 결합이 가능하다.

-join함수: 테이블 수평결합이다.
1.조인의 첫번째 단계: 공통컬럼 찾기
공통컬럼은 테이블과 테이블의 연결 고리로 작용한다.
공통컬럼 = 두 테이블에서 공통으로 존재하는 컬럼(열)
예제에서는 공통컬럼의 이름이 같았지만, 이름이 달라도 조인이 가능함.

공통컬럼이 없다면, 조인을 할 수 없음.
공통컬럼은 여러개도 가능하다.

  • JOIN 기본 구문
  • 공통컬럼이 1개인 경우

select 컬럼1, 컬럼2.
from 테이블 a
join # join의 종류는 아래에서 설명할 예정입니다.
select 컬럼1, 컬럼2..
from 테이블 b
on a.공통컬럼=b.공통컬럼


  • JOIN 기본 구문
  • 공통컬럼이 2개 이상인 경우

select 컬럼1, 컬럼2..
from 테이블 as a
join # join의 종류는 아래에서 설명할 예정입니다.
select 컬럼1, 컬럼2..
from 테이블 as b
on a.공통컬럼=b.공통컬럼 and a.공통컬럼2=b.공통컬럼2
(솔직히 이거 아직 완전히 이해 안됨. 복습 하고 직접 문제 풀어봐야 좀 감이 잡힐듯)

2.조인의 두번째 단계: 공통컬럼 관계찾기(pk와 fk찾기)
공통컬럼을 찾았다면 두번째로는 어떤 공통컬럼이 기준이 되고 어떤 공통컬럼이 종속되어있는지 파악해야 한다.
기준을 pk,종속컬럼을 fk 라고 명명함.
pk 무조건 1개이고 fk는 여러개가 있을 수 있음.
(pk,fk를 데이터 분석가가 설정하는 것은 아님. 데이터 수집/저장 단계에서 정해진 것을 데이터 분석가들은 관계를 잘 파악하는 것이 중요함.)

pk: 기본키라고 부르며,null일 수 없고, 유일한 값을 가짐
fk: 외래키라고 부르며, 다른 테이블의 pk와 연결되어 테이블 간관계를 나타내주는 컬럼
->이것을 erd라는 관계도를 통해서 확인이 가능하다.

  1. 조인의 세번째 단계: 적절한 조인 방식 찾기.
    조인종류는 여러가지 있긴 한데, inner join과 left join을 가장 많이 사용함. left join을 사용해서 right join값도 뽑을 수 있다고 함. 현업에서는 대부분 left join을 사용.
    inner join: 두 테이블에서 일치하는 값을 가진 행을 출력(교집합)
    left join: 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환.일치하는 항목이 없으면 오른쪽 테이블의 열에 대해 null값이 출력됨.
    right join: 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 해을 반환. 일치하는 항목이 없으면 왼쪽 테이블의 열에 대해 null값이 출력됨.
    full outer join: 모든 데이터를 보고 싶을 때 사용. 용량이슈로 자주 사용하지는 않음. mysql환경에서는 제공하지 않는다고 함.

<오늘의 일기>
오늘도 고생이 정말 많았다. 나자신아. 힘든 몸 이끌고 공부하느라 아주 고생이야. 근데 진짜 나 코로나는 아니겠지,,? 왜 몸이 조금 낫는듯하다가 또 아프고 *반복,, 약간 공부하고 잠깐 쉬고 공부하고 잠깐 쉬고 공부하고 잠깐 쉬고 반복..
그리고 컴터가 점점 더 느려지고 오늘은 켜지지를 않아서 솔직히 애간장이 탔다. 노트북을 하나 사야할 듯싶음.
암튼 오늘은 union과 join에 대해서 드디어 배웠는데 뭔가 어렵다. 시간이 갈수록 점점 더 어려운 개념들이 나와서 그 진도에 맞춰서 많이 연습해보고 해야 할 듯 싶다.
암튼 고생해따!!

profile
청지기

0개의 댓글