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
- 사용예시 결과
▶ 조건을 사용할 수 있는 경우 알아보기
- 음식 타입과 같이 새로운 카테고리를 만들 수 있습니다.
- 한국 음식, 아시아 음식, 미국 음식, 유럽 음식 이런 식의 새로운 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 |