SQL (4)++

김재익·2023년 6월 14일
0
post-thumbnail

SUBSTRING_INDEX

조회한 값의 일부분을 기준으로 앞 또는 뒤의 내용을 보여준다.

ex)이메일에서 아이디부분
select user_id, email,
       SUBSTRING_INDEX(email, '@', 1) 
  from users
  
ex)이메일에서 주소부분
select user_id, email,
       SUBSTRING_INDEX(email, '@', -1)
  from users

SUBSTRING

조회한 값의 위치값을 입력해서 일부분만 볼 수 있다.

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

CASE

개발 언어의 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
profile
개발자호소인

0개의 댓글