[SQL 레벨업] 7강. 조건 분기,집합 연산, 윈도우 함수,갱신
저번 글 7강에서 집합 연산을 공부하면서 UNION에 대해 정리하는 시간을 가졌었다. 그런데 이번 8강에서는 UNION을 단순히 생각나는대로 사용하지 않고, 어떻게 하면 효율적으로 UNION을 사용하는지 정리해볼 예정이다.
1. UNION 사용시 주의할 점
union을 사용할 때 주의해야할 점은 내부적으로 여러개의 select 구문을 실행한다는 것이다.
우리는 union으로 합친 쿼리들을 한번의 실행으로 받아드릴 수 있겠지만, 실제로 내부에서는 합친 select 구문만큼 실행되고 있기 때문에, 테이블에 접근하는 횟수가 많아져 I/O 비용이 크게 늘어난다. 그렇기 때문에 사용하기 전에 신중히 고려해서 사용해야 하며, UNION대신 CASE를 이용하여 실행 횟수를 줄일 수 있다.
2. UNION과 CASE를 비교한 예제
문제
상품 정보를 담는 Items 테이블이 존재하며, Items 테이블에서 사용자가 내야할 최종 price 값을 구하려고 한다.
최종 price 가격을 2001년까지는 세전가격으로, 2002년부터는 세후가격으로 포함되게 정리해야한다.
이때 필요한 SQL을 작성해보쟈 !
item_id | year | item_name | price_tax_ex | price_tax_in |
100 | 2001 | 머그컵 | 500 | 525 |
100 | 2002 | 머그컵 | 600 | 630 |
101 | 2001 | 티스푼 | 500 | 525 |
101 | 2002 | 티스푼 | 500 | 525 |
구하고자하는 결과
item_name | year | price |
머그컵 | 2001 | 500 |
머그컵 | 2002 | 630 |
티스푼 | 2001 | 500 |
티스푼 | 2002 | 525 |
방법
1️⃣ UNION을 사용한 조건 분기
SELECT item_name,year,price_tax_ex AS price FROM Items WHERE year<=2001
UNION ALL
WELECT item_name,year,price_tax_in AS price FROM Items WHERE year >=2002;
이 쿼리의 단점은 거의 동일한 쿼리를 두번이나 실행하고 있다는 것이다. 이렇게 되면 유사한 쿼리 2개를 따로 두번 실행시키기 위해, Items 테이블에 2번 접근하게 된다. 테이블 크기가 커질 수록 문제가 될것 !
2️⃣ CASE를 이용한 조건 분기
SELECT item_name,year,
CASE WHEN year <= 2001 THEN price_tax_ex
WHEN year >= 2002 THEN price_tax_in END AS price
FROM Items;
where 절에서 조건분기를 하는 것이 아니라 CASE를 이용하여 조건분기를 처리하였다. 이렇게 되면 테이블에 접근하는 횟수가 1번으로 줄기 때문에 접근 비용이 줄어들 것이다 !
새로 배운 것
where 절에서 말고도, case를 이용하여 조건분기를 할 수 있다는 것을 깨달았다. 원래 case 문법을 알고 있었지만, 잘 활용하지 않다보니, 이렇게 효율적으로 쓸 수 있다는 것을 새삼,, 이제 깨달았다..SQL 공부는 다 아는 것처럼 생각해도 공부하다보면 정말 일부분만 알고 있었음을 깨닫는다 ..ㅎㅎ 물론 그 깨달음이 이 책을 읽게 된 계기이기도 한다 !
'BOOK > SQL 레벨업' 카테고리의 다른 글
[SQL 레벨업] 15강 반복계의 공포 (1) | 2024.01.25 |
---|---|
[SQL 레벨업] 13강 자르기 (1) | 2024.01.23 |
[SQL 레벨업] 12강 집약 (0) | 2024.01.10 |
[SQL 레벨업] 10강 UNION이 필요한 경우 (1) | 2024.01.04 |
[SQL 레벨업] 9장 집계와 조건분기 (0) | 2023.12.13 |