SQL 복합 쿼리는 여러 쿼리의 결과를 하나로 결합하거나 특정 조건에 따라 결과를 비교하는 기능을 제공합니다. MySQL 8.0.31 이상에서는 INTERSECTEXCEPT도 공식적으로 지원됩니다. 이번 글에서는 UNION, UNION ALL, INTERSECT, EXCEPT의 개념과 활용 방법을 예제와 함께 살펴보겠습니다.


1. UNION과 UNION ALL

연산자 설명

UNION 중복된 데이터를 제거하고 결과를 결합
UNION ALL 중복된 데이터를 포함하여 모든 결과를 결합

기본 문법

SELECT 컬럼명
FROM 테이블1
UNION [ALL]
SELECT 컬럼명
FROM 테이블2;

예제

1. 중복 제거한 결과 반환 (UNION)

SELECT FirstName, LastName
FROM Customer
UNION
SELECT FirstName, LastName
FROM Employee;
  • 고객과 직원 테이블에서 이름 목록을 합칩니다.

2. 중복 포함한 결과 반환 (UNION ALL)

SELECT FirstName, LastName
FROM Customer
UNION ALL
SELECT FirstName, LastName
FROM Employee;
  • 고객과 직원 테이블에서 이름 목록을 중복 포함하여 합칩니다.

3. ORDER BY와 함께 사용

SELECT FirstName, LastName
FROM Customer
UNION
SELECT FirstName, LastName
FROM Employee
ORDER BY FirstName ASC;
  • 고객과 직원 이름을 합친 후 이름 기준으로 오름차순 정렬합니다.

2. INTERSECT

INTERSECT는 두 쿼리의 결과에서 공통된 데이터를 반환합니다.

기본 문법

SELECT 컬럼명
FROM 테이블1
INTERSECT
SELECT 컬럼명
FROM 테이블2;

예제

1. 고객(Customer)과 직원(Employee) 중 이름이 같은 사람 조회

 

SELECT FirstName, LastName FROM Customer
INTERSECT 
SELECT FirstName, LastName FROM Employee;

 

2. 두 테이블에서 동일한 국가 조회

 

SELECT Country FROM Customer
INTERSECT
SELECT Country FROM Employee;

3. EXCEPT

EXCEPT는 첫 번째 쿼리의 결과에서 두 번째 쿼리의 결과를 제외한 차집합을 반환합니다.

Oracle에서는 MINUS라는 이름으로 사용됩니다.

기본 문법

SELECT 컬럼명
FROM 테이블1
EXCEPT
SELECT 컬럼명
FROM 테이블2;

예제

1. 고객(Customer) 중 직원(Employee)에는 없는 사람 조회

SELECT FirstName, LastName FROM Customer 
EXCEPT
SELECT FirstName, LastName FROM Employee;

 

2. 직원(Employee) 테이블에는 없고 고객(Customer) 테이블에만 있는 국가 조회

SELECT Country FROM Customer 
EXCEPT
SELECT Country FROM Employee;

4. MySQL에서 INTERSECT와 EXCEPT

MySQL 8.0.31부터는 INTERSECT와 EXCEPT가 기본적으로 지원되지만, 이전 버전에서는 아래와 같은 대체 방법을 사용할 수 있습니다.

INTERSECT의 대체 쿼리

SELECT Customer.FirstName, Customer.LastName
FROM Customer
INNER JOIN Employee
ON Customer.FirstName = Employee.FirstName
   AND Customer.LastName = Employee.LastName;

EXCEPT의 대체 쿼리

SELECT Customer.FirstName, Customer.LastName
FROM Customer
LEFT JOIN Employee
ON Customer.FirstName = Employee.FirstName
   AND Customer.LastName = Employee.LastName
WHERE Employee.FirstName IS NULL;


5. 요약

연산자 설명 MySQL 지원 여부

UNION 중복 제거 후 결과를 합칩니다. 지원
UNION ALL 중복 포함 후 결과를 합칩니다. 지원
INTERSECT 두 쿼리의 공통된 데이터를 반환합니다. MySQL 8.0.31 이상 지원
EXCEPT 첫 번째 결과에서 두 번째 결과를 제외한 데이터를 반환합니다. MySQL 8.0.31 이상 지원

결론

  • MySQL 8.0.31부터 INTERSECTEXCEPT를 기본적으로 지원하므로, 대체 쿼리 없이 간편하게 사용할 수 있습니다.
  • 이전 버전을 사용하는 경우 INNER JOINLEFT JOIN으로 동일한 결과를 구현할 수 있습니다.
  • SQL 복합 쿼리는 데이터 분석 및 통합에서 강력한 도구이므로, 다양한 상황에서 활용할 수 있습니다.

SQL 복합 쿼리는 데이터 통합 및 비교에 강력한 도구입니다. 데이터베이스 시스템에 따라 지원 여부가 다르므로, MySQL의 대안 방법도 익혀두는 것이 좋습니다. 다음 글에서는 SQL 트랜잭션과 롤백에 대해 알아보겠습니다.

'SQL > 학습정리' 카테고리의 다른 글

SQL 트랜잭션과 롤백  (1) 2024.12.15
SQL 서브쿼리  (0) 2024.12.12
SQL Join  (0) 2024.12.11
SQL 집계함수  (0) 2024.12.10
SQL 기본 문법 2  (0) 2024.12.09

+ Recent posts