조회한 값의 일부분을 기준으로 앞 또는 뒤의 내용을 보여준다.
ex)이메일에서 아이디부분
select user_id, email,
SUBSTRING_INDEX(email, '@', 1)
from users
ex)이메일에서 주소부분
select user_id, email,
SUBSTRING_INDEX(email, '@', -1)
from users
조회한 값의 위치값을 입력해서 일부분만 볼 수 있다.
ex) 주문번호와 날짜 조회( 날짜는 년월일만 )
SELECT order_no,
SUBSTRING(created_at, 1, 10) as date
FROM orders o
개발언어와 다르게 위치는 1부터 시작한다.
응용하면 아래 처럼 사용할 수 있다.
ex) 일별 주문량 조회
SELECT SUBSTRING(created_at, 1, 10) as date,
COUNT(*)
FROM orders o
group by date
개발 언어의 IF ELSE 문법과 동일하다
CASE를 끝내는 END를 반드시 적어야한다.
SELECT pu.user_id, pu.`point`,
(case when pu.`point` > 10000 then '잘 하고 있어요!'
else '조금만 더 파이팅!' end) as msg
FROM point_users pu;
SELECT pu.user_id, pu.`point`,
(case when pu.`point` > 10000 then '1만 이상'
when pu.`point` > 5000 then '5천 이상'
else '5천 미만' end) as Lv
FROM point_users pu;
GROUP BY를 활용해 통계를 내는 응용
SELECT pu.user_id, pu.`point`,
(case when pu.`point` > 10000 then '1만 이상'
when pu.`point` > 5000 then '5천 이상'
else '5천 미만' end) as lv
FROM point_users pu
) a
GROUP BY a.lv;
WITH를 활용해 이해하기 수월하게 작성
with table1 as (
SELECT pu.user_id, pu.`point`,
(case when pu.`point` > 10000 then '1만 이상'
when pu.`point` > 5000 then '5천 이상'
else '5천 미만' end) as lv
FROM point_users pu
)
select a.lv, COUNT(*) as cnt from table1 a
group by a.lv