Table간의 합연산 UNION
UNION의 개념은 매우 쉽다. Table간의 합연산인데 A테이블과 B테이블의 합집합 테이블인 C테이블을 만드는 것이라고 보면 된다. 또한, UNION은 연산시 중복제거, 정렬 기능을 제공한다. 예제를 보면서 차근차근 이해하는게 훨씬 쉬우니 아래 두개의 테이블을 시작으로 서로 비교해가면서 UNION에 대해 이해해보도록 하자. 아래와 같이 Column이 모두 같은 user1, user2 테이블이 있다.
두 테이블을 합치려면 어떻게 해야할까? 아래와 같이 두개의 테이블에 UNION을 사용하면 된다. user1과 user2의 인스턴스가 모두 합해져 잘 출력되는것을 볼 수 있다.
SELECT * FROM USER1
UNION
SELECT * FROM USER2;
✅ Column의 이름, 조건이 다를때
그렇다면, 합연산의 대상이 되는 두 테이블의 Column이 서로 다르면 어떻게 될까? Column의 조건값은 같지만 이름이 다른 두 테이블을 UNION 연산을 이용해 합쳐보자.
아래 두 테이블은 기준 테이블을 서로 바꿔 UNION 연산을 실행한 결과이다. 결론은, 두 개의 테이블의 Column의 갯수가 같고 Column의 조건도 같지만, Column의 이름이 다를 때는 기준 테이블의 Column 이름을 가져온다.
하나 더 해보자. 그럼 꼭 Column의 조건도 같아야할까? 결과는 아래 테이블과 같다. user3 테이블의 name을 varchar(20)에서 integer로 바꾸고 UNION을 실행한 결과이다. 이전과 같이 Column의 이름은 기준 테이블을 따르고 알아서 조건을 맞춰는 것 같다.
근데 여기서 user1의 username이 varchar(20)이다. integer가 varchar로 바뀌는건 이해한다. 근데 varchar(20)이, 그것도 알파벳으로 저장돼있는데 어떻게 integer와 함께 저장될 수 있을까? 궁금해서 아래와 같이 해봤는데 안된다. DB내부적으로 잘 처리해주나 보다.
✅ Column의 갯수가 다를때
이번에는 Column의 갯수가 다를때 어떻게 동작하는지 살펴보자. 아래와 같이 두 개의 테이블이 있다고 해보자. 위에서 봤던 user2 테이블에 phone_number라는 Column을 추가하였다.
Column이 다른건 괜찮아도 Column의 갯수가 다른건 받아줄 수 없나보다. 어떤 결과가 나올지 내심 기대했는데 아쉽다. UNION으로 해볼 수 있는건 다 해본 것 같다. UNION을 사용할때에는 Column의 갯수가 동일한지 꼭 확인하고 사용하자.
UNION ALL
지금까지 알아본 UNION은 사실 DISTINCT가 기본적으로 적용되는 연산이었다. UNION ALL은 중복을 허용하고 정렬 기능을 제공하지 않은 연산이다. 맞다. 아래 두 테이블을 가지고 실험해보자.
SELECT * FROM USER1
UNION ALL
SELECT * FROM USER2;
UNION ALL은 중복을 허용하고 있고, UNION은 중복을 제외한 결과를 만들어내는것을 볼 수 있다.