티스토리 뷰

Database

[Database] SET

daze1002 2025. 5. 18. 22:05
반응형

🔗 MySQL SET 연산자 정리 (UNION, INTERSECT, MINUS)

주요 키워드: MySQL, SET OPERATOR, UNION, INTERSECT, MINUS, SQL 집합 연산


🧭 개요

SET 연산자는 두 개 이상의 SELECT 결과를 하나로 결합할 때 사용됩니다.
모든 SELECT 쿼리는 컬럼 개수와 순서, 타입이 동일해야 합니다.


1️⃣ UNION

  • 두 SELECT 쿼리 결과를 합치되 중복된 레코드는 제거합니다.
SELECT 
    menu_code, menu_name, menu_price, category_code, orderable_status
FROM tbl_menu
WHERE category_code = 10

UNION

SELECT 
    menu_code, menu_name, menu_price, category_code, orderable_status
FROM tbl_menu
WHERE menu_price < 9000;
-- category_code가 10이거나, menu_price < 9000인 데이터의 중복 없는 합집합

2️⃣ UNION ALL

  • 두 SELECT 쿼리 결과를 중복 제거 없이 모두 반환합니다.
SELECT 
    menu_code, menu_name, menu_price, category_code, orderable_status
FROM tbl_menu
WHERE category_code = 10

UNION ALL

SELECT 
    menu_code, menu_name, menu_price, category_code, orderable_status
FROM tbl_menu
WHERE menu_price < 9000;
-- 중복도 포함하여 모든 행을 결합

3️⃣ INTERSECT (대체 구현)

  • 공통된 레코드만 반환합니다.
  • MySQL은 INTERSECT 키워드를 지원하지 않지만 INNER JOIN 또는 IN으로 대체할 수 있습니다.

✅ INNER JOIN 방식

SELECT 
    a.menu_code, a.menu_name, a.menu_price, a.category_code, a.orderable_status
FROM tbl_menu a
INNER JOIN (
    SELECT menu_code, menu_name, menu_price, category_code, orderable_status
    FROM tbl_menu
    WHERE menu_price < 9000
) b ON a.menu_code = b.menu_code
WHERE a.category_code = 10;
-- category_code = 10 이면서 price < 9000인 교집합

✅ IN 연산자 방식

SELECT 
    menu_code, menu_name, menu_price, category_code, orderable_status
FROM tbl_menu
WHERE category_code = 10
  AND menu_code IN (
    SELECT menu_code
    FROM tbl_menu
    WHERE menu_price < 9000
);
-- 동일한 조건을 IN 서브쿼리로 구현

4️⃣ MINUS (대체 구현)

  • 첫 번째 SELECT 결과에서 두 번째 SELECT 결과를 제외한 결과만 반환합니다.
  • MySQL은 MINUS 키워드를 지원하지 않지만 LEFT JOIN + IS NULL로 구현 가능합니다.
SELECT 
    a.menu_code, a.menu_name, a.menu_price, a.category_code, a.orderable_status
FROM tbl_menu a
LEFT JOIN (
    SELECT menu_code, menu_name, menu_price, category_code, orderable_status
    FROM tbl_menu
    WHERE menu_price < 9000
) b ON a.menu_code = b.menu_code
WHERE a.category_code = 10
  AND b.menu_code IS NULL;
-- category_code = 10 이면서 price < 9000 조건을 만족하지 않는 레코드 (차집합)

🔍 요약

연산자 기능 MySQL 지원 여부 대체 방법
UNION 합집합 (중복 제거) ✅ 지원 -
UNION ALL 합집합 (중복 포함) ✅ 지원 -
INTERSECT 교집합 ❌ 미지원 INNER JOIN, IN
MINUS 차집합 ❌ 미지원 LEFT JOIN + IS NULL

📎 참고 자료

'Database' 카테고리의 다른 글

[Database] JOIN  (0) 2025.05.18
[Database] MySQL 내장 함수  (0) 2025.05.18
[Database] data types  (0) 2025.05.18
[Database] DML  (0) 2025.05.18
[Database] GROUPING  (0) 2025.05.18