CASE WHEN 이란?
CASE WHEN은 함수가 아닌 SQL 구문이다. 프로그래밍 언에서 제공하는 SWTICH 구문과 같은 역할을 한다. CASE로 시작하고 END로 끝나야 하며, WHEN ... THEN ... 은 필요한 만큼 반복해서 사용할 수 있다.
CASE
WHEN 조건
THEN '반환 값'
WHEN 조건
THEN '반환 값'
ELSE 'WHEN 조건에 해당 안되는 경우 반환 값'
END
동등 연산자(=)로 비교할 수 있을 때 비교하고자 하는 컬럼이나 표현식을 CASE와 WHEN 키워드 사이에 두고, 비교 기준값을 WHEN 뒤에 입력해서 사용하는 방식이다.
CASE WHEN 구문에서 한 가지 중요한 사실은 CASE WHEN 절이 일치하는 경우에만 THEN 이하의 표현식이 실행된다는 점이다.
CASE WHEN절에서 서브쿼리를 사용해야하는 상황
아래 쿼리를 보자. 부서번호 d001에 소속된 적이 있는 모든 사원의 가장 최근 급여를 조회하는 쿼리이다. 해당 쿼리는 2만여 건의 레코드를 조회하는데, 급여 테이블을 조회하는 서브쿼리도 이 레코드 건수만큼 실행된다.
SELECT de.dept_no, e.first_name, e.gender,
(SELECT s.salary FROM salaries s
WHERE s.emp_no = e.emp_no
ORDER BY from_date DESC LIMIT 1) AS last_salary
FROM dept_emp de, employees e
WHERE e.emp_no = de.emp_no
AND de.dept_no = 'd001';
만약, 성별이 여자인 경우에만 최종 급여 정보가 필요하고, 남자이면 그냥 이름만 필요한 경우를 한번 생각해보자. 위 쿼리를 그대로 사용해서 남자일 때는 가져온 last_salary 컬럼을 그냥 버리면된다.
하지만, 남자일 경우 salaries 테이블을 조회할 필요가 없는데, 서브쿼리를 실행하므로 불필요한 작업을 하는 것이다. 이런 경우 CASE WHEN으로 서브쿼리를 감싸면 필요한 경우에만 서브쿼리를 실행할 수 있다.
SELECT de.dept_no, e.first_name, e.gender,
CASE WHEN e.gender = 'F' THEN
(SELECT s.salary FROM salaries s
WHERE s.emp_no = e.emp_no
ORDER BY from_date DESC LIMIT 1)
ELSE 0 END AS last_salary
FROM dept_emp de, employees e
WHERE e.emp_no = de.emp_no
AND de.dept_no = 'd001';
따라서, 서브쿼리의 실행 횟수를 줄임으로써 쿼리를 최적화 할 수 있다.
참고: Real MySQL 8.0
'DataBase' 카테고리의 다른 글
[MySQL] WHERE 절 / 칼럼의 값을 변경했을 때의 인덱스 적용 / 비교 대상의 데이터 타입 (0) | 2023.04.19 |
---|---|
[MySQL] 처리 대기(SLEEP)와 벤치마크(BENCHMARK) (0) | 2023.04.11 |
[MySQL] BETWEEN 연산자를 활용한 쿼리 최적화 (0) | 2023.04.11 |
[MySQL] LIKE 연산자를 활용한 쿼리 최적화 (0) | 2023.04.07 |
[H2 DB] insert시 auto increment인 sequence 값을 바로 받아 오는 법 (0) | 2023.03.28 |
댓글