MySQL에서는 UNION ALL을 사용하여 쉼표로 구분된 값 목록을 마치 실제 테이블처럼 조회할 수 있습니다. 원리는 간단합니다. 각 SELECT 문이 하나의 행을 반환하도록 작성한 뒤, 이를 UNION ALL로 연결하면 여러 개의 행을 가진 결과 집합이 만들어집니다.
UNION ALL로 목록을 테이블로 변환하기
예를 들어 10, 20, 30, 40, 50이라는 목록을 테이블 형태로 만들어 보겠습니다.
mysql> select 10 Number UNION ALL select 20 Number UNION ALL select 30 Number
UNION ALL select 40 Number UNION ALL select 50 Number;
출력 결과
+--------+
| Number |
+--------+
| 10 |
| 20 |
| 30 |
| 40 |
| 50 |
+--------+
5 rows in set (0.00 sec)
각 SELECT 절에는 'Number'라는 별칭(Alias)이 지정되어 있습니다. 첫 번째 SELECT의 별칭이 최종 결과 집합의 컬럼 이름으로 사용됩니다.
다른 예제
이번에는 1, 2, 3 목록을 테이블로 만들어 보겠습니다. 아래 쿼리를 사용하면 됩니다.
mysql> SELECT 1 a UNION ALL SELECT 2 a UNION ALL SELECT 3 a;
출력 결과
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
+---+
3 rows in set (0.00 sec)
UNION과 UNION ALL의 차이점
여기서 UNION 대신 UNION ALL을 사용하는 데에는 이유가 있습니다. 일반적인 UNION은 결과에서 중복된 값을 자동으로 제거하지만, UNION ALL은 중복 여부와 관계없이 모든 행을 그대로 반환합니다. 따라서 목록에 동일한 값이 여러 번 포함될 가능성이 있다면 반드시 UNION ALL을 사용해야 원본 데이터가 손실되지 않습니다.