[SQL] 집합 연산자, 헷갈리지 않기! (UNION, UNION ALL, INTERSECT, EXCEPT또는 MINUS)

집합 연산자는 SQL에서 두 개 이상의 쿼리 결과 집합을 결합하거나 조작하는 데 사용됩니다.

집합 연산자는 기본적으로 수학에서의 집합 연산과 유사한 방식으로 작동하며, 각 쿼리의 결과에서 중복을 처리하는 방법에 따라 결과가 달라질 수 있습니다.

이번 글에서는 집합 연산자를 알아보겠습니다!

예시 테이블

예시 테이블 1(직원 테이블: Employees)

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Department VARCHAR(100),
    Position VARCHAR(100),
    DateOfBirth DATE,
    HireDate DATE,
    Salary DECIMAL(10, 2),
    Email VARCHAR(100),
    PhoneNumber VARCHAR(15)
);

INSERT INTO Employees (EmployeeID, FirstName, LastName, Department, Position, DateOfBirth, HireDate, Salary, Email, PhoneNumber)
VALUES 
(1, 'John', 'Doe', 'Engineering', 'Software Engineer', '1985-05-15', '2010-06-20', 85000.00, 'john.doe@example.com', '123-456-7890'),
(2, 'Jane', 'Smith', 'Marketing', 'Marketing Manager', '1990-07-22', '2012-04-15', 95000.00, 'jane.smith@example.com', '234-567-8901'),
(3, 'Michael', 'Johnson', 'Sales', 'Sales Representative', '1988-09-10', '2014-01-10', 70000.00, 'michael.johnson@example.com', '345-678-9012');
  EmployeeID FirstName LastName DepartmentPosition Salary HireDate Email PhoneNumber OfficeLocation
1 John Doe HR Manager 80000 2015-04-22 john.doe@example.com 123-456-7890 New York
2 Jane Smith IT Developer 95000 2017-07-11 jane.smith@example.com 234-567-8901 San Francisco
3 Alice Johnson Finance Analyst 75000 2018-09-15 alice.johnson@example.com 345-678-9012 Chicago

예시 테이블 2(제품 테이블: Products)

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName VARCHAR(100),
    Category VARCHAR(50),
    Supplier VARCHAR(100),
    Price DECIMAL(10, 2),
    StockQuantity INT,
    DateAdded DATE,
    IsAvailable BOOLEAN,
    WarrantyPeriod INT,
    Rating FLOAT
);

INSERT INTO Products (ProductID, ProductName, Category, Supplier, Price, StockQuantity, DateAdded, IsAvailable, WarrantyPeriod, Rating)
VALUES 
(101, 'Laptop', 'Electronics', 'TechSupply Co.', 1200.99, 50, '2023-01-15', TRUE, 24, 4.5),
(102, 'Office Chair', 'Furniture', 'HomeGoods Inc.', 150.75, 200, '2022-11-10', TRUE, 12, 4.3),
(103, 'Coffee Maker', 'Appliances', 'Kitchenware Ltd.', 75.20, 30, '2023-03-05', TRUE, 6, 4.0);
ProductID ProductName Category Supplier Price StockQuantity DateAdded IsAvailable WarrantyPeriod Rating
101 Laptop Electronics TechSupply Co. 1200.99 50 2023-01-15 TRUE 24 4.5
102 Office Chair Furniture HomeGoods Inc. 150.75 200 2022-11-10 TRUE 12 4.3
103 Coffee Maker Appliances Kitchenware Ltd. 75.20 30 2023-03-05 TRUE 6 4.0

집합 연산자

1. 합집합 (UNION, UNION ALL)

UNION: 두 쿼리 결과에서 중복된 행을 제거하고 결합된 결과를 반환합니다.

SELECT FirstName, LastName, Email 
FROM Employees 
UNION 
SELECT Supplier AS FirstName, ProductName AS LastName, 'N/A' AS Email 
FROM Products;

실행 결과

FirstName LastName Email
John Doe john.doe@example.com
Jane Smith jane.smith@example.com
Michael Johnson michael.johnson@example.com
TechSupply Co. Laptop N/A
HomeGoods Inc. Office Chair N/A
Kitchenware Ltd. Coffee Maker N/A
  • UNION은 결과 집합에서 중복된 행을 제거합니다.

UNION ALL: 두 쿼리 결과에서 중복을 포함한 모든 행을 결합하여 반환합니다.

SELECT FirstName, LastName, Email 
FROM Employees 
UNION ALL 
SELECT Supplier AS FirstName, ProductName AS LastName, 'N/A' AS Email 
FROM Products;

결과

FirstName LastName Email
John Doe john.doe@example.com
Jane Smith jane.smith@example.com
Michael Johnson michael.johnson@example.com
TechSupply Co. Laptop N/A
HomeGoods Inc. Office Chair N/A
Kitchenware Ltd. Coffee Maker N/A
  • UNION ALL은 중복을 포함한 모든 행을 결합하여 반환합니다.

2. 교집합 (INTERSECT)

INTERSECT: 두 쿼리 결과의 공통된 행만 반환합니다.

SELECT FirstName, LastName 
FROM Employees 
INTERSECT 
SELECT Supplier, ProductName 
FROM Products;

결과

FirstName LastName
- -
  • 이 예시에서는 공통된 데이터가 없기 때문에 결과가 없습니다. 그러나 동일한 이름이 있을 경우 해당 데이터가 표시됩니다.

3. 차집합 (EXCEPT)

EXCEPT: 첫 번째 쿼리 결과에서 두 번째 쿼리 결과를 제외한 나머지를 반환합니다.

SELECT FirstName, LastName 
FROM Employees 
EXCEPT 
SELECT Supplier, ProductName 
FROM Products

결과

FirstName LastName
John Doe
Jane Smith
Michael Johnson
  • 이 예시는 Employees 테이블의 이름과 성에서 Products 테이블의 공급자 이름과 제품 이름을 제외한 결과를 반환합니다.