MySQL에서 하나의 열에 대해 서로 다른 계산 결과인 여러 값을 한 번의 조회로 가져오고 싶다면 UNION ALL을 활용하면 됩니다. 이 글에서는 예제 테이블을 만들고, UNION ALL을 사용해 사용자 정의 열(NewValue)에 여러 값을 설정하는 과정을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1987
(
UserValue int
);
Query OK, 0 rows affected (2.90 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 테이블에 레코드를 몇 개 추가합니다.
mysql> insert into DemoTable1987 values(4); Query OK, 1 row affected (0.22 sec) mysql> insert into DemoTable1987 values(5); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable1987 values(6); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable1987 values(7); Query OK, 1 row affected (0.09 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1987;
실행하면 다음과 같은 결과가 출력됩니다.
+-----------+ | UserValue | +-----------+ | 4 | | 5 | | 6 | | 7 | +-----------+ 4 rows in set (0.00 sec)
4. UNION ALL로 사용자 정의 열에 여러 값 설정하기
이제 핵심인 쿼리입니다. 같은 테이블을 두 번 조회하면서 각각 다른 연산식(×100, ×50)으로 계산된 값을 별칭 NewValue로 지정하고, UNION ALL로 두 결과를 하나로 합친 후 UserValue 기준으로 정렬합니다.
mysql> select UserValue,(UserValue*100) as NewValue from DemoTable1987
union all
select UserValue,(UserValue*50) as NewValue from DemoTable1987
order by UserValue;
실행 결과는 다음과 같습니다.
+-----------+----------+ | UserValue | NewValue | +-----------+----------+ | 4 | 400 | | 4 | 200 | | 5 | 500 | | 5 | 250 | | 6 | 300 | | 6 | 600 | | 7 | 350 | | 7 | 700 | +-----------+----------+ 8 rows in set (0.14 sec)
결과 해석
출력 결과를 보면 각 UserValue마다 두 개의 행이 반환된 것을 확인할 수 있습니다. 첫 번째 SELECT는 원래 값에 100을 곱한 결과를, 두 번째 SELECT는 50을 곱한 결과를 반환하며, UNION ALL이 이 두 결과 집합을 중복 제거 없이 그대로 합쳐 줍니다. 마지막의 ORDER BY 절은 전체 결과를 UserValue 기준으로 정렬하여 가독성을 높여 줍니다.
UNION과 UNION ALL의 차이점
참고로 UNION은 중복된 행을 자동으로 제거하지만, UNION ALL은 중복 여부와 관계없이 모든 행을 반환합니다. 이 예제처럼 서로 다른 계산 결과를 모두 유지해야 하는 경우에는 UNION ALL이 적합하며, 불필요한 중복 검사를 수행하지 않기 때문에 성능 면에서도 더 유리합니다.