🎯 목표
MySQL에서 지원하는 제어문 ‘CASE’, ‘IF’를 사용하여 데이터를 변환하여 불러온다.

1. 제어문

제어문은 순차적으로 흐름을 제어해야할 때 사용하는 명령어로 ‘조건문’, ‘반복문’ 등이 포함된다. 주로 임의의 조건에 따라 데이터를 변환하고자 할 때 CASE 문과 IF 문이 사용된다.

(1) CASE 문

CASE 는 하나 이상의 조건식에 대해 다른 결과를 출력하고자 할 때 사용할 수 있다. 만약 학생의 시험성적을 기준으로 등급을 나눌 때 유용하게 사용할 수 있다. CASE 문에는 ‘WHEN 조건 THEN 결과’가 포함되며 조건을 만족하면 결과가 출력되는 구조이다.

📍 기본 구조

CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ELSE result3 -- 생략가능(생략시, ELSE NULL로 간주됨)
END

CASE 문은 보통 SELECT 구에서 사용되며 기본 구조는 위와 같다. CASE문의 장점은 하나 이상의 조건에 따라 데이터를 변환할 수 있다는 점이다.(IF 문은 하나의 조건식에 의해 데이터가 변환됨)
cf. WHERE, ORDER BY 절에서도 사용할 수 있음

  • CASE 문은 마지막에 꼭 END 로 종료해주어야 한다.
  • WHEN과 THEN은 쌍으로 구성되어야 한다.
  • ELSE를 생략해도 되지만, 상정한 것 이외의 데이터가 존재할 때 NULL로 변환되기 때문에 생략하지 않고 지정하는 것이 좋다.

📍 예시로 이해하기

예시를 위해 Workbench에 ‘Students’ 테이블을 생성하였다. 생성한 테이블은 학생의 아이디, 이름, 학년, 수학점수가 포함되어있다.
cf. 테이블을 생성할 때 작성한 쿼리는 하단의 댓글창에 기록해 두었다.

Fig 1. Students 테이블


위 테이블을 보면 학생들의 시험성적이 담겨있는 것을 알 수 있다. 해당 학교는 시험 성적을 절대 평가를 기준으로 등급을 나눈다. 절대 평가 기준에 따른 등급은 아래와 같다.

  • A: 90점 이상
  • B: 80점 이상 90점 미만
  • C: 70점 이상 80점 미만
  • D: 60점 이상 70점 미만
  • E: 50점 이상 60점 미만
  • F: 50점 미만

위 조건을 이용해서 학생의 점수별 등급을 매겨본다. CASE문을 이용해서 등급을 매길 때 사용한 쿼리는 아래와 같다.(등급이 담긴 컬럼은 test_grade라는 별칭을 지어주었다.)

SELECT *,
       CASE
         WHEN score >= 90 THEN 'A'
         WHEN score >= 80 THEN 'B'
         WHEN score >= 70 THEN 'C'
         WHEN score >= 60 THEN 'D'
         WHEN score >= 50 THEN 'E' 
         ELSE 'F'
       END AS test_grade
FROM test.Students
Fig 2. 위 쿼리의 실행 결과


결과를 보면 여러 조건별로 조건에 맞는 결과가 잘 들어간 것을 볼 수 있다. CASE 문에는 여러 WHEN - THEN 쌍이 존재할 수 있는데, 위에서부터 순서대로 실행된다. 그래서 ‘90점 이상’에 만족하지 않으면 다음 조건식인 ‘80점 이상’로 이동하게 되는 논리이다. 하나의 WHEN THEN 쌍을 작성해도 CASE 문은 정상적으로 실행된다. 하지만 조건식이 하나일 경우 IF 문을 사용하면 깔끔하게 한줄로 표현이 가능하다.

(2) IF 문

IF 문은 이전의 CASE 문과는 다르게 하나의 조건식만 설정할 수 있다. 그래서 상황에 맞게 IF, CASE문을 선택해서 사용해야한다. 또한 IF 문은 함수로 ()안에 인수를 전달하여 조건에 따라 데이터를 변환한다.

📍 기본 구조

IF(condition, result1, result2)

IF 함수는 첫 번째 인수(조건)가 만족하면 result1를 반환하고, 만족하지 않으면 result2를 반환한다. 만약 하나의 조건을 기준으로 데이터를 변환한다면 IF문을 사용할 수 있다.

📍 예시로 이해하기

Students 테이블을 이용해서 시험 성적이 안좋은 학생을 대상으로 방과후 수업을 열려고 한다. 보충 수업을 들을 대상은 시험 점수가 40점 미만인 학생이다. 보충 수업 여부에 따라 ‘Y’, ‘N’로 표현해 보겠다.

SELECT *,
       IF(score < 40, 'Y', 'N') AS 'make-up class'
FROM test.Students
Fig 3. 위 쿼리의 실행 결과


IF 문으로 학생별로 보충수업 대상 여부를 ‘make-up class’ 컬럼으로 불러왔다. 특정 조건에 따라 데이터를 변환해서 가져와야할 땐 상황에 맞는 구문을 불러와서 쓰면 된다.


2. Reference

👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

태그: ,

카테고리:

업데이트:

댓글남기기