데이터분석 study/SQL

TIL(Today I Learned) 24.06.25

justdata 2024. 6. 25. 23:00

SQL 기초 강의 3주차

 - 조건에 따라서 포맷을 변경해야 한다면 (IF, CASE)

-> group by처럼 조건도 카테고리별로 줄 수 있을까?

 

▶ 조건에 따라 다른 방법을 적용하고 싶을 때 가장 기초 문법은 'if 문'

 

  • 함수명 : if
  • 사용 방법
if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)

 

  • if문 예시 
select restaurant_name,
       cuisine_type "원래 음식 타입",
       if(cuisine_type='Korean', '한식', '기타') "음식 타입"
from food_orders

 

 

▶ 조건에 따라 여러가지 지정하고 싶을 때 - case 문 

- 조건을 지정하다 보면, 두 개 이상 지정을 해야 할 경우가 생깁니다.

- 조건별로 지정을 해주기 때문에 if문을 여러번 쓴 효과를 낼 수 있다.

 

  • 함수명 : case
  • 사용방법
case when 조건1 then 값(수식)1
     when 조건2 then 값(수식)2
     else 값(수식)3
end

 

  • 사용예시
select restaurant_name,
       addr,
       case when addr like '%경기도%' then '경기도'
            when addr like '%특별%' or addr like '%광역%' then substring(addr, 1, 5)
            else substring(addr, 1, 2) end "변경된 주소"
from food_orders

 

  • 사용예시 결과

case when 문 사용예시 결과

 

 

▶ 조건을 사용할 수 있는 경우 알아보기 

  • 음식 타입과 같이 새로운 카테고리를 만들 수 있습니다.
    • 한국 음식, 아시아 음식, 미국 음식, 유럽 음식 이런 식의 새로운 cuisine_category 를 생성할 수 있죠
  • 고객들의 분류도 만들 수 있습니다.
    • 10대 여성, 10대 남성, 20대 여성, 20대 남성 등, 이런 식의 성별과 나이별로 새로운 고객 군 카테고리를 생성할 수 있습니다.
  • 연산식을 적용할 조건 지정하기

수수료를 계산할 때 흔히들 현금 사용, 카드사용을 나누고는 합니다.

    • 현금일 때의 수수료율과 카드일 때의 수수료율이 다르다면, 연산식을 만들 때 if 문 혹은 case 문으로 각각 다른 수수료율 혹은 수수료 계산 방식을 적용할 수 있습니다
  • 다른 문법 안에서 적용하기
    • if, case 문 안에 다른 문법이나 연산을 넣을 수도 있지만, 다른 문법 안에 조건문을 넣을 수도 있습니다
    • 예를 들어 concat 문으로 여러 컬럼을 합칠 때, rating 이 있을 때는 rating 을 넣어주고 없을 때는 아무것도 넣지 않도록, concat 안에 if 문을 넣어줄 수 있습니다. 

 

SQL 4주차 강의

- 여러 번의 연산을 한 번의 SQL 문으로 수행하기 (Subquery)

- subquery 가 필요한 경우

  • 여러번의 연산을 수행해야 할 때
  • 조건문에 연산결과를 사용해야 할 때 
  • 조건에 query 결과를 사용하고 싶을 때 

- subquery문의 기본 구조

select column1, special_column
from
    ( /* subquery */
    select column1, column2 special_column
    from table1
    ) a

 

- subquery문 예시( 음식 주문시간이 25분보다 초과한 시간을 가져오기 )

select order_id, restaurant_name, if(over_time>=0, over_time, 0) over_time
from 
(
select order_id, restaurant_name, food_preparation_time-25 over_time
from food_orders
) a

 

 

- 필요한 데이터가 서로 다른 테이블에 있을 때 조회하기 (JOIN)

  • JOIN 의 종류

 

LEFT JOIN : 공통 컬럼 (키값) 을 기준으로, 하나의 테이블에 값이 없더라도 모두 조회되는 경우를 의미합니다. 

INNER JOIN : 공통 컬럼 (키값) 을 기준으로, 두 테이블 모두에 있는 값만 조회합니다.

 

- JOIN 의 기본 구조

 

-- LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명

-- INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명

 

*** 여기서 만약 값에 null 값이 있어서 null 값을 제거 하고 싶다면 ? 

- where 문에 is not null 

- 예시

select distinct c.name,
       c.age,
       c.gender,
       f.restaurant_name
from food_orders f left join customers c on f.customer_id=c.customer_id
where c.name is not null // null 값 제거
order by c.name

 

 

SQL 5주차 강의

- 조회한 데이터에 아무 값이 없다면 ?

  • 테이블에 잘못된 값이 들어 있을 수 있고, JOIN 했을 때 값이 없는 경우도 있을 수 있다.

- [방법 1] 없는 값을 제외해주기

  • Mysql 에서는 사용할 수 없는 값일 때 해당 값을 연산에서 제외해줍니다. → 0으로 간주
  • 아니면, 명확하게 연산을 지정해주어야 한다. 만약 null값을 제외 해준다면 where 문의 is not null
select a.order_id,
       a.customer_id,
       a.restaurant_name,
       a.price,
       b.name,
       b.age,
       b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
where b.customer_id is not null

 

- [방법 2] 다른 값을 대신 사용하기

  • 데이터 분석 시에는 평균값 혹은 중앙값 등 대표값을 이용하여 대체해주기도 합니다.다른 값으로 변경하고 싶을 때, 다음 두 개의 문법을 이용할 수 있습니다.
    • 다른 값이 있을 때 조건문 이용하기 : if(rating>=1, rating, 대체값)
    • null 값일 때 : coalesce(age, 대체값)
    • null 을 다른 값으로 대체한 쿼리문 실행 예시 
select a.order_id,
       a.customer_id,
       a.restaurant_name,
       a.price,
       b.name,
       b.age,
       coalesce(b.age, 20) "null 제거",
       b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
where b.age is null

 

 

 

- 조회한 데이터가 상식적이지 않은 값을 가지고 있다면

- [방법] 조건문으로 값의 범위를 지정하기

  • 조건문으로 가장 큰 값, 가장 작은 값의 범위를 지정해 줄 수 있습니다. → 상식적인 수준 안에서 범위를 지정해줍니다.
select customer_id, name, email, gendor, age,
       case when age<15 then 15
            when age>80 then 80
            else age end "범위를 지정해준 age"
from customers

 

 

*** 몰랐다가 새롭게 알게된 내용 추가

 - HAVING
HAVING은 간단하게 생각해서 GROUP BY한 결과에 조건을 붙이고 싶을때, 

즉 GROUP BY의 WHERE 절과도 같다고 볼 수 있습니다.

 

- dbeaver에서 서브쿼리 사용시 안에 있는 구문에 계산 결과만 보고 싶을 때는 

   "()"안에 보고싶은 구문을 선택한 다음에 실행을 하면 된다

- 서브쿼리문에 테이블 별칭을 select 문에서 생략해도 상관없다

'데이터분석 study > SQL' 카테고리의 다른 글

TIL_24.07.12_다중 테이블 left join  (0) 2024.07.12
TIL_24.07.11_join 과 using  (0) 2024.07.11
TIL(Today I Learned) 24.07.01  (0) 2024.07.01
TIL(Today I Learned) 24.06.24  (0) 2024.06.28
TIL(Today I Learned) 24.06.26  (0) 2024.06.26