MySQL에서 UNION과 UNION ALL은 두 개 이상의 SELECT 쿼리 결과를 결합할 때 사용됩니다. 두 가지의 중요한 차이점은 중복된 행을 어떻게 처리하는가에 있습니다.
UNION은 중복된 행을 제거한 후에 결과를 반환합니다.
중복된 데이터가 여러 번 발생할 경우, 한 번만 출력됩니다.
중복을 제거하기 위해 추가적인 연산(정렬 및 비교)이 필요하기 때문에 UNION은 UNION ALL보다 상대적으로 성능이 느릴 수 있습니다.
예시
SELECT id, name FROM employees
UNION
SELECT id, name FROM managers;
두 테이블에서 중복된 (id, name) 값을 하나만 출력합니다.
특징
UNION은 중복된 행을 제거하는 기본 동작을 합니다.
결과를 정렬하여 중복을 제거하므로, UNION은 약간의 성능 비용이 발생할 수 있습니다.
UNION ALL은 중복된 행을 제거하지 않고, 모든 행을 그대로 반환합니다.
중복 여부를 체크하지 않기 때문에, UNION ALL은 UNION보다 성능이 더 빠를 수 있습니다.
SELECT id, name FROM employees
UNION ALL
SELECT id, name FROM managers;
두 테이블에서 중복된 (id, name) 값이 있더라도 모두 출력합니다.
특징
중복을 제거하지 않고 모든 결과를 출력합니다.
추가적인 중복 제거 작업이 없기 때문에, UNION ALL은 UNION보다 더 효율적이고 빠릅니다.
기능 | UNION | UNION ALL |
---|---|---|
중복 제거 | 중복된 행을 제거함 | 중복된 행을 제거하지 않음 |
성능 | 중복 제거 과정 때문에 더 느림 | 중복 제거 과정이 없어서 더 빠름 |
사용 예 | 중복된 데이터를 제거하고 싶을 때 | 중복된 데이터를 포함해야 할 때 |
UNION: 중복된 데이터가 의미 없고, 중복을 제거하고 싶은 경우 사용합니다.
예: 두 테이블에서 동일한 직원 목록을 병합하고 중복된 직원은 한 번만 출력하고 싶을 때.
UNION ALL: 중복된 데이터도 의미가 있을 때나 중복 여부를 따지지 않고 빠르게 데이터를 결합하고자 할 때 사용합니다.
예: 두 테이블의 모든 행을 그대로 결합하고 중복이 허용될 때.
이를 통해 두 개 이상의 테이블의 데이터를 합칠 때 필요한 도구로, 각각의 상황에 맞게 사용할 수 있습니다.
MySQL에서 UNION 또는 UNION ALL을 사용할 때, 결합하려는 테이블이나 SELECT 쿼리 간에 없는 컬럼이 있을 경우, 컬럼의 개수를 맞춰야 합니다.
이를 해결하기 위해 없는 컬럼에 대해 NULL
을 명시적으로 추가하여 컬럼 수와 순서를 동일하게 맞출 수 있습니다.
문제 상황
테이블 A에는 a, b, c 컬럼이 있고, 테이블 B에는 b, c 컬럼만 있다고 가정해보겠습니다. 이때 UNION을 사용하여 두 테이블을 결합하려고 할 때, A 테이블에만 있는 a 컬럼 때문에 오류가 발생할 수 있습니다.
해결 방법
테이블 B에서 없는 컬럼(a)에 대해 NULL 값을 넣어서 컬럼 수를 맞춰주면 UNION이나 UNION ALL을 사용할 수 있습니다.
예시: UNION을 사용할 경우
SELECT a, b, c
FROM A
UNION
SELECT NULL AS a, b, c
FROM B;
예시: UNION ALL을 사용할 경우
SELECT a, b, c
FROM A
UNION ALL
SELECT NULL AS a, b, c
FROM B;
설명:
첫 번째 SELECT: A 테이블의 a, b, c 컬럼을 그대로 선택합니다.
두 번째 SELECT: B 테이블에는 a 컬럼이 없으므로, NULL AS a를 사용하여 a 컬럼을 대신합니다. 그 외에 B 테이블의 b, c 컬럼을 선택합니다.
이 방식은 UNION이든 UNION ALL이든 동일하게 사용할 수 있으며, 없는 컬럼을 NULL로 채워서 오류 없이 결과를 결합할 수 있습니다.
요약:
UNION 또는 UNION ALL을 사용할 때, 모든 SELECT 쿼리의 컬럼 수가 동일해야 합니다.
없는 컬럼에 대해서는 NULL을 명시적으로 추가하여 컬럼 수를 맞춥니다.
각 SELECT 쿼리의 컬럼 순서도 동일하게 맞춰야 합니다.