select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users u
# SUBSTRING_INDEX문은 문자열을 쪼개준다
# @를 기준으로 이메일을 쪼갰을 때, 1번째는 이메일 아이디이고, 2번째는 도메인 주소가 될 것이다
# 숫자가 1이면 1번째, -1이면 마지막 것을 보여준다
SELECT order_no, SUBSTRING(created_at, 1, 10) as date from orders o
# 위의 코드는 문자열의 일부만 잘라내는 기능이다
# created_at에서 1번 자리를 기준으로 10자리까지의 데이터를 잘라서 보여달라는 뜻이다
SELECT order_no, SUBSTRING(created_at, 1, 10) as date, count(*) from orders o
group by date
# 다음과 같이 수정하며, orders에서 주문이 몇 건 있었는지 같은 기능도 추가할 수 있다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
SELECT pu.user_id, pu.point,
(case when pu.point > 10000 then '잘 하고 있어요!'
else '조금만 더 파이팅!' end) as msg
from point_users pu
# Case : 경우에 따라 원하는 값을 새 필드에 출력하기
# pu.point가 10000보다 크면 '잘 하고 있어요!', 그렇지 않으면 '조금만 더 파이팅!'이라는 결과값을 내고 끝내라는 코드
SELECT pu.user_id, pu.point,
(case when pu.point > 10000 then '1만 이상'
when pu.point > 5000 then '5천 이상'
else '5천 미만' end) as msg
from point_users pu
# Subquery를 이용하면 Case문을 가지고도 통계를 낼 수 있다! 위는 예시 코드이다
select a.lv, count(*) as cnt from (
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 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
# with절을 이용하여 table1이라는 값으로 정의한 후, 보기 좋게 사용할 수도 있다
'SQL' 카테고리의 다른 글
[SQL] 초급 문법 정리 (0) | 2022.11.06 |
---|---|
[SQL] Substring, Case 연습 (0) | 2022.11.06 |
[SQL] Subquery from절 연습, with절 (0) | 2022.11.06 |
[SQL] Subquery where, select절 연습 (0) | 2022.11.06 |
[SQL] Subquery (0) | 2022.11.05 |