본문 바로가기
SQL

[SQL] 데이터분석가 입문 필수 SQL 부트캠프 (7) 집합 연산자 UNION, UNION ALL + MINUS(EXCEPT), INTERSECT

by 모닥불🔥 2024. 3. 17.

강의는 메타코드에서 구매 가능하다: https://mcode.co.kr/kor/

오늘도 역시 부트캠프 강의 정리이다. 이번에는 집합 연산자를 정리하려고 하는데, 강의에서는 실무에서 자주 사용되는 UNION과 UNION ALL만 가르쳐 줬지만 내가 SQLD(SQL 개발자)를 공부하면서 알게 된 MINUS(EXCEPT), INTERSECT도 함께 설명할 것이다.


🔥 UNION

UNION은 두 테이블이 있을 때 중복 없이 표를 세로로 합친다. 여기에서 중요한 것은 합치는 컬럼의 수가 같아야 하고, 데이터 타입도 같아야 한다는 것이다. 위 예에서는 ex3과 ex4의 id를 합쳤다.

 

[EX3]

ID NAME AGE
1 이상훈 34
2 박상훈 30
3 최상훈 20

 

[EX4]

ID REGION
1 서울
4 대구
5 부산

 

위 두 표에서 ID를 UNION하면 1, 2, 3 아래에 1, 4, 5가 중복 없이 합쳐지므로, 1, 2, 3, 4, 5만 남는다.

	SELECT id
	FROM ex3
UNION
	SELECT id
	FROM ex4;
ID
1
2
3
4
5

🔥  UNION ALL

UNION ALL은 UNION처럼 동일한 개수와 데이터타입의 컬럼을 세로로 합치는데, 중복을 허용해서 합친다. 위 EX3과 EX4의 ID 컬럼을 UNION ALL로 합치면 중복값인 1도 그대로 표시되므로 아래와 같은 결과가 나온다.

	SELECT id
	FROM ex3
UNION ALL
	SELECT id
	FROM ex4;
ID
1
2
3
1
4
5

🔥  MINUS(EXCEPT)

MINUS 또는 EXCEPT는 차집합을 의미한다. MINUS는 오라클에서, EXCEPT는 SQL-서버나 MYSQL등에서 사용되는 차집합 구문이다. 왼쪽 표에서, 오른쪽 표와 겹치는 부분을 제외한 결과를 출력한다. 좌측 표에서 1, 2, 3 중 우측 표와 겹치는 부분은 1 밖에 없기 때문에 2와 3이 남게 된다. 

	SELECT id
	FROM ex3
EXCEPT
	SELECT id
	FROM ex4;
ID
2
3

 

뭔가 어디서 본 것 같은데...? 하면 정답이다. 지난 시간에 설명했던 LEFT OUTER JOIN에서 교집합을 제외하고 좌측 테이블에만 있는 값을 남긴다고 했었다. 해당 논리구조와 유사하다.

SELECT ID
FROM EX3
LEFT JOIN EX4
ON EX3.ID = EX4.ID
WHERE EX4.ID IS NULL;

🔥  INTERSECT

INTERSECT는 오라클의 집합 연산자로, 교집합을 의미한다. MYSQL에서는 지원하지 않는다. 대신 교집합을 의미하므로 INNER JOIN을 사용해 동일한 기능을 구현할 수 있다.

	SELECT id
	FROM ex3
INTERSECT
	SELECT id
	FROM ex4;
SELECT ID
FROM EX3
INNER JOIN EX4
ON EX3.ID = EX4.ID;
ID
1

 

요렇게 집합 연산자 정리도 끝~ 다음 시간부터는 WINDOW 함수를 정리할 예정이다! 끝나간다 파이팅🙆🏻‍♀️🔥🔥