SQL 레벨업 - 3장
SQL의 조건 분기
8강 UNION을 사용한 쓸데없이 긴 표현
조건 분기
:where구만 조금씩 다른 여러 개의 SELECT 구문을 합쳐서, 복수의 조건에 일치하는 하나의 결과 집합을 얻고싶을 때
-> 여러 개의 SELECT 구문을 실행하는 실행 계획으로 해석되어 테이블에 접근 횟수가 많아져 I/O 비용이 늘어남
union 예제
- 2001년 이전과 2002년 이후를 구분해서 가격을 선택해야함
SELECT item, year,price_ex as price
FROM ITEMS
WHERE year <= 2001
UNION ALL
SELECT item, year,price_in as price
FROM ITEMS
WHERE year >= 2002;
->거의 같은 두 개의 쿼리를 두 번이나 실행하여 길고, 오래걸림
SELECT item,year,
CASE WHEN year <= 2001 THEN price_ex
WHEN year >= 2002 THEN price_in END AS price
FROM ITEMS;
-> SELECT 구만으로 조건 분기
9장 집계와 조건 분기
1. 집계 대상으로 조건 분기
- union을 사용한 방법
ex) 남성의 인구를 지역별로 구하고, 여성의 인구를 지역별로 구한 뒤 머지하는 방법
- 집계 의 조건 분기도 CASE 식을 사용
ex) CASE식을 집약 함수 내부에 포함시켜서 '남성 인구'와 '여성 인구' 필터를 만듦
SELECT prefecture,
SUM ( CASE WHEN sex = '1' THEN pop ELSE 0 END) AS pop_men,
SUM ( CASE WHEN sex = '2' THEN pop ELSE 0 END) AS pop_wom,
FROM population
GROUP BY prefecture;
-> union을 사용한 경우에 비해 I/O 비용 절반으로 감소
2.집약 결과로 조건 분기
- 조건 분기가 레코드 값이 아닌, 집합의 레코드 수에 적용됨.
- 조건 분기가 where 구가 아니라 having 구에 지정됨.
- case 식을 사용한 조건분기
SELECT EMP_NAME,
CASE WHEN COUNT(*) = 1 THEN MAX(TEAM)
WHEN COUNT(*) = 2 THEN '2개를 겸무'
WHEN COUNT(*) = 3 THEN '3개 이상을 겸무'
END AS TEAM
FROM EMPLOYESS
GROUP BY EMP_NAME;
->테이블에 접근 비용을 3분의 1로 줄일 수 있음
10장 그래도 UNION이 필요한 경우
1.UNION을 사용할 수밖에 없는 경우
- 머지 대상이 되는 SELECT 구문들에서 사용하는 테이블이 다른 경우가 대표적( 여러개의 테이블에서 검색한 결과를 머지하는 경우)
SELECT col_1
FROM Table_A
WHERE col_2 = 'A'
UNION ALL
SELCET col_3
FROM Table_B
WHERE col_4 = 'B';
2. UNION을 사용하는 것이 성능적으로 더 좋은 경우
- 테이블 풀 스캔이 발생한다면, union을 사용한 방법이 성능적으로 더 좋을 수 있음
- union을 사용한다면 3개의 SELECT 구문을 UNION으로 머지하면 됨
-OR을 사용한다면 SELECT구문이 하나로 줄어드러서 테이블에 대한 접근이 1회로 줄어듦
- IN을 사용한다면 다중 필드 기능을 사용한 방법
11장 절차 지향형과 선언형
1. 구문 기반과 식 기반
UNION은 구문을 바탕으로 하는 절차 지향적인 체계를 사용하기 때문이다. 실제로 UNION을 연결하는 대상은 SELECT 구문이다. 따라서 절차 지향형 프로그래밍 언어에 익숙한 사람들에게 익숙한 방식이다.
하지만 SQL 기본적인 체계는 선언형. 절차 지향형 언어가 CASE구문으로 분기하는 것을 , SQL은 CASE 식으로 분기함
2.선언형의 세계로 도약
절차 지향형 세계에서 선언형 세계로 도약하는 것이 곧 SQL 능력 향상의 핵심