728x90
반응형
이번 포스트에서는 데이터베이스의 문법 중 집합 연산자에 대해 알아보겠습니다.
현재 사용중인 마이크로소프트 사의 DBMS는 관계형 데이터베이스에 속하는 DBMS입니다.
여기서 관계형 데이터베이스란, 데이터 테이블을 하나의 집합으로서 다루는 DB를 일컫습니다.
집합으로 다룬게 되면 데이터 테이블에 수학에서의 집합 연산자를 적용할 수 있습니다.
1) 합집합(or)
1 - 1) 일반적인 합집합 : UNION
-- [평균 연봉이 300000 이상이거나] 또는 [12월에 태어난] 선수들의 playerID
-- UNION 연산(중복제거), 기본적으로 중복되는 값을 제거함
SELECT playerID
FROM salaries
GROUP BY playerID
HAVING AVG(salary) >= 300000
UNION
SELECT playerID
FROM players
WHERE birthMonth = 12
ORDER BY playerID;
UNION 연산자의 경우, 수학에서의 합집합처럼 동작하여 중복을 제거하고 두 집합의 값을 반환합니다.
따라서 위 쿼리의 실행 결과는 다음과 같습니다.

1 - 2) 중복을 포함하는 합집합 : UNION ALL
-- [평균 연봉이 300000 이상이거나] 또는 [12월에 태어난] 선수들의 playerID
-- UNION을 하되, ALL을 수식하여 중복을 허용함
-- 추가적으로 UNION을 사용하면 반드시 ORDER BY는 뒤에 위치해야 한다
SELECT playerID
FROM salaries
GROUP BY playerID
HAVING AVG(salary) >= 300000
UNION ALL
SELECT playerID
FROM players
WHERE birthMonth = 12
ORDER BY playerID;
UNION ALL 연산자의 경우, 합집합으로 동작하지만 중복을 포함하여 두 집합의 값을 반환합니다.
쿼리의 실행 결과는 다음과 같습니다.

또 일반적으로 집합 연산자를 사용하면 정렬하는 ORDER BY 연산자는 쿼리에서 뒤에 작성해야 합니다.
2) 교집합(and) : INTERSECT
-- [평균 연봉이 300000 이상]이면서 [12월에 태어난] 선수들의 playerID
-- INTERSECT : 양쪽 모두에서 포함된 행을 검색
SELECT playerID
FROM salaries
GROUP BY playerID
HAVING AVG(salary) >= 300000
INTERSECT
SELECT playerID
FROM players
WHERE birthMonth = 12
ORDER BY playerID;
INTERSECT 연산자는 수학의 교집합처럼 두 데이터 테이블에 모두 포함된 데이터들을 가져옵니다
위 쿼리의 실행 결과는 다음과 같습니다.

3) 차집합(minus) : EXCEPT
-- [평균 연봉이 300000 이상인] 선수들의 PlayerID에서 [12월에 태어난] 선수들의 playerID를 제외
-- MINUS : 첫 번째 검색 결과에서 두 번째 검색 결과를 제외한 나머지를 검색
SELECT playerID
FROM salaries
GROUP BY playerID
HAVING AVG(salary) >= 300000
EXCEPT
SELECT playerID
FROM players
WHERE birthMonth = 12
ORDER BY playerID;
EXCEPT 연산자는 첫 번째 테이블의 검색 결과에서 두 번째 테이블의 검색 결과를 뺀 결과를 리턴합니다.
수학에서의 차집합처럼 동작한다고 생각하시면 됩니다.
위 쿼리의 실행 결과는 다음과 같습니다.

728x90
반응형
'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (2) 데이터베이스' 카테고리의 다른 글
| SQL (15) - TRANSACTION (0) | 2025.02.18 |
|---|---|
| SQL (14) - JOIN (0) | 2025.02.17 |
| SQL (12) - INDEX (0) | 2025.02.17 |
| SQL (11) - 정규화 (0) | 2025.02.12 |
| SQL (10) - DDL (0) | 2025.02.12 |