티스토리 뷰

Sql

SQL UNION / UNION ALL

김한성 2018. 10. 25. 11:02

목표 : SQL 쿼리 튜닝



SQL에서 UNION과 UNION ALL의 차이점을 알아보겠습니다.


회사에서 DB에 1,2,3,4 테이블이 있는데 하나의 테이블에서만 동작하도록 쿼리를 짜놓았습니다.


쿼리를 직접 여기다가 쓸수 없으니 폼만 유지한채로 써보겠습니다.


SELECT A.서울 AS 서울, A.부산 AS 부산, A.시간 AS 시간, A.광주 AS 광주, A.cnt AS count

FROM (

SELECT MAX(서울) AS 서울, MAX(부산) AS 부산, MAX(시간) AS 시간, 광주, count(광주) AS cnt

FROM 1

WHERE 1=1

AND 시간 BETWEEN '2018-09-01 00:00:00' AND '2018-09-14 23:59:59'

GROUP BY 광주

) AS A

WHERE 1

ORDER BY A.cnt DESC

LIMIT 200


위의 쿼리는 설명은

1이라는 테이블에서 해당 시간만큼 광주로 GROUP을 지어주고 광주로 중복된게 많은 순으로 200개를 뽑아 추출하는것입니다.


시간이라든지 테이블명 등은 실제 변수로 활용해 위의 쿼리가 반복문에 돌아가 실행하게 됩니다.


하지만,        

지금 서브쿼리 WHERE절에 시간 조건이 10월달이 되면 테이블 2로 넘어가게됩니다. 

(당연히 테이블은 변수형태로 소스코드 작성)


그렇다면 테이블을 2개를 돌아 결과가 400개가 나오게 되어 이것을 해결하려고 UNION을 이용하여 쿼리를 만들어봤습니다.

즉 서브쿼리를 보면 일단 1,2테이블을 합치고 그중에서 광주로 GROUP BY를 지정해 200개를 뽑아내는 것입니다. 


SELECT MAX(서울) AS 서울, MAX(부산) AS 부산, MAX(시간) AS 시간, 광주, COUNT(광주) AS cnt

FROM (

SELECT 서울, 부산, 시간, 광주

FROM 1

WHERE 1=1

AND 시간 BETWEEN '2018-09-01 00:00:00' AND '2018-09-30 23:59:59'

UNION ALL

SELECT 서울, 부산, 시간, 광주

FROM 2

WHERE 1=1

AND 시간 BETWEEN '2018-10-01 00:00:00' AND '2018-10-30 23:59:59'

    ) AS A

WHERE 1

GROUP BY 광주

ORDER BY cnt DESC

LIMIT 200;


이제 본격적으로 UNION / UNION ALL의 차이점을 알아보겠습니다.


UNION ALL : 두 테이블의 중복되는 값까지 반환

UNION : 두 테이블의 결합을 나타내며, 결합시키는 두 테이블의 중복되지 않는 값들을 반환


TABLE-A

 COLUMN-1

 1

 2

 3

TABLE-B 

 COLUMN-1

 2

 3

 4


 

UNION 

UNION ALL 

 SELECT COLUMN-1

 FROM TABLE-A

 UNION

 SELECT COLUMN-1

 FROM TABLE-B


 결과 : 

 COLUMN-1

 1

 2

 3

 4


 

 SELECT COLUMN-1

 FROM TABLE-A

 UNION ALL

 SELECT COLUMN-1

 FROM TABLE-B

 

 결과 :

 COLUMN-1

 1

 2

 3

 2

 3

 4


이상입니다. 

회사에서 SQL 쿼리 짜면서 활용 응용 했던것들을 남들이 봤을땐 정말 기본적인 것들이어도 하나하나 재산이 된다생각하고 합니다.

'Sql' 카테고리의 다른 글

[SQL] 동일(같은) 테이블 서브쿼리 update  (1) 2018.11.15
댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31