데이터베이스를 조회하다 보면 두 개 이상의 SELECT 문의 결과를 하나로 합쳐야 할 때가 있습니다. 예를 들어 고객이 거주하는 도시 목록과 회사 지점이 위치한 도시 목록을 한 번에 가져오고 싶은 경우입니다. 두 번의 쿼리를 실행해서 해결할 수도 있지만, 하나의 쿼리로 결과를 얻는 것이 훨씬 효율적이겠죠.
바로 이럴 때 SQL UNION 연산자가 유용합니다. UNION 절을 사용하면 두 개 이상의 SELECT 쿼리 결과를 하나의 결과 집합으로 결합할 수 있습니다.
이 튜토리얼에서는 SQL UNION 연산자의 기본 개념을 살펴보고, 데이터베이스 작업 시 이 명령어를 활용할 수 있는 상황까지 자세히 알아보겠습니다.
쿼리 기본 개념 복습
프로그래머는 쿼리(query)를 사용해 데이터베이스에서 정보를 검색합니다. 쿼리는 대부분 SQL SELECT 문으로 시작하며, 특정 조건에 맞는 데이터를 가져오는 데 사용됩니다. 일반적으로 어떤 테이블을 조회할지 지정하는 FROM 연산자가 포함되며, 그 외에도 결과 데이터를 필터링하는 다양한 연산자를 함께 사용할 수 있습니다.
SQL 쿼리의 기본 문법은 다음과 같습니다:
SELECT column_name FROM table_name WHERE your_conditions_are_met;
다음은 모든 직원의 이름 목록을 반환하는 SQL 쿼리 예시입니다:
SELECT name FROM employees;
위 쿼리의 출력 결과는 다음과 같습니다:
| name |
| Luke Mike Hannah Geoff Alexis Emma Jonah |
(7 rows)
여러 열(column)의 정보를 가져오려면 열 이름을 쉼표로 구분하면 됩니다. 만약 모든 열의 데이터를 가져오고 싶다면, 테이블의 전체 열을 의미하는 별표(*)를 사용하면 됩니다.
SQL UNION이란?
SQL UNION 연산자는 두 개 이상의 쿼리 결과를 하나의 응답, 즉 하나의 테이블로 결합할 때 사용합니다.
UNION 연산자를 사용하려면 반드시 두 가지 조건을 충족해야 합니다. 첫째, 결합하려는 열들의 데이터 타입이 서로 호환되어야 합니다. 예를 들어 한 테이블에서 급여가 정수형인데 다른 테이블에서는 실수형이라면 UNION은 정상적으로 작동하지 않습니다. 둘째, 각 쿼리에서 열의 개수와 순서가 동일해야 합니다.
SQL UNION 쿼리의 기본 문법은 다음과 같습니다:
SELECT column_name FROM table1_name UNION SELECT column_name FROM table2_name;
예시를 통해 SQL UNION 연산자의 동작 방식을 살펴보겠습니다. 우리가 모든 고객에게 공지사항을 발송해야 하는 비즈니스를 운영한다고 가정해 보겠습니다. 아울러 직원들에게도 공지 내용을 전달하여 상황을 공유하고 싶습니다.
고객과 직원 모두의 이메일 주소 목록을 한 번에 가져와 공지사항을 발송하려면 다음과 같은 SQL 쿼리를 사용할 수 있습니다:
SELECT name, email FROM employees UNION SELECT name, email FROM customers;
위 쿼리의 출력 결과는 다음과 같습니다:
| name | |
| Emma | emma.a@gmail.com |
| Jonah | jonah.h@gmail.com |
| Hannah | hannah.y@gmail.com |
| Luke | luke.e@gmail.com |
| John | john.p@outlook.com |
| Geoff | geoff.l@gmail.com |
| Alexis | alexis.e@gmail.com |
| Fred | fred.s@gmail.com |
| Erin | erin.a@gmail.com |
| Katy | katy.l@gmail.com |
| Anne | anne.s@gmail.com |
| Tom | tom.h@gmail.com |
| Mike | mike.h@gmail.com |
| Hannah | hannah.p@gmail.com |
(14 rows)
실행 결과를 보면 UNION 쿼리가 고객과 직원 모두의 이름과 이메일 주소 목록을 성공적으로 반환한 것을 확인할 수 있습니다.
중복 제거와 UNION ALL
여기서 주목할 점은 UNION 연산자가 최종 결과에서 중복된 행을 자동으로 제거한다는 것입니다. 즉, 어떤 직원이 동시에 고객이기도 하다면 그 사람의 정보는 결과에 한 번만 표시됩니다.
위 예시에서는 이러한 동작이 큰 문제가 되지 않았지만, 오히려 중복 행까지 포함한 결과가 필요한 경우도 있습니다. 이때는 쿼리에 ALL 키워드를 추가하면 됩니다. 사용 예시는 다음과 같습니다:
SELECT name, email FROM employees UNION ALL SELECT name, email FROM customers;
UNION ALL은 중복 검사 과정을 생략하기 때문에 대용량 데이터를 처리할 때 성능 면에서 더 유리하다는 장점도 있습니다.
마무리
이번 튜토리얼에서는 SQL 서버에서 UNION 연산자를 사용하는 방법을 살펴보았습니다. 앞서 설명했듯이 UNION은 두 테이블에서 데이터를 가져와 하나의 테이블로 결합하는 데 활용할 수 있습니다. 예를 들어 공급업체와 유통업체의 주소 목록이 각각 별도의 테이블에 저장되어 있다면, UNION 쿼리 하나로 두 목록을 손쉽게 합칠 수 있습니다. 데이터 타입 호환성과 열의 개수·순서 조건만 잘 지킨다면, 여러 테이블의 데이터를 깔끔하게 통합하는 강력한 도구로 활용할 수 있습니다.