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
![](https://velog.velcdn.com/images/baekgom/post/be68e572-03b8-41bb-8798-2bb9b49f0c2b/image.png)
(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
![](https://velog.velcdn.com/images/baekgom/post/f0e7b424-2902-46b8-8550-2006832573fc/image.png)
2. Case
1) 사용법
예시 1 : 포인트 보유액에 따라 다르게 표시
select pu.point_user_id, pu.point,
(case when pu.point > 10000 then '잘 하고 있어요!'
else '조금 더 달려주세요!' end) as '구분'
from point_users pu;
![](https://velog.velcdn.com/images/baekgom/post/a41a8171-1f76-451b-b004-078ce65f0732/image.png)
예시 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
![](https://velog.velcdn.com/images/baekgom/post/ab346efa-7009-4b47-b8bb-a2a23fa4b4bf/image.png)
예시 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
![](https://velog.velcdn.com/images/baekgom/post/e6b43e27-b771-4ba7-b863-e37bca12d299/image.png)
예시 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 대신에 들어간다
- () 괄호를 쳐줘야 한다.
![](https://velog.velcdn.com/images/baekgom/post/f85982ba-f0ae-417b-a4d4-d7d65cdae5e3/image.png)