[SQL] 합집합, 교집합, 차집합(MySQL)

2024. 2. 9. 20:57SQL

합집합, 교집합, 차집합(MySQL)

 

합집합


🔍 [쿼리 A]  UNION/UNION ALL [쿼리 B]

💡쿼리 두 개의 결괏값을 합치는 것과 같다. JOIN 할 때 쓰이는 ON절은 사용하지 않는다.

💡 쿼리 두 개의 결괏값을 합치는 것이므로, 각각의 결과 값의 개수(컬럼의 수)는 같아야 한다.

UNION은 두 쿼리 결과의 중복을 제거한 후 합집합을 반환

 UNION ALL 은 두 쿼리 결과의 중복을 포함한 합집합을 반환

ORDER BY는 전체 쿼리의 가장 마지막에 작성 가능하고, [쿼리 A]에서 가져온 컬럼으로만 가능하다.

//UNION 예제
SELECT name FROM Animals
UNION
SELECT name FROM Pets;

//UNION ALL 예제
SELECT name FROM Animals
UNION ALL
SELECT name FROM Pets;

 

교집합


🔍 다른 DBMS에서는 INTERSECT로 표현

🔍 INNER JOIN 사용 (IN을 사용하는 방법도 있다.)

💡INNER JOIN의 ON절에 단순히 아무 컬럼을 쓰는 것이 아니라, 교집합을 확인하고자 하는 컬럼을 쓰는 것이다.

💡 교집합을 확인하고 싶은 컬럼이 여러 개일 경우 모두 다 ON 절에 작성한다.

//INNER JOIN 사용 예제(하나의 컬럼(name)이 일치하는 행을 찾는 쿼리)
SELECT TableA.name
FROM TableA
INNER JOIN TableB ON TableA.name = TableB.name;

//TableA와 TableB에서 name, age, city 컬럼이 모두 일치하는 행을 찾는 쿼리
SELECT TableA.name, TableA.age, TableA.city
FROM TableA
INNER JOIN TableB 
ON TableA.name = TableB.name 
AND TableA.age = TableB.age 
AND TableA.city = TableB.city;

//IN 사용 예제
SELECT name
FROM TableA
WHERE name IN (SELECT name FROM TableB);

 

차집합


🔍 다른 DBMS에서는 MINUS로 표현

➡️ 교집합과 마찬가지로 차집합을 확인 하고 싶은 컬럼은 모두 다 기준으로 두기 위해서 조건절에 적어줘야 한다.

방법 1. LEFT JOIN + IS NULL 사용

SELECT A.*
FROM A
LEFT JOIN B ON A.number = B.number
    AND A.name = B.name
    AND A.type = B.type
    AND A.attack = B.attack
    AND A.defense = B.defense
WHERE B.number IS NULL;

➡️ 차집합은 A에서 B를 제외하는 것이므로 A LEFT JOIN B~를 한 값에서 B에 속하는 값을 제거해 준 것과 동일하다.

💡 A LEFT JOIN에 포함된 컬럼 중 하나가 NULL이라는 것은 이미 B 테이블에 매칭되는 행이 없다는 것을 의미.

💡 조인 조건에 포함된 모든 컬럼에 대해 NULL 체크를 할 필요는 없다.

💡 한 컬럼에 대한 NULL 체크만으로도 B에 대응하는 행이 없는 A의 행을 식별할 수 있기 때문.

 

방법 2. NOT EXISTS 사용

SELECT A.*
FROM A
WHERE NOT EXISTS (
    SELECT 1
    FROM B
    WHERE A.number = B.number
    AND A.name = B.name
    AND A.type = B.type
    AND A.attack = B.attack
    AND A.defense = B.defense
);

➡️ A이고 B에는 속하지 않는 값을 구하는 방법으로 WHERE절에 NOT EXISTS 사용

(참고)

 💡서브쿼리에서 SELECT 1을 사용하는 것은 성능 최적화 관점에서 흔히 사용되는 방법

 💡여기서 서브쿼리의 사용 목적은 실제 데이터를 가져오는 것이 아니라 값이 존재하는지 확인만 하는 것이다.