2024. 2. 9. 20:57ㆍSQL
합집합, 교집합, 차집합(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을 사용하는 것은 성능 최적화 관점에서 흔히 사용되는 방법
💡여기서 서브쿼리의 사용 목적은 실제 데이터를 가져오는 것이 아니라 값이 존재하는지 확인만 하는 것이다.
'SQL' 카테고리의 다른 글
[패스트캠퍼스] SQL로 시작하는 데이터 분석 첫걸음 강의 학습 후기 (1) | 2024.02.28 |
---|---|
[MySQL] UTC 시간대, date_format() 결과값이 다른 이유 (0) | 2024.02.21 |
[SQL] GROUP BY와 HAVING 그리고 그룹 함수 (1) | 2024.02.06 |
[SQL] 데이터, 데이터베이스 그리고 DBMS (0) | 2024.01.25 |
[SQL] SQLD 자격시험 (1) | 2024.01.25 |