개발자는 기록이 답이다

실전 SQL 문법 : 문자열쪼개기와 CASE문, IF문 본문

Database

실전 SQL 문법 : 문자열쪼개기와 CASE문, IF문

slow-walker 2023. 10. 6. 12:47

2023.10.06 - [SQL] - Subquery의 select, where, from 절 비교 예제, With절 예제

 

Subquery의 select, where, from 절 비교 예제, With절 예제

1. Subquery란 무엇인가? 쿼리문 안에 들어가 있는 쿼리를 subquery라고 합니다. 예를 들어, users테이블과 orders테이블이 있다고 가정합시다. 2개의 테이블을 이용해서 kakaopay로 결제한 유저들의 정보

strong-park.tistory.com

1. 문자열

 

1) SUBSTRING_INDEX() : 문자열 쪼개보기

SUBSTRING_INDEX(string, delimiter, count)

--

string: 원본 문자열입니다.
delimiter: 구분자입니다. 문자열을 나눌 때 사용됩니다.
count: 구분자를 기준으로 몇 번째 나눌 것인지를 나타내는 정수입니다.
SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', 2); -- 'apple,banana'
SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', -1); -- 'cherry'

이메일 주소에서 @앞의 아이디만 가져오거나, @뒤의 이메일 도메인을 가져오고 싶어요!

select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users -- @앞쪽에있는 이메일만
select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users --@뒤쪽에있는 도메일만

 

2) SUBSTR(), SUBSTRING() : 문자열 일부만 출력하기

SUBSTR(string, start, length)

--

string: 원본 문자열입니다.
start: 추출을 시작할 위치를 나타내는 정수입니다. 첫 번째 문자는 1로 시작합니다.
length (선택 사항): 추출할 문자의 길이입니다. 이 파라미터를 생략하면 start 위치부터 문자열 끝까지 추출됩니다.
SELECT SUBSTR('Hello, World!', 1, 5); -- 'Hello'
SELECT SUBSTR('Hello, World!', 8);    -- 'World!'

DATETIME데이터에서 날짜랑 시간을 구분해서 가져오고 싶어요!

SELECT SUBSTR(DATETIME,1,10) AS DATE, SUBSTR(DATETIME,11,7) AS TIME
FROM ANIMAL_INS;

[예제] 일별로 몇 개씩 주문이 일어났는지 살펴보기

select substring(created_at,1,10) as date, count(*) as cnt_date 
from orders
group by date

 

 

2. 조건부 로직

 

1) CASE WHEN THEN ELSE END : 조건부로 값을 선택하고 반환하려는 경우에 사용

여러 조건에 대한 처리를 구조적으로 표현하는 데 더 적합합니다.

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN
END

--

condition1, condition2, ...: 조건이며, 참인 경우 해당 결과가 선택됩니다.
result1, result2, ...: 조건에 따라 선택된 결과 값입니다.
ELSE resultN: 모든 조건이 거짓인 경우 선택되는 기본값입니다
-- score 값에 따라 학점을 부여하는 경우
SELECT
    CASE
        WHEN score >= 90 THEN 'A'
        WHEN score >= 80 THEN 'B'
        WHEN score >= 70 THEN 'C'
        ELSE 'F'
    END AS grade
FROM students;

10000점보다 높은 포인트를 가지고 있으면 '잘 하고 있어요!', 낮으면 '조금 더 달려주세요!' 라고 표시해보세요!

select pu.point_user_id, pu.point,
	  (case 
	  when pu.point > 10000 then '잘 하고 있어요!'
	  else '조금 더 달려주세요!'
      END) as msg
from point_users pu;

 

2) IF() : 조건을 평가하고 결과 값을 선택하는 데 사용

간단한 조건에 따라 값을 선택하는 데 유용합니다.

IF(condition, true_value, false_value)

--

condition: 조건이며, 참 또는 거짓을 평가하는 데 사용됩니다.
true_value: 조건이 참일 때 선택되는 값입니다.
false_value: 조건이 거짓일 때 선택되는 값입니다.
SELECT
    IF(score >= 90, 'A',
       IF(score >= 80, 'B',
          IF(score >= 70, 'C', 'F'))) AS grade
FROM students;

 


 

👉 [실습예제1-1] 포인트를 구분지어서 출력해보겠습니다

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

👉 [실습예제1-2] 포인트대를 나눈 구분별로 통계를 내주세요!

select pu.point, 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

👉 [실습예제1-3] 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 pu.point, count(*) as cnt
from table1 a 
group by level

 

 

👉 [실습예제2-1] 평균 이상 포인트를 가지고 있으면 '잘 하고 있어요' / 낮으면 '열심히 합시다!' 표시하기!

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

👉 [실습예제3-1] 이메일 도메인별 유저의 수 세어보기

select domain, count(*) as cnt from (
	select SUBSTRING_INDEX(email,'@',-1) as domain from users
) a
group by domain