1. 문자열
- 문자열 데이터를 원하는 형태로 정리할 수 있다.
1) 사용법
(1) SUBSTRING_INDEX 문자열 쪼개기
예시 1 : 이메일 주소에서 @앞의 아이디만 가져온다
select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
- @ 를 기준으로, 텍스트(email)를 쪼개고, 그 중 첫 번째 조각(1)을 가져와라.
예시 2 : 이메일 주소에서 @뒤의 이메일 도메인을 가져온다
select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users
- @ 를 기준으로, 텍스트(email)를 쪼개고, 그 중 첫 번째 조각(-1)을 가져와라.
예시 3 : 이메일 도메인별 유저의 수 세어보기
select domain, count(*) as cnt from (
select SUBSTRING_INDEX(email,'@',-1) as domain from users
) a
group by domain
(2) SUBSTRING 문자열 일부만 출력하기
예시 1 : orders 테이블에서 날짜까지 출력
SUBSTRING(문자열, 출력을 하고싶은 첫 글자의 위치, 몇개의 글자를 출력하고 싶은지)
select order_no, created_at, substring(created_at,1,10) as date from orders
예시 2 : 일별로 몇 개씩 주문이 일어났는지
select substring(created_at,1,10) as date, count(*) as cnt_date from orders
group by date
예시 3 : 시간만 자르기
select created_at, substring(created_at,12,8) from orders
2. Case
1) 사용법
예시 1 : 포인트 보유액에 따라 다르게 표시
select pu.point_user_id, pu.point,
(case when pu.point > 10000 then '잘 하고 있어요!'
else '조금 더 달려주세요!' end) as '구분'
from point_users pu;
예시 2 : 2개의 when
select pu.point_user_id, pu.point,
(case when pu.point >= 10000 then '1만 이상'
when pu.point >= 5000 then '5천 이상'
else '5천 미만' end) as level
from point_users pu
예시 3 : case(2개의 when) + group by
select level, count(*) as cnt from (
select pu.point_user_id, pu.point,
(case when pu.point >= 10000 then '1만 이상'
when pu.point >= 5000 then '5천 이상'
else '5천 미만' end) as level
from point_users pu
) a
group by level
예시 4 : case(2개의 when) + group by + with
with table1 as (
select pu.point_user_id, pu.point,
(case when pu.point >= 10000 then '1만 이상'
when pu.point >= 5000 then '5천 이상'
else '5천 미만' end) as level
from point_users pu
)
select a.level, count(*) as cnt from table1 a
group by a.level
예시 5 : case + avg - 평균 이상 포인트를 가지고 있으면 '잘 하고 있어요' / 낮으면 '열심히 합시다!' 표시
select pu.point_user_id, pu.point,
(case when pu.point > (select avg(pu2.point) from point_users pu2) then '잘 하고 있어요!'
else '열심히 합시다!' end) as 'msg'
from point_users pu
- (select avg(pu2.point) from point_users pu2)
- 5000 대신에 들어간다
- () 괄호를 쳐줘야 한다.